コード例 #1
0
        private void SendChunkDataTo(EndPoint ep, GenericMessage msg)
        {
            var chp   = new ChunkPos((int)msg.ReadSignedInteger(), (int)msg.ReadSignedInteger());
            var chunk = _world.GetChunk(chp);

            if (!chunk.HasData)
            {
                _world.LoadChunk(chp);
            }

            var raw = chunk.GetRaw();

            var m = new GenericMessage();

            m.WriteUnsignedInteger(1);
            m.WriteSignedInteger((uint)chp.x);
            m.WriteSignedInteger((uint)chp.z);

            var data = new byte[raw.Length];

            Buffer.BlockCopy(raw, 0, data, 0, data.Length);

            m.WriteUnsignedInteger((uint)data.Length);
            m.WriteByteArray(data);

            _server.SendToAsync(ep, m);
        }
コード例 #2
0
        static void Main(string[] args)
        {
            using (var server = new FeatherTcpServer <GenericMessage>()) {
                // Watch for when clients connect
                server.OnClientConnected += (endPoint) => {
                    Console.WriteLine($"{endPoint} connected.");
                };

                // Watch for when clients disconnect
                server.OnClientDisconnected += (endPoint, reason) => {
                    Console.WriteLine($"{endPoint} disconnected.");
                };

                // Watch for messages to arrive
                server.OnMessageReceived += async(endPoint, message) => {
                    // Read parameters in the same order they were written
                    var name = message.ReadString();
                    var body = message.ReadString();
                    Console.WriteLine($"{name}> {body}");

                    // Forward message on to all clients (including the sender, for confirmation)
                    foreach (var remoteEndPoint in server.RemoteEndPoints)
                    {
                        await server.SendToAsync(remoteEndPoint, message);
                    }
                };

                // Listen for inbound connections
                server.Listen(12345);

                // Wait for key press to shutdown
                Console.WriteLine("Server now listening for connections on port 12345. Press any key to halt.");
                Console.ReadKey(true);
            }
        }
コード例 #3
0
        public ServerHandler()
        {
            _world = new WorldServer();

            Thread tickThread = new Thread(TickThread);

            tickThread.Start();

            _server = new FeatherTcpServer <GenericMessage>();

            _server.OnClientConnected += (endPoint) =>
            {
                if (!_entities.Keys.Contains(endPoint))
                {
                    var e = new Entity();

                    _entities.TryAdd(endPoint, e);

                    var gm = new GenericMessage();

                    gm.WriteUnsignedInteger(0);
                    gm.WriteGuid(e.ID);

                    _server.SendToAsync(endPoint, gm);
                }

                Console.WriteLine($"{endPoint} connected.");
            };

            _server.OnClientDisconnected += (endPoint, reason) =>
            {
                _entities.TryRemove(endPoint, out var removed);
                Console.WriteLine($"{endPoint} disconnected.");
            };

            _server.OnMessageReceived += (endPoint, message) =>
            {
                var id = message.ReadUnsignedInteger();

                if (_entities.TryGetValue(endPoint, out var entity))
                {
                    if (id == 1)
                    {
                        ProcessPlayerData(entity, message);
                    }
                    if (id == 2)
                    {
                        SendChunkDataTo(endPoint, message);
                    }
                }
            };

            _server.Listen(25566);

            Console.WriteLine("Server now listening for connections on port 25566. Press any key to halt.");
            Console.ReadKey(true);

            _server.Dispose();
        }
コード例 #4
0
        public async void SendAsync()
        {
            var      block  = new AutoResetEvent(false);
            EndPoint remote = null;

            using (var server = new FeatherTcpServer <BinaryMessage>()) {
                server.Listen(13001);
                server.OnClientConnected += (endPoint) => {
                    remote = endPoint;
                    block.Set();
                };

                using (var socket = new Socket(SocketType.Stream, ProtocolType.Tcp)) {
                    socket.NoDelay = true;
                    socket.Connect(new IPEndPoint(IPAddress.Loopback, 13001));

                    block.WaitOne(1000);
                    Assert.NotNull(remote);
                    await server.SendToAsync(remote, TestMessage1);

                    await server.SendToAsync(remote, TestMessage2);

                    var buffer = new byte[TestWire1.Length];
                    var pos    = 0;
                    while (pos < buffer.Length)
                    {
                        var len = socket.Receive(buffer, pos, TestWire1.Length - pos, SocketFlags.None);
                        pos += len;
                    }
                    Assert.Equal(TestWire1, buffer);

                    buffer = new byte[TestWire2.Length];
                    pos    = 0;
                    while (pos < buffer.Length)
                    {
                        var len = socket.Receive(buffer, pos, TestWire2.Length - pos, SocketFlags.None);
                        pos += len;
                    }
                    Assert.Equal(TestWire2, buffer);
                }
            }
        }