聊天室的开始 WebSocket的基本应用使用.Net 6

使用:.NET 6
后端为:Web API
想做聊天室,就必须透过WebSocket来通讯,
WebSocket 的流程 请参考Web Scoket 流程,
这里只讲实作。

[后端]
1.建立专案

档案>建立新专案>ASP.NET Core Web API(下一步)>输入专案名称(下一步)
架构选择 .NET 6(建立)

2.建立Controller
=>右侧方案总管选择Controller 资料夹(右键)>新增控制项>在此命名为(WebSocketController)
(1)在这里新增一个Get 请求,这个Get是当发送传输入 localhost:xxxx/ws 就会进入这个Method,
并检查是否为WebScoket请求,如果是则进入Echo。
(2)Echo
=>判断是否为WebSocket的等待请求项目,
如果是则会发请一个等待请求,以便接收client 来源的资料,
接收到了来源资料后检查连线。
(3)发送资料至前端。
(4)接着等待接收资料。
(5)重複2-4
(6)如果连线中断则关闭等待请求

    public class WebSocketController : Controller    {        [HttpGet("/ws")]        public async Task Get()        {            //是否为webSocket请求 如果是则加入等待            if (HttpContext.WebSockets.IsWebSocketRequest)            {                using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();                await Echo(webSocket);            }            else            {                HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest;            }        }        private static async Task Echo(WebSocket webSocket)        {            var buffer = new byte[1024 * 4];            //等待接收讯息            var receiveResult = await webSocket.ReceiveAsync(                 new ArraySegment<byte>(buffer), CancellationToken.None);            //检查是否为连线状态            while (!receiveResult.CloseStatus.HasValue)            {                //讯息发到前端                await webSocket.SendAsync(                    new ArraySegment<byte>(buffer, 0, receiveResult.Count),                    receiveResult.MessageType,                    receiveResult.EndOfMessage,                    CancellationToken.None                    );                //继续等待接收讯息                receiveResult = await webSocket.ReceiveAsync(                    new ArraySegment<byte>(buffer), CancellationToken.None);            }            //关闭连线            await webSocket.CloseAsync(                receiveResult.CloseStatus.Value,                receiveResult.CloseStatusDescription, CancellationToken.None);        }    }

3.找到Program.cs 并增加注入设定
在var app = builder.Build(); 的后面增加如下程式码

//注册webSocketvar webSocketOptions = new WebSocketOptions{    //Proxy 保持连线开启的频率。 预设为两分钟    KeepAliveInterval = TimeSpan.FromMinutes(2)    //WebSocket 要求之允许 Origin 标头值的清单    //AllowedOrigins };app.UseWebSockets(webSocketOptions);

至此后端就完成了。
可以开启Postam测试

[前端]
直接来完整程式,注解都在里面

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>           <br/>    <span>name</span><input type="text" id="txtName"/>    <br/>    <span>Msg</span><input type="text" id="txtMsg"/>    <br/>    <button id="btnSend">send</button>    <br/>    <label id="lbMsg">    </label></head><body>        <script>        var server = 'wss://localhost:7070'; //如果开启了https则这里是wss        var vWebSocket=null;        window.onload = function () {            //建立一个web socket 连线            vWebSocket=new WebSocket(server+'/ws');            document.getElementById("btnSend").addEventListener("click", sendMsg);            //如果连线成功            vWebSocket.onopen=function(e){                console.log('connection start ...');                var content=document.getElementById("lbMsg");                content.innerText=content.innerText+'\r\n'+"conection.....";            }            //接收到讯息时            vWebSocket.onmessage=function(e){                console.log('Recevied Message:'+e.data);                if(e.data){                    var content=document.getElementById("lbMsg");                    content.innerText=content.innerText+'\r\n'+e.data;                }            }            //关闭连线时            vWebSocket.onclose=function(e){                console.log("connection closed");            }        };        function sendMsg()        {            var txtName=document.getElementById("txtName").value;            var txtMsg=document.getElementById("txtMsg").value;            if (txtName) {                var data = {                    action: 'sendMsg',                    name: txtName,                    msg: txtMsg                };                vWebSocket.send(JSON.stringify(data));            }        }    </script></body></html>

Git完整程式码

参考:https://www.cnblogs.com/kklldog/p/core-for-websocket.html
参考:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/websockets?view=aspnetcore-6.0


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章