很多情况下BS架构也会有客户端和服务器进行长连接的功能需求,比如说聊天、或者说弹幕功能。
而WebSocket是一种在单个TCP连接上进行全双工通信的协议,所以这个时候就使用到了websocket。
首先我们需要先写一个简单的客户端网页:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <hr> <input id="sendMsg" /> <button onclick="sendMessage();">消息发送</button> </body> <script> var ws = new WebSocket('ws://localhost:50728/api/websocket'); // 建立 web socket 连接成功触发事件 ws.onopen = function () { var json={serverId:['11231','24423']} var messageJson = JSON.stringify(json); ws.send(messageJson);//可以给后台发送参数 }; function sendMessage() { var sendmsg = document.getElementById("sendMsg").value; ws.send(sendmsg); } //接收到消息的回调方法 ws.onmessage = function (event) { alert('数据回来了额'+ JSON.stringify(event.data)) console.log(event.data);//后台不间断发送数据,持续接收。 } //断开 web socket 连接成功触发事件 ws.onclose = function () { alert("连接已关闭..."); }; ws.onerror = function(event) { console.log(event.data); } </script> </html>
比较简单的一个测试网页,那么接下来我们.net core 是如何编写代码的吧:
首先我们先添加中间件:
app.UseWebSockets(new WebSocketOptions { KeepAliveInterval = new TimeSpan(0, 0, 15) });
这里的KeepAliveInterval 的意思是心跳检测的时间,这里是15s检测一次,确保websocket不会断开。
第二步就是编写代码了,别忘了 using System.Net.WebSockets;以及route应该是ws开头的:
/// <summary> /// websocket连接 /// </summary> /// <returns></returns> [HttpGet] public async Task WebScoketConn() { var context = ControllerContext.HttpContext; //是否是websocket请求 if (context.WebSockets.IsWebSocketRequest) { var websocket = await context.WebSockets.AcceptWebSocketAsync(); while (!websocket.CloseStatus.HasValue) { try { //判断连接是否打开 if (websocket.State == WebSocketState.Open) { byte[] recvBuffer = new byte[4096]; var recvAs = new ArraySegment<byte>(recvBuffer); var result = await websocket.ReceiveAsync(recvAs, CancellationToken.None); if (result.Count > 0 && result.MessageType == WebSocketMessageType.Text) { if (result.EndOfMessage) { if (Encoding.UTF8.GetString(recvBuffer, 0, result.Count) != "hello") { await websocket.SendAsync(new ArraySegment<byte>(recvBuffer), WebSocketMessageType.Text, true, CancellationToken.None); } } } } else if (websocket.State == WebSocketState.Aborted || websocket.State == WebSocketState.Closed || websocket.State == WebSocketState.CloseReceived || websocket.State == WebSocketState.CloseSent) { _logger.LogWarning($"WebSocket closed"); break; } } catch (Exception e) { _logger.LogError(e, $"Receive heartbeat failed"); } Thread.Sleep(1000); } } else { context.Response.StatusCode = 400; } }
然后我们启动网页可以发现已经连接上了,然后服务器会返回一开始发送的数据消息,
这就是比较简单的websocket的使用方法,之后会用怎么用websocket实现类似于qq的聊天功能。还有配合消息队列实现弹幕功能等。