C#版Websocket客户端实例

socket客户端接收帮助类代码,此代码仅为测试使用,代码格式并未

  1  public class SocketReceiveHelper
  2     {
  3         //初始化
  4         private static SocketReceiveHelper _ins;
  5         public static SocketReceiveHelper Ins => _ins ?? (_ins = new SocketReceiveHelper());
  6         //声明委托
  7         public delegate void MessageEventHandler(ClientWebSocket sender, string data, int deviceId);
  8         public delegate void ErrorEventHandler(ClientWebSocket sender, Exception ex, int deviceId);
  9         public delegate void OnOpenEventHandler(ClientWebSocket sender, EventArgs e, int deviceId);
 10         public delegate void CloseEventHandler(ClientWebSocket sender, EventArgs e, int deviceId);
 11         //定义委托事件,用于客户端接收信息后回调
 12         public event OnOpenEventHandler OnOpen;
 13         public event MessageEventHandler OnMessage;
 14         public event ErrorEventHandler OnError;
 15         public event CloseEventHandler OnClose;
 16 
 17 
 18         bool _isUserClose = false;//是否最后由用户手动关闭
 19         int _deviceId = default;//非必要参数
 20 
 21         public void StartSocketReceive()
 22         {
 23            //初始化客户端
 24             string wsUrl = "ws://192.168.4.115:8181";
 25             Uri _wbUri = new Uri(wsUrl);
 26             ClientWebSocket _ws = new ClientWebSocket();
 27 
 28             Task.Run(async () =>
 29             {
 30                 //此处个人理解建立连接时返回,因为还没有接收数据,当有数据发送过来的状态时,继续往下执行处理
 31                 if (_ws.State == WebSocketState.Connecting || _ws.State == WebSocketState.Open)
 32                     return;
 33                 string connectError = string.Empty;
 34                 try
 35                 {
 36                     _isUserClose = false;
 37                     // _ws.Options.SetRequestHeader("Authorization", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiY2xhaW0iOiJqaWRhZXJkZXZpY2UiLCJhdWQiOiJhcHAiLCJpYXQiOjE2NTA3NzA3NzJ9.k_k_C0Sf7tUqiuwx_DZzAIXz4h3S-wS0XoHfx1HQ8mU");
 38                     //开始对远程主机连接的异步请求。
 39                     await _ws.ConnectAsync(_wbUri, CancellationToken.None);
 40                     //建立请求后执行回调事件
 41                     if (OnOpen != null)
 42                         OnOpen(_ws, new EventArgs(), _deviceId);
 43 
 44                     List<byte> bs = new List<byte>();
 45                     var buffer = new byte[1024 * 4];
 46                     //接收连接的套接字发出的数据
 47                     WebSocketReceiveResult result = await _ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
 48                     //是否关闭
 49                     while (!result.CloseStatus.HasValue)
 50                     {
 51                         if (result.MessageType == WebSocketMessageType.Text)
 52                         {
 53                             bs.AddRange(buffer.Take(result.Count));
 54                             if (result.EndOfMessage)
 55                             {
 56                                 string userMsg = Encoding.UTF8.GetString(bs.ToArray(), 0, bs.Count);
 57                                 //接收消息后执行回调事件
 58                                 if (OnMessage != null)
 59                                     OnMessage(_ws, userMsg, _deviceId);
 60                                 bs = new List<byte>();
 61                             }
 62                         }
 63                         result = await _ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
 64                     }
 65                 }
 66                 catch (Exception exception)
 67                 {
 68                     if (OnError != null)
 69                         OnError(_ws, exception, _deviceId);
 70                 }
 71                 finally
 72                 {
 73                     if (!_isUserClose)
 74                     {
 75           
 76                             try
 77                             {
 78                                 string status = _ws.CloseStatusDescription + connectError;
 79                                 //关闭WebSocket(客户端发起)
 80                                  _ws.CloseAsync(_ws.CloseStatus.Value, status, CancellationToken.None);
 81                             }
 82                             catch (Exception exception)
 83                             {
 84                                 Console.WriteLine($"关闭WebSocket发生了错误:{exception}");
 85                             }
 86                             finally
 87                             {
 88                                 _ws.Abort();
 89                                 _ws.Dispose();
 90                                 if (OnClose != null)
 91                                     OnClose(_ws, new EventArgs(), _deviceId);
 92                             }
 93                
 94                     }
 95                 }
 96             });
 97 
 98         }
 99      
100     }

服务后台调用代码

 1         /// <summary>
 2         /// 给委托事件绑定回调方法
 3         /// </summary>
 4         private void BindSocketReceiveCallbackEvents()
 5         {
 6             SocketReceiveHelper wSocketClient = new SocketReceiveHelper();
 7 
 8             wSocketClient.OnOpen -= WSocketClient_OnOpen;
 9             wSocketClient.OnMessage -= WSocketClient_OnMessage;
10             wSocketClient.OnClose -= WSocketClient_OnClose;
11             wSocketClient.OnError -= WSocketClient_OnError;
12 
13             wSocketClient.OnOpen += WSocketClient_OnOpen;
14             wSocketClient.OnMessage += WSocketClient_OnMessage;
15             wSocketClient.OnClose += WSocketClient_OnClose;
16             wSocketClient.OnError += WSocketClient_OnError;
17 
18         }
19         #region 客户端接收信息各个阶段的回调函数
20         private void WSocketClient_OnOpen(ClientWebSocket sender, EventArgs e, int deviceId)
21         {
22 
23         }
24         private void WSocketClient_OnMessage(ClientWebSocket sender, string data, int deviceId)
25         {
26             //SocketSendHelper.Ins.SendMsg(data);
27             Console.WriteLine(data);
28         }
29         private void WSocketClient_OnClose(ClientWebSocket sender, EventArgs e, int deviceId)
30         {
31 
32         }
33         private void WSocketClient_OnError(ClientWebSocket sender, Exception ex, int deviceId)
34         {
35 
36         }
37         #endregion

参考地址:https://www.cnblogs.com/ping9719/p/14821508.html

 

posted @ 2023-04-13 11:52  Fast & Furious  阅读(1008)  评论(0)    收藏  举报