在.NetCore中实现WebSocket双工通信

服务端实现

Startup.cs的文件中的Configure方法里面设置如下代码:.

 1app.UseEndpoints(endpoints =>
 2            {
 3                endpoints.MapControllers();
 4                // 映射 /ws 路径 
 5                // 对请求上下文进行操作
 6                endpoints.Map("/ws", async context =>
 7                {
 8                    var  buffer = new byte[1024*2];  // 创建接受传输的字符变量
 9                    var websocket = await context.WebSockets.AcceptWebSocketAsync(); // 接收通信 建立链接 
10                    _lists.Add(websocket); // 获取一个客户端就添加到集合里面
11
12                    var result =await websocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); // 开始接收  
13                    var i = 0;
14                    while(!result.CloseStatus.HasValue)
15                    {
16                        var message = Encoding.UTF8.GetBytes($"{i++}");
17                        foreach (var item in _lists)
18                        {
19                            // 未闭合链接  服务端
20                            await item.SendAsync(new ArraySegment<byte>(message, 0, message.Length), result.MessageType,result.EndOfMessage, CancellationToken.None);
21                        }
22                        var da = await websocket.ReceiveAsync(new ArraySegment<byte>(buffer),CancellationToken.None); // 开始接收  双重
23                        Console.WriteLine(buffer[i]);
24                    }
25                    // 断开链接
26                    await websocket.CloseAsync(result.CloseStatus.Value, "Close", CancellationToken.None);
27                    _lists.Remove(websocket);
28                });
29            });

客户端实现

 1 <script>
 2        // 建立链接
 3        const socket = new WebSocket("ws://localhost:5000/ws");
 4        var i = 0;
 5        // 注意  "一定是open" 不然链接无法建立发送数据
 6        socket.addEventListener("open", (event) => {
 7            socket.send("opensss");
 8            setInterval(function() {
 9                socket.send(`${i++}`)
10            }, 2000)
11        });
12        socket.addEventListener("message", (event) => {
13            console.log(`data received:${event.data}`);
14        });
15    </script>

配置

1// .net core 中启动中间件
2app.UseWebSockets(new WebSocketOptions() {KeepAliveInterval = TimeSpan.FromSeconds(30) });

会以Signalr为一个专题进行分享,没玩过的朋友感兴趣的话可以随时关注,获取源码一起实操呀~