public async Task SimpleNamedPipes() { Func <MemoryStream> memoryStreamFactory = () => new MemoryStream(); string pipeName = Guid.NewGuid().ToString(); using (var clientPipe = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.Asynchronous)) using (var serverPipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous)) { Task clientConnectTask = clientPipe.ConnectAsync(); Task serverConnectTask = serverPipe.WaitForConnectionAsync(); Task.WaitAll(clientConnectTask, serverConnectTask); var webSocketClient = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, clientPipe, TimeSpan.Zero, null, false, true, null); var webSocketServer = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, serverPipe, TimeSpan.Zero, null, false, false, null); CancellationTokenSource tokenSource = new CancellationTokenSource(); var clientReceiveTask = Task.Run <string[]>(() => ReceiveClient(webSocketClient, tokenSource.Token)); var serverReceiveTask = Task.Run(() => ReceiveServer(webSocketServer, tokenSource.Token)); ArraySegment <byte> message1 = GetBuffer("Hi"); ArraySegment <byte> message2 = GetBuffer("There"); await webSocketClient.SendAsync(message1, WebSocketMessageType.Binary, true, tokenSource.Token); await webSocketClient.SendAsync(message2, WebSocketMessageType.Binary, true, tokenSource.Token); await webSocketClient.CloseAsync(WebSocketCloseStatus.NormalClosure, null, tokenSource.Token); string[] replies = await clientReceiveTask; foreach (string reply in replies) { Console.WriteLine(reply); } } }
private async Task PingForever() { try { while (!_cancellationToken.IsCancellationRequested) { await Task.Delay(_keepAliveInterval, _cancellationToken); if (_webSocket.State != WebSocketState.Open) { break; } if (_pingSentTicks != 0) { await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, $"No Pong message received in response to a Ping after KeepAliveInterval {_keepAliveInterval}", _cancellationToken); break; } if (!_cancellationToken.IsCancellationRequested) { _pingSentTicks = _stopwatch.Elapsed.Ticks; ArraySegment <byte> buffer = new ArraySegment <byte>(BitConverter.GetBytes(_pingSentTicks)); await SendPing(buffer, _cancellationToken); } } } catch (OperationCanceledException) { // normal, do nothing } }
public async Task SimpleSend() { Func <MemoryStream> memoryStreamFactory = () => new MemoryStream(); var theInternet = new TheInternet(); var webSocketClient = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, theInternet.ClientNetworkStream, TimeSpan.Zero, null, false, true, null); var webSocketServer = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, theInternet.ServerNetworkStream, TimeSpan.Zero, null, false, false, null); CancellationTokenSource tokenSource = new CancellationTokenSource(); var clientReceiveTask = Task.Run <string[]>(() => ReceiveClient(webSocketClient, tokenSource.Token)); var serverReceiveTask = Task.Run(() => ReceiveServer(webSocketServer, tokenSource.Token)); ArraySegment <byte> message1 = GetBuffer("Hi"); ArraySegment <byte> message2 = GetBuffer("There"); await webSocketClient.SendAsync(message1, WebSocketMessageType.Binary, true, tokenSource.Token); await webSocketClient.SendAsync(message2, WebSocketMessageType.Binary, true, tokenSource.Token); await webSocketClient.CloseAsync(WebSocketCloseStatus.NormalClosure, null, tokenSource.Token); string[] replies = await clientReceiveTask; foreach (string reply in replies) { Console.WriteLine(reply); } }
public async Task ReceiveBufferTooSmallToFitWebsocketFrameTest() { Func <MemoryStream> memoryStreamFactory = () => new MemoryStream(); string pipeName = Guid.NewGuid().ToString(); using (var clientPipe = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.Asynchronous)) using (var serverPipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous)) { Task clientConnectTask = clientPipe.ConnectAsync(); Task serverConnectTask = serverPipe.WaitForConnectionAsync(); Task.WaitAll(clientConnectTask, serverConnectTask); var webSocketClient = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, clientPipe, TimeSpan.Zero, null, false, true, null); var webSocketServer = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, serverPipe, TimeSpan.Zero, null, false, false, null); CancellationTokenSource tokenSource = new CancellationTokenSource(); var clientReceiveTask = Task.Run <string[]>(() => ReceiveClient(webSocketClient, tokenSource.Token)); // here we use a server with a buffer size of 10 which is smaller than the websocket frame var serverReceiveTask = Task.Run(() => ReceiveServer(webSocketServer, 10, tokenSource.Token)); ArraySegment <byte> message1 = GetBuffer("This is a test message"); await webSocketClient.SendAsync(message1, WebSocketMessageType.Binary, true, tokenSource.Token); await webSocketClient.CloseAsync(WebSocketCloseStatus.NormalClosure, null, tokenSource.Token); await serverReceiveTask; string[] replies = await clientReceiveTask; foreach (string reply in replies) { Console.WriteLine(reply); } Assert.Equal(3, replies.Length); Assert.Equal("Server: This is ", replies[0]); Assert.Equal("Server: a test m", replies[1]); Assert.Equal("Server: essage", replies[2]); } }