static async Task Main(string[] args) { var server = new WebSocketEchoServer(8888); var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(30)); var client = new WebSocketClient(new Uri("ws://localhost:8888")); client.ConnectionOpened.SelectMany(OnConnectionOpened).Subscribe(); client.MessageReceived.Subscribe(OnMessageReceived); client.ErrorOccured.Subscribe(OnErrorOccured); client.ConnectionClosed.Subscribe(OnConnectionClosed); var cts2 = new CancellationTokenSource(); cts2.CancelAfter(TimeSpan.FromSeconds(20)); await Task.WhenAll(server.Start(cts.Token), client.Connect(cts2.Token)); await client.DisposeAsync(); Console.Read(); }
public void TestLotsOfMessages() { ObjectPool <byte[]> pool = new ObjectPool <byte[]>(() => { return(new byte[1024]); }); WebSocketEchoServer server = new WebSocketEchoServer(pool); try { server.Start(); BlockingCollection <object> blockingCollection = new BlockingCollection <object>(); ClientSockNetChannel client = (ClientSockNetChannel)SockNetClient.Create(server.Endpoint, ClientSockNetChannel.DefaultNoDelay, ClientSockNetChannel.DefaultTtl, pool) .AddModule(new WebSocketClientSockNetChannelModule("/", "localhost", (ISockNetChannel sockNetClient) => { blockingCollection.Add(true); })); client.Connect().WaitForValue(TimeSpan.FromSeconds(5)); object currentObject; Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue((bool)currentObject); client.Pipe.AddIncomingLast <WebSocketFrame>((ISockNetChannel sockNetClient, ref WebSocketFrame data) => { blockingCollection.Add(data); }); byte[] randomData = new byte[2000]; new Random(GetHashCode() ^ DateTime.Now.Millisecond).NextBytes(randomData); for (int i = 0; i < 1000; i++) { client.Send(WebSocketFrame.CreateBinaryFrame(randomData, false)); } int receivedMessages = 0; for (int i = 0; i < 1000; i++) { if (receivedMessages < 1000 && blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)) { receivedMessages++; } else { break; } } Assert.AreEqual(1000, receivedMessages); client.Disconnect().WaitForValue(TimeSpan.FromSeconds(5)); } finally { server.Stop(); } }
public void TestContinuationEchoWithMask() { ObjectPool <byte[]> pool = new ObjectPool <byte[]>(() => { return(new byte[1024]); }); WebSocketEchoServer server = new WebSocketEchoServer(pool); try { server.Start(false, true); BlockingCollection <object> blockingCollection = new BlockingCollection <object>(); ClientSockNetChannel client = (ClientSockNetChannel)SockNetClient.Create(server.Endpoint, ClientSockNetChannel.DefaultNoDelay, ClientSockNetChannel.DefaultTtl, pool) .AddModule(new WebSocketClientSockNetChannelModule("/", "localhost", (ISockNetChannel sockNetClient) => { blockingCollection.Add(true); })); client.Connect().WaitForValue(TimeSpan.FromSeconds(5)); object currentObject; Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue((bool)currentObject); client.Pipe.AddIncomingLast <WebSocketFrame>((ISockNetChannel sockNetClient, ref WebSocketFrame data) => { blockingCollection.Add(data); }); Random rand = new Random(this.GetHashCode() ^ DateTime.Now.Millisecond); byte[] rawData = new byte[rand.Next(5000, 10000)]; rand.NextBytes(rawData); client.Send(WebSocketFrame.CreateBinaryFrame(rawData, true)); Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue(currentObject is WebSocketFrame); AreArraysEqual(rawData, ((WebSocketFrame)currentObject).Data); client.Disconnect().WaitForValue(TimeSpan.FromSeconds(5)); } finally { server.Stop(); } }
public void TestEchoWithMaskWithSsl() { ObjectPool <byte[]> pool = new ObjectPool <byte[]>(() => { return(new byte[1024]); }); WebSocketEchoServer server = new WebSocketEchoServer(pool); try { server.Start(true); BlockingCollection <object> blockingCollection = new BlockingCollection <object>(); ClientSockNetChannel client = (ClientSockNetChannel)SockNetClient.Create(server.Endpoint, ClientSockNetChannel.DefaultNoDelay, ClientSockNetChannel.DefaultTtl, pool) .AddModule(new WebSocketClientSockNetChannelModule("/", "localhost", (ISockNetChannel sockNetClient) => { blockingCollection.Add(true); })); client.ConnectWithTLS((object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => { return(true); }) .WaitForValue(TimeSpan.FromSeconds(5)); object currentObject; Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue((bool)currentObject); client.Pipe.AddIncomingLast <WebSocketFrame>((ISockNetChannel sockNetClient, ref WebSocketFrame data) => { blockingCollection.Add(data); }); client.Send(WebSocketFrame.CreateTextFrame("some test", true)); Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue(currentObject is WebSocketFrame); Assert.AreEqual("some test", ((WebSocketFrame)currentObject).DataAsString); Console.WriteLine("Got response: \n" + ((WebSocketFrame)currentObject).DataAsString); client.Disconnect().WaitForValue(TimeSpan.FromSeconds(5)); } finally { server.Stop(); } }
static async Task Main(string[] args) { var server = new WebSocketEchoServer(8888); var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromMinutes(1)); Task.Run(() => server.Start(cts.Token), cts.Token); var client = new WebSocketClient(new Uri("ws://localhost:8888")); client.ConnectionOpened.SelectMany(OnConnectionOpened).Subscribe(); client.MessageReceived.Subscribe(OnMessageReceived); client.ErrorOccured.Subscribe(OnErrorOccured); client.ConnectionClosed.Subscribe(OnConnectionClosed); await client.Connect(); Console.Read(); }
public void TestIncompleteBufferParsing() { ObjectPool <byte[]> pool = new ObjectPool <byte[]>(() => { return(new byte[1024]); }); WebSocketEchoServer server = new WebSocketEchoServer(pool); try { server.Start(); BlockingCollection <object> blockingCollection = new BlockingCollection <object>(); ClientSockNetChannel client = (ClientSockNetChannel)SockNetClient.Create(server.Endpoint, ClientSockNetChannel.DefaultNoDelay, ClientSockNetChannel.DefaultTtl, pool) .AddModule(new WebSocketClientSockNetChannelModule("/", "localhost", (ISockNetChannel sockNetClient) => { blockingCollection.Add(true); })); client.Connect().WaitForValue(TimeSpan.FromSeconds(5)); object currentObject; Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue((bool)currentObject); client.Pipe.AddIncomingLast <WebSocketFrame>((ISockNetChannel sockNetClient, ref WebSocketFrame data) => { blockingCollection.Add(data); }); string body1 = new string('A', 4913) + "X"; WebSocketFrame frame1 = WebSocketFrame.CreateTextFrame( "STS/1.0 200 OK" + "\r\n" + "s:7R" + "\r\n" + "n:bytes 0-4915/5000" + "\r\n" + "l:4916" + "\r\n" + "" + "\r\n" + body1 + "\r\n", false); client.Send(frame1); string body2 = new string('B', 81) + "Y"; WebSocketFrame frame2 = WebSocketFrame.CreateTextFrame( "STS/1.0 200 OK" + "\r\n" + "s:7R" + "\r\n" + "n:bytes 4916-4999/5000" + "\r\n" + "l:84" + "\r\n" + "" + "\r\n" + body2 + "\r\n", false); client.Send(frame2); Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue(currentObject is WebSocketFrame); Assert.AreEqual(frame1.DataAsString, ((WebSocketFrame)currentObject).DataAsString); Console.WriteLine("Got response: \n" + ((WebSocketFrame)currentObject).DataAsString); Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue(currentObject is WebSocketFrame); Assert.AreEqual(frame2.DataAsString, ((WebSocketFrame)currentObject).DataAsString); Console.WriteLine("Got response: \n" + ((WebSocketFrame)currentObject).DataAsString); client.Disconnect().WaitForValue(TimeSpan.FromSeconds(5)); } finally { server.Stop(); } }
public void TestSmallMessagesInParallel() { ObjectPool <byte[]> pool = new ObjectPool <byte[]>(() => { return(new byte[1024]); }); Random random = new Random(this.GetHashCode() ^ DateTime.Now.Millisecond); WebSocketEchoServer server = new WebSocketEchoServer(pool); try { server.Start(); BlockingCollection <object> blockingCollection = new BlockingCollection <object>(); ClientSockNetChannel client = (ClientSockNetChannel)SockNetClient.Create(server.Endpoint, ClientSockNetChannel.DefaultNoDelay, ClientSockNetChannel.DefaultTtl, pool) .AddModule(new WebSocketClientSockNetChannelModule("/", "localhost", (ISockNetChannel sockNetClient) => { blockingCollection.Add(true); })); client.Connect().WaitForValue(TimeSpan.FromSeconds(5)); object currentObject; Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue((bool)currentObject); client.Pipe.AddIncomingLast <WebSocketFrame>((ISockNetChannel sockNetClient, ref WebSocketFrame data) => { blockingCollection.Add(data); }); int numberOfMessages = 100; byte[][] expectedResults = new byte[numberOfMessages][]; for (int i = 0; i < numberOfMessages; i++) { ThreadPool.QueueUserWorkItem((object state) => { int index = (int)state; byte[] messageData = new byte[random.Next(50, 100)]; random.NextBytes(messageData); messageData[0] = (byte)(index >> 0); messageData[1] = (byte)(index >> 8); messageData[2] = (byte)(index >> 16); messageData[3] = (byte)(index >> 24); expectedResults[index] = messageData; client.Send(WebSocketFrame.CreateBinaryFrame(messageData)); // simulate GC if (index % Math.Max(numberOfMessages / 10, 1) == 0) { GC.Collect(); GC.WaitForPendingFinalizers(); } }, i); } for (int i = 0; i < numberOfMessages; i++) { Assert.IsTrue(blockingCollection.TryTake(out currentObject, DEFAULT_ASYNC_TIMEOUT)); Assert.IsTrue(currentObject is WebSocketFrame); // simulate GC if (i % Math.Max(numberOfMessages / 10, 1) == 0) { GC.Collect(); GC.WaitForPendingFinalizers(); } byte[] incomingData = ((WebSocketFrame)currentObject).Data; int index = 0; index |= incomingData[0] << 0; index |= incomingData[1] << 8; index |= incomingData[2] << 16; index |= incomingData[3] << 24; Console.WriteLine(index); AreArraysEqual(expectedResults[index], incomingData); } client.Disconnect().WaitForValue(TimeSpan.FromSeconds(5)); } finally { server.Stop(); } }