WebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样通过TCP来传输数据,但是它和http最大的不同有两点:
WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器和Browser/UA都能主动的向对方发送或接收数据,就像Socket一样,不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议;
WebSocket需要通过握手连接,类似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。
当Web应用程序调用new WebSocket(url)接口时,Browser就开始了与地址为url的WebServer建立握手连接的过程。
下面为大家讲解一下.net websocket服务端的实现机制。
服务端:
1、新建一个ASP.NET Core Web应用程序。
2、NuGet安装Microsoft.AspNetCore.WebSockets包。
3、在Startup类的Configue函数里输入以下代码:
app.UseWebSockets();
app.Use(async (context, next) =>
{
if (context.Request.Path == "/ws")
{
if (context.WebSockets.IsWebSocketRequest)
{
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
await Echo(context, webSocket);
}
else
{
context.Response.StatusCode = 400;
}
}
else
{
await next();
}
});
其中,Echo函数如下:
private async Task Echo(HttpContext context, WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
{
await webSocket.SendAsync(new ArraySegment(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
}
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}
上述代码实现的是一个回声功能,也就是客户端发什么消息过来,都原样返回。经过上面三步,.net websocket服务端的开发工作就完成了。
客户端:
客户端(js)的代码也很简单,如下:
var ws = new WebSocket("ws://localhost:53014/ws");
ws.onopen = function (evt) {
console.log("Connection open ...");
};
ws.onmessage = function (evt) {
console.log("Received Message: " + evt.data);
};
setInterval(() => {
ws.send("hello");
}, 3000);
客户端3秒向服务器发送一条消息,然后会马上收到回复。