예제 #1
0
        private static async Task Execute(bool listen, CancellationToken token)
        {
            try
            {
                using (var socket = new ClientWebSocket())
                {
                    //socket.Options.KeepAliveInterval = TimeSpan.FromSeconds(10);
                    var uri = new Uri("ws://127.0.0.1:5001");
                    WriteStatus($"connecting to {uri}...");
                    await socket.ConnectAsync(uri, token);

                    WriteStatus("connected");
                    int clientNumber = Interlocked.Increment(ref Program.clientNumber);
                    var named        = new ClientWebSocketWithIdentity(socket, clientNumber);
                    lock (clients)
                    {
                        clients.Add(named);
                    }
                    try
                    {
                        await ReceiveLoop(named, token);
                    }
                    finally
                    {
                        lock (clients)
                        {
                            clients.Remove(named);
                        }
                    }

                    //int count = 0, clientNumber = Interlocked.Increment(ref Program.clientNumber);
                    // if (listen) Task.Run(() => ReceiveLoop(socket, token)).FireOrForget();
                    //do
                    //{
                    //    string msg = $"hello from client {clientNumber} to server, message {++count}";
                    //    int len = Encoding.ASCII.GetBytes(msg, 0, msg.Length, buffer, 0);

                    //    WriteStatus("sending...");
                    //    await socket.SendAsync(new ArraySegment<byte>(buffer, 0, len), WebSocketMessageType.Text, true, token);
                    //    WriteStatus("sent...");

                    //    await Task.Delay(5000, token);
                    //} while (!token.IsCancellationRequested);
                }
            }
            catch (Exception ex)
            {
                WriteStatus(ex.GetType().Name);
                WriteStatus(ex.Message);
            }
        }
예제 #2
0
        private static void ClientChannelReceiveMessages(ClientWebSocketWithIdentity named)
        {
            var socket = (WebSocketConnection)named.Socket;

            socket.TextAsync += msg =>
            {
                if (logging)
                {
                    var message = msg.GetText();
                    Console.WriteLine($"client {named.Id} received text, {msg.GetPayloadLength()} bytes, final: {msg.IsFinal}: {message}");
                }
                return(null);
            };
        }
예제 #3
0
        private static async Task ClientReceiveLoop(ClientWebSocketWithIdentity named, CancellationToken token)
        {
            var socket = (ClientWebSocket)named.Socket;
            var buffer = new byte[2048];

            while (!token.IsCancellationRequested)
            {
                var result = await socket.ReceiveAsync(new ArraySegment <byte>(buffer, 0, buffer.Length), token);

                if (logging)
                {
                    var message = encoding.GetString(buffer, 0, result.Count);
                    Console.WriteLine($"client {named.Id} received {result.MessageType}, {result.Count} bytes, final: {result.EndOfMessage}: {message}");
                }
            }
        }
예제 #4
0
        private static async Task Execute(bool listen, CancellationToken token)
        {
            try
            {
                using (var socket = new ClientWebSocket())
                {
                    var uri = new Uri("ws://127.0.0.1:5001");
                    WriteStatus($"connecting to {uri}...");
                    await socket.ConnectAsync(uri, token);

                    WriteStatus("connected");
                    int clientNumber = Interlocked.Increment(ref Program.clientNumber);
                    var named        = new ClientWebSocketWithIdentity(socket, clientNumber);
                    lock (clients)
                    {
                        clients.Add(named);
                    }
                    try
                    {
                        await ClientReceiveLoop(named, token);
                    }
                    finally
                    {
                        lock (clients)
                        {
                            clients.Remove(named);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                WriteStatus(ex.GetType().Name);
                WriteStatus(ex.Message);
            }
        }
예제 #5
0
        private static async Task ExecuteChannel(bool listen)
        {
            try
            {
                const string uri = "ws://127.0.0.1:5001";
                WriteStatus($"connecting to {uri}...");

                var socket = await WebSocketConnection.ConnectAsync(uri);

                WriteStatus("connected");
                int clientNumber = Interlocked.Increment(ref Program.clientNumber);
                var named        = new ClientWebSocketWithIdentity(socket, clientNumber);
                lock (clients)
                {
                    clients.Add(named);
                }
                ClientChannelReceiveMessages(named);
            }
            catch (Exception ex)
            {
                WriteStatus(ex.GetType().Name);
                WriteStatus(ex.Message);
            }
        }