public void ClientConnectedDisconnected() { var stage = 0; var block = new AutoResetEvent(false); using (var server = new FeatherTcpServer <BinaryMessage>()) { server.OnClientConnected += (endPoint) => { Assert.Equal(0, stage++); Assert.NotNull(endPoint); }; server.OnClientDisconnected += (endPoint, reason) => { Assert.Equal(1, stage++); Assert.NotNull(endPoint); block.Set(); }; server.Listen(13004); using (var socket = new Socket(SocketType.Stream, ProtocolType.Tcp)) { socket.Connect(new IPEndPoint(IPAddress.Loopback, 13004)); Thread.Sleep(10); } block.WaitOne(1000); Assert.Equal(2, stage); } }
public void Disconnect() { var block = new AutoResetEvent(false); EndPoint remote = null; using (var server = new FeatherTcpServer <BinaryMessage>()) { server.OnClientConnected += (endPoint) => { remote = endPoint; block.Set(); }; server.Listen(13003); using (var socket = new Socket(SocketType.Stream, ProtocolType.Tcp)) { socket.NoDelay = true; socket.Connect(new IPEndPoint(IPAddress.Loopback, 13003)); block.WaitOne(1000); Assert.NotNull(remote); server.Disconnect(remote); Assert.Throws <SocketException>(() => { for (var i = 0; i < 10; i++) { socket.Send(new byte[] { 0, 0 }); } }); Assert.False(socket.Connected); } } }
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 void Dispose() { var server = new FeatherTcpServer <BinaryMessage>(); Assert.False(server.IsDisposed); server.Listen(13007); Assert.False(server.IsDisposed); server.Dispose(); Assert.True(server.IsDisposed); }
public async Task Secure() { var state = 0; var block = new AutoResetEvent(false); var raw = File.ReadAllBytes("localhost.pfx"); var certificate = new X509Certificate2(raw, "test"); using (var server = new FeatherTcpServer <BinaryMessage>()) { server.OnMessageReceived += (endPoint, message) => { if (state == 0) { Assert.Equal(TestPayload1, message.Export().ToArray()); state++; } else if (state == 1) { Assert.Equal(TestPayload2, message.Export().ToArray()); state++; block.Set(); } else { throw new Exception(); } }; server.ListenSecure(13008, certificate); using (var client = new FeatherTcpClient <BinaryMessage>()) { await client.ConnectSecureAsync("localhost", 13008, "localhost", (object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) => { return(true); // Ignore that it's a self-signed cert }); await client.SendAsync(TestMessage1); await client.SendAsync(TestMessage2); block.WaitOne(1000); } } Assert.Equal(2, state); }
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); } } }
public void Receive() { var stage = 0; var block = new AutoResetEvent(false); using (var server = new FeatherTcpServer <BinaryMessage>()) { server.OnMessageReceived += (endpoint, message) => { if (stage == 0) { Assert.Equal(TestPayload1, message.Export().ToArray()); stage = 1; } else if (stage == 1) { Assert.Equal(TestPayload2, message.Export().ToArray()); stage = 2; block.Set(); } else { Assert.False(true); } }; server.Listen(13005); using (var socket = new Socket(SocketType.Stream, ProtocolType.Tcp)) { socket.NoDelay = true; socket.Connect(new IPEndPoint(IPAddress.Loopback, 13005)); Assert.True(socket.Connected); socket.Send(TestWire1); Thread.Sleep(10); socket.Send(TestWire2); block.WaitOne(1000); } } Assert.Equal(2, stage); }