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

浙公网安备 33010602011771号