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); }
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); } }
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(); }
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); } } }