背景:
? ? 在阿里云服務(wù)器中搭建了常規(guī)的tcp server服務(wù)(基于.net framework 4.0)。用以實現(xiàn)遠(yuǎn)程控制家里的魚缸燈,辦公室的電腦開關(guān)機(jī)等功能??蛻舳瞬捎肞C桌面端和微信小程序端。
? ? 服務(wù)端:tcp server(基于.net framework 4.0)
? ? 客戶端:PC桌面端軟件(.net winform)、微信小程序
? ??問題:
? ?微信小程序端支持websocket通信而且必須是wss(wss表示在TLS之上的websocket,相當(dāng)于https),無法與tcp server直接通信。
? ? 為什么不重新開發(fā)服務(wù)端呢?
? ? 一是我懶。
? ? 二是服務(wù)端TCP Server必須時刻保持與家里的魚缸燈控制器,辦公室的開關(guān)機(jī)控制器等設(shè)備的網(wǎng)絡(luò)連接。而且還設(shè)定了定時執(zhí)行的策略,故不適宜更換其他技術(shù)實現(xiàn)。
? ?解決方法:
? ?微信小程序的后端采用了asp.net web api (net6)搭建的接口服務(wù)。如果可以在該web api 接口服務(wù)中搭建websocket服務(wù),中轉(zhuǎn)微信小程序和tcp server服務(wù)端,同時升級TCP Server,使之同時支持tcp client連接和websocket連接,問題可得到解決。
?
開干!
? ? 一、新建ASP.NET Core Web API? 項目(net6)
????基于net 6.0
? ? 二、創(chuàng)建websocket中間件WebsocketHandler
? ? 新建類,名為:WebsocketHandler
? ? 在接收到websocket連接時,將觸發(fā)Invoke函數(shù)。
? ? 關(guān)鍵代碼:????
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
_logger.LogInformation($"接收到websocket連接.");
try
{
WebSocketReceiveResult result;
do
{
var buffer = new byte[1024 * 1];
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text && !result.CloseStatus.HasValue)
{
var msgString = Encoding.UTF8.GetString(buffer);
_logger.LogInformation($"接收到數(shù)據(jù):{msgString}.");
//發(fā)送接收到的信息
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, buffer.Length), WebSocketMessageType.Text, true, CancellationToken.None);
}
}
while (!result.CloseStatus.HasValue);
}
catch (Exception ex)
{
}
? ??AcceptWebSocketAsync函數(shù)接收websocket連接,并把連接保存于變量webSocket。
? ? 定義變量WebSocketReceiveResult result用來接收客戶端發(fā)送的數(shù)據(jù),webSocket.ReceiveAsync函數(shù)接收數(shù)據(jù)。
????webSocket.SendAsync函數(shù)實現(xiàn)向客戶端發(fā)送數(shù)據(jù)的功能。
? ? 可以看到,為了測試發(fā)送和接收的功能,服務(wù)端將接收到的數(shù)據(jù)直接返回給客戶端
? ? 三、添加中間件
? ??在Program中添加此中間件:
app.UseWebSockets();
app.UseMiddleware<WebsocketHandler>();
????至此,服務(wù)端已建好。
? ??四、運行服務(wù)端
? ? Ctrl+F5,運行服務(wù)端,可看到,監(jiān)聽端口為:5276????
? ? 五、創(chuàng)建客戶端:測試.html
? ? 創(chuàng)建靜態(tài)頁面:webSocketClient.html,作為客戶端,該客戶端將實現(xiàn)向服務(wù)端發(fā)送消息,并接收服務(wù)端的消息。
? ? 使用原生javascript實現(xiàn),不依賴其他js庫。
? ? 關(guān)鍵函數(shù):
????創(chuàng)建websocket:new WebSocket(server + '/ws');
? ? websocket打開成功事件:WEB_SOCKET.onopen
? ? websocket接收消息事件:WEB_SOCKET.onmessage
? ? websocket關(guān)閉事件:WEB_SOCKET.onclose
????
<button type="button" onclick="javascript:connectWebSocket()">測試</button>
? ? 界面上放置一個按鈕,觸發(fā)websocket。
? ? 六、測試成功
? ? 雙擊在瀏覽器中打開webSocketClient.html,同時按F12打開調(diào)試器。點擊“測試”按鈕,觀察控制臺面板,可看到websocket接收到來自服務(wù)器的消息“hello world”
????
? ??而服務(wù)端面板:顯示接收到websocket連接并接收到消息“hello world"
????
????
我已將代碼上傳,下載碼是:C67F979907文章來源:http://www.zghlxwxcb.cn/news/detail-421810.html
????下載碼是啥?如何下載=》點擊查看文章來源地址http://www.zghlxwxcb.cn/news/detail-421810.html
到了這里,關(guān)于基于asp.netCoreWebApi的webSocket通信示例(net6)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!