示例#1
0
        public void Test()
        {
            byte[] encryptionKey = new byte[16];
            Random.NextBytes(encryptionKey);

            Console.WriteLine("Starting server");
            DoubleServerHandler serverHandler = new DoubleServerHandler();
            DoubleServer        server        = new DoubleServer(serverHandler, 1, 1, Port);

            serverHandler.Server = server;

            Console.WriteLine("Starting client");
            DoubleClientHandler clientHandler = new DoubleClientHandler();
            DoubleClient        client        = new DoubleClient(clientHandler, encryptionKey, encryptionKey, Ip, Port);

            clientHandler.Client = client;
            client.Start();

            lock (client) {
                clientHandler.MaySend = true;
                Monitor.Pulse(client);
                Console.WriteLine("Main thread waiting");
                Monitor.Wait(client);
            }

            Console.WriteLine("Closing client");
            client.Close();
            Console.WriteLine("Closing server");
            server.Close();
        }
示例#2
0
 /// <summary>
 /// Deinitializes the networking, kicking all connected clients and stopping the server.
 /// </summary>
 public static void Stop()
 {
     Assert.IsNotNull(_server, "The NetworkServer is not initialized.");
     UdpPayload = null;
     _tickingThread?.Stop();
     _tickingThread = null;
     NetworkUtils.GlobalBaseTimestamp = -1;
     Array.Clear(TcpHandlers, 0, TcpHandlers.Length);
     _resettingByteBuffer = null;
     _clients             = null;
     _handler             = null;
     _server.Close();
     _server = null;
 }
示例#3
0
        /// <summary>
        /// Initializes the networking and starts accepting connections.
        /// </summary>
        public static void Start()
        {
            Assert.IsNull(_server, "The NetworkServer is already initialized.");

            NetworkUtils.GlobalBaseTimestamp = DoubleProtocol.TimeMillis;
            _resettingByteBuffer             = new ResettingBitBuffer(DoubleProtocol.TcpBufferArraySize);
            _clients = new HashSet <NetworkServerClient>();
            _handler = new DoubleServerHandler();
            _server  = new DoubleServer(_handler, NetworkUtils.MaxBotCount,
                                        (NetworkUtils.MaxBotCount * 3 + 1) / 2, NetworkUtils.Port);

            _tickingThread = new TickingThread(NetworkUtils.UdpSendFrequency, () => {
                lock (UdpPayloadLock) {
                    if (_udpPayload != null && _udpPayload.Length != 0)
                    {
                        foreach (NetworkServerClient serverClient in _clients)
                        {
                            _server.SendUdp(serverClient.DoubleClient, buffer => buffer.Write(UdpPayload));
                        }
                    }
                }
            });
        }
示例#4
0
        public Program(int port)
        {
            _colors.Enqueue(0);
            _colors.Enqueue(1);
            _colors.Enqueue(2);

            _server = new DoubleServer(this, 3, 3, port);

            _senderThread = new Thread(() => {
                try {
                    while (true)
                    {
                        lock (_server) {
                            byte[] data;
                            using (_sendBuffer) {
                                _sendBuffer.WriteBits((ulong)_players.Count, 2);
                                foreach (Player player in _players)
                                {
                                    _sendBuffer.WriteBits(player.Id, 2);
                                    _sendBuffer.WriteBits(player.X, 4);
                                    _sendBuffer.WriteBits(player.Y, 4);
                                }
                                data = _sendBuffer.ReadBytes();
                            }

                            foreach (Player player in _players)
                            {
                                _server.SendUdp(player.ServerClient, buffer => buffer.Write(data));
                            }
                        }
                        Thread.Sleep(1000 / UpdateSendFrequency);
                    }
                } catch (ThreadInterruptedException) {
                }
            });
            _senderThread.Start();
        }