asp.net網站做爲websocket服務端的應用該如何寫

  最近被websocket的一個問題困擾了好久,有一個需求是在web網站中搭建websocket服務。客戶端經過網頁與服務器創建鏈接,而後服務器根據ip給客戶端網頁發送信息。git

  其實,這個需求並不難,只是剛開始對websocket的內容不太瞭解。上網搜索了一下,有經過asp.net core 實現的,有經過通常處理程序ashx文件來實現的,這些方法不能知足我當前網站的需求。github

  最後,經過fleck第三方庫實現了我想要的功能。下面詳細說一下個人實現過程。web

  1.下載fleck第三方庫,我是經過Git下載的,源碼下載json

   點擊頁面中的Clone or download -> Download ZIP,下載服務器

   

  下載完以後,能夠查看裏面的文檔,具體的實現能夠查看代碼。websocket

 

  2.將fleck加入到本身的項目中,並對fleck進行引用。asp.net

  

 

  3.編寫咱們本身的websocket類socket

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using Fleck;

namespace FAW.Common
{
    public class WsContext
    {
        //客戶端url以及其對應的Socket對象字典
        static IDictionary<string, IWebSocketConnection> dic_Sockets = new Dictionary<string, IWebSocketConnection>();

        public static void StartUpWs()
        {
            String ipValue = ConfigurationManager.AppSettings["WebsocketAddress"];
            //建立
            //WebSocketServer server = new WebSocketServer("ws://127.0.0.1:8819/terver");//監聽全部的的地址
            WebSocketServer server = new WebSocketServer(ipValue);//監聽的地址寫在配置文件裏
            //出錯後進行重啓
            server.RestartAfterListenError = true;

            //開始監聽
            server.Start(socket =>
            {
                socket.OnOpen = () =>   //鏈接創建事件
                {
                    //獲取客戶端網頁的url
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    dic_Sockets.Add(clientUrl, socket);
                    LogManager.WriteLog("服務器:和客戶端網頁:[" + clientUrl + "] 創建WebSock鏈接!");
                };
                socket.OnClose = () =>  //鏈接關閉事件
                {
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    //若是存在這個客戶端,那麼對這個socket進行移除
                    if (dic_Sockets.ContainsKey(clientUrl))
                    {
                        //注:Fleck中有釋放
                        //關閉對象鏈接 
                        if (dic_Sockets[clientUrl] != null)
                        {
                            dic_Sockets[clientUrl].Close();
                        }
                        dic_Sockets.Remove(clientUrl);
                    }
                    LogManager.WriteLog("服務器:和客戶端網頁:[" + clientUrl + "]  斷開WebSock鏈接!");
                };
                socket.OnMessage = message =>  //接受客戶端網頁消息事件
                {
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    LogManager.WriteLog("服務器:【收到】來客戶端網頁:" + clientUrl + "的信息:\n" + message);

                };
            });

        }

        public static void SendMsg(String ipAddress, String jsonString)
        {
            if (String.IsNullOrEmpty(jsonString))
            {
                //寫日誌
                LogManager.WriteLog("停止發送,向客戶端發送信息爲空。" );
                return;
            }
            foreach (var item in dic_Sockets.Values)
            {
                if (item.IsAvailable == true && item.ConnectionInfo.ClientIpAddress == ipAddress)
                {
                    LogManager.WriteLog("服務器: 向客戶端發送信息爲 " + jsonString);
                    item.Send(jsonString);
                }
            }
        }
    }
}

 

  這段代碼呢,StartUpWs函數主要是創建一個websocket服務端,SendMsg函數是負責提供外部調用向指定的客戶端發送內容的工做。函數

            try
            {
                String pdaIP = cameraLogic.QueryPDAIPByIP(cameraIP);
                LogManager.WriteLog("獲取攝像頭對應的手機機IP:" + pdaIP);
                WsContext.SendMsg(pdaIP, sendMessage);
            }
            catch (Exception ex)
            {
                LogManager.WriteLog("手動擡杆websocket異常:" + ex.Message);
            }            

  這個代碼片斷就是在網站中調用SendMsg函數,給指定的客戶端發送數據。測試

  注意:這裏要提一點,若是websocket服務的端口要提供給外網訪問的話,須要將端口加入到防火牆入站規則中,而且須要作一下內外網ip和端口的映射,不然外網想訪問這個服務是不能夠的。

  4.接下來咱們就要將websocket添加到網站中,讓它隨着網站的啓動而啓動。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using System.Web.Security;
using FAW.WEB;
using FAW.Common;

namespace FAW.WEB
{
    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // 在應用程序啓動時運行的代碼
            AuthConfig.RegisterOpenAuth();

            //創建websocket服務器
            WsContext.StartUpWs();
        }
        
    }
}

   這樣就能夠了。

  5.測試websocket服務是否可用的話,能夠經過websocket在線測試的功能。這個只要百度一下,你就全知道了,很簡單,這裏再也不介紹。

  總結:其實websocket的操做真的不難,就是普通的http請求獲得了一次升級後,創建了一個全雙工的通道,能夠相互發送信息。只是我在網上並無找到asp.net網站做爲服務端的例子,其實須要作的只有兩步:1.創建一個websocket的服務端;2.將websocket的服務端加入到Global文件中,隨程序一塊兒啓動。我把這個分享出來,但願能夠幫助更多的人。

相關文章
相關標籤/搜索