一 介紹
WebSocket# 提供了實現WebSocket協議客戶端和服務器。
WebSocket協議是基於TCP的一種新的網絡協議。它實現了瀏覽器與服務器全雙工(full-duplex)通信——允許服務器主動發送信息給客戶端
二 用法
創建一個控制台程序,從Nuget添加引用websocket-sharp
public static void Main (string[] args) { var wssv=new WebSocketServer(null, 2018);//創建一個websocket服務對象,2018是端口號 wssv.start();//開始接收websocket Console.ReadKey (true); wssv.Stop ();//關閉 }
如果需要使用wss(比如微信小程序中,只接受wss不接受ws,)
則在創建websocket服務對象的第三個參數中加入如下代碼
var ssl = new ServerSslConfiguration(new X509Certificate2 (@"D:證書\132456.pfx", "123456"), false, System.Security.Authentication.SslProtocols.Tls11); var wssv = new WebSocketServer(null, 2018 , ssl);
接着創建一個類繼承WebSocketBehavior
public class ChatRoom : WebSocketBehavior { protected override async Task OnMessage(MessageEventArgs e) { //傳來的消息 var memid = Context.GetQueryString().Result["memid"];//通過此方法可以獲取傳來的查詢字符串值 memberEntity = new tb_memberEntity();//會員實體類,此處會意即可,不貼具體代碼 if (!memid.IsEmpty()) { memberEntity = new tb_memberBLL().GetEntity(memid); } else { memberEntity.nickname = "游客"; } StreamReader reader = new StreamReader(e.Data, Encoding.UTF8);//讀取發來的數據內容 var msgStr = reader.ReadToEnd(); await Sessions.Broadcast(new { content = msgStr, name = memberEntity.nickname, }.ToJson()); //將准備好的內容發送給“收聽”的客戶端 } protected override async Task OnClose(CloseEventArgs e) { //處理關閉連接的響應 } protected override async Task OnOpen() { //處理打開連接的響應 } protected override async Task OnError(WebSocketSharp.ErrorEventArgs e) { //處理異常事件 Console.WriteLine(e.Message + "\t\r" + DateTime.Now); } }
回到剛剛的mian方法中,在wssv.Start();后插入如下代碼,相當於創建了一個聊天間
wssv.AddWebSocketService<ChatRoom >("roomName");
寫完收工,接着F5運行一下
三 測試
此處我通過html來實現客戶端
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <div id="messages"> 9 </div> 10 <input type="text" id="content" value="" /> 11 <a id="sendbt" href="javascript:void(0);">發送</a> 12 </body> 13 14 15 <script src="https://cdn.bootcss.com/jquery/1.8.3/jquery.min.js"></script> 16 <script> 17 var ws; 18 function initWS() { 19 if ("WebSocket" in window) { 20 ws = new WebSocket("ws://localhost:2018/roomName"); 21 ws.onopen = function (e) { 22 console.log("Openened connection to websocket"); 23 }; 24 ws.onclose = function () { 25 console.log("Close connection to websocket"); 26 // 斷線重連 27 initWS(); 28 } 29 ws.onerror = function (e) { 30 console.info("出錯了"); 31 console.info(e); 32 } 33 ws.onmessage = function (e) { 34 console.log("收到", e.data) 35 $("#messages").append(e.data); 36 } 37 } else { 38 alert("您的瀏覽器不支持 WebSocket!"); 39 } 40 } 41 initWS(); 42 function sendMsg(msg, type) { 43 var sendJosn = JSON.stringify({ Msg: msg, msgType: 1 }); 44 try { 45 ws.send(sendJosn); 46 } catch (e) { 47 console.info(e); 48 } 49 } 50 $(function () { 51 $("#sendbt").click(function () { 52 var text = $("#content").val(); 53 sendMsg(text, "1") 54 $("#content").val(""); 55 }) 56 $("#changebt").click(function () { 57 sendMsg(text, "2") 58 }) 59 }) 60 </script> 61 </html>