.net websocket服务端开发,实现消息推送功能

.net websocket服务端开发,实现消息推送功能

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<byte>(buffer), CancellationToken.None);
    while (!result.CloseStatus.HasValue)
    {
        await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
 
        result = await webSocket.ReceiveAsync(new ArraySegment<byte>(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秒向服务器发送一条消息,然后会马上收到回复。

Comments are closed.