如何在 C# 中为 clientwebsocket 设置侦听器?

尼迪
ClientWebSocket socket = new ClientWebSocket();
socket.ConnectAsync(new Uri(socketURL), CancellationToken.None);

我在 C# 中使用上面给定的代码创建了 ClientWebSocket。现在我想监听通过这个套接字接收到的数据。如何为此设置侦听器?

马吉德哈吉巴巴

使用await Task.WhenAll(Receive(socket ), Send(socket ));和定义以下内容:

static async Task Send(ClientWebSocket webSocket);
static async Task Receive(ClientWebSocket webSocket);

来自github 的示例:paulbatum/WebSocket-Samples

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Client
{
    class Client
    {
        private static object consoleLock = new object();
        private const int sendChunkSize = 256;
        private const int receiveChunkSize = 64;
        private const bool verbose = true;
        private static readonly TimeSpan delay = TimeSpan.FromMilliseconds(1000);

        static void Main(string[] args)
        {
            Thread.Sleep(1000);
            Connect("ws://localhost/wsDemo").Wait();
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        public static async Task Connect(string uri)
        {
            ClientWebSocket webSocket = null;

            try
            {
                webSocket = new ClientWebSocket();
                await webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);
                await Task.WhenAll(Receive(webSocket), Send(webSocket));
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: {0}", ex);
            }
            finally
            {
                if (webSocket != null)
                    webSocket.Dispose();
                Console.WriteLine();

                lock (consoleLock)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("WebSocket closed.");
                    Console.ResetColor();
                }
            }
        }

        private static async Task Send(ClientWebSocket webSocket)
        {
            var random = new Random();
            byte[] buffer = new byte[sendChunkSize];

            while (webSocket.State == WebSocketState.Open)
            {
                random.NextBytes(buffer);

                await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Binary, false, CancellationToken.None);
                LogStatus(false, buffer, buffer.Length);
   
                await Task.Delay(delay);
            }
        }

        private static async Task Receive(ClientWebSocket webSocket)
        {
            byte[] buffer = new byte[receiveChunkSize];
            while (webSocket.State == WebSocketState.Open)
            {                
                var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
                if (result.MessageType == WebSocketMessageType.Close)
                {
                    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                }
                else
                {
                    LogStatus(true, buffer, result.Count);
                }
            }
        }

        private static void LogStatus(bool receiving, byte[] buffer, int length)
        {
            lock (consoleLock)
            {
                Console.ForegroundColor = receiving ? ConsoleColor.Green : ConsoleColor.Gray;
                Console.WriteLine("{0} {1} bytes... ", receiving ? "Received" : "Sent", length);

                if (verbose)
                    Console.WriteLine(BitConverter.ToString(buffer, 0, length));

                Console.ResetColor();
            }
        }
    }

   
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Kotlin中为变量设置侦听器

如何从C#代码中的数据库跟踪侦听器中设置databaseInstanceName?

如何在RadioButton中设置侦听器-Android

如何在 BaseRecyclerAdapter 中设置 itemclick 侦听器

如何在Xamarin中设置onclick侦听器?

如何在Android中的片段中为按钮设置onclick侦听器

如何在Flutter中为Google Maps设置Map onClick侦听器?

Android:如何将侦听器设置为MenuButton?

如何在System.Net.WebSockets中的ClientWebSocket上设置ClientWebSocketOptions

如何在mapview上为当前位置图钉设置侦听器?

如何在Android中将多个Click侦听器设置为AutoCompleteTextView?

如何在recyclerView上为两个不同的事件设置侦听器?

如何在react js中的材料ui中的列表项上设置单击侦听器

如何在Android AutoCompleteTextview小部件中设置nextFocus侦听器

如何在jQuery中的复选框数组上设置侦听器?

如何在测试中的ApplicationEvent侦听器之前进行一些设置工作

如何在Polymer 2.0中的span元素上设置侦听器?

如何在FragmentPagerAdapter中设置菜单项侦听器(onMenuItemSelected)?

如何使用数据绑定将Click侦听器设置为LinearLayout

JavaFX:如何将侦听器设置为TabPane标头的onClick事件

JavaFX:如何将侦听器设置为TabPane标头的onClick事件

如何将事件侦听器回调设置为成员函数

如何将窗口调整大小事件侦听器值设置为 React State?

如何使用react-select为搜索输入更改设置事件侦听器?

如何将侦听器设置为MATLAB对象结构的字段

如何将焦点侦听器设置为edittext的中心

如何将选项卡侦听器设置为ActionBar

反应。如何在创建的侦听器中删除事件侦听器?

如何在我的自定义键盘中将动作侦听器设置为弹出式键盘...