主頁 > .NET開發 > asp.net網站作為websocket服務端的應用該如何寫

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

2020-09-09 22:08:02 .NET開發

  最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務,客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊,

  其實,這個需求并不難,只是剛開始對websocket的內容不太了解,上網搜索了一下,有通過asp.net core 實作的、有通過一般處理程式ashx檔案來實作的,這些方法不能滿足我當前網站的需求,我自己通過SignalR也實作了此功能,而且使用signalR實作起來會更簡單,但是我的需求是客戶端不是我撰寫,而且是一個手持機,只給我留了一個填寫websocket服務器地址的地方,所以我沒有辦法通過signalR封裝的js去呼叫后臺的websocket服務,如果你的需求不像我這么苛刻,你完全可以通過signalR實作,而且更加簡單,

  最后,通過fleck第三方庫實作了我想要的功能,下面詳細說一下我的實作程序,

  1.下載fleck第三方庫,我是通過Git下載的,原始碼下載

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

   

  下載完之后,可以查看里面的檔案,具體的實作可以查看代碼,

 

  2.將fleck加入到自己的專案中,并對fleck進行參考,

  

 

  3.撰寫我們自己的websocket類

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檔案中,隨程式一起啟動,我把這個分享出來,希望可以幫助更多的人,

   

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/3.html

標籤:ASP.NET

上一篇:asp.net core 3.1 入口:Program.cs中的Main函式

下一篇:ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

標籤雲
其他(106925) Java(11680) Python(10728) C(7091) JavaScript(6400) 基礎類(6294) 區塊鏈(6109) AI(5432) 腳本語言(PerlPython)(5088) 非技術區(4946) Android(4041) MySQL(3833) C語言(3259) Linux(3224) C++語言(3073) Java相關(2692) 疑難問題(2680) 單片機工控(2461) Web開發(1921) 網絡通信(1792) 數據庫相關(1761) VB基礎類(1754) 開發(1641) 系統維護與使用區(1606) 基礎和管理(1575) JavaEE(1546) PHP(1523) 專題技術討論區(1510) .NETCore(1490) Windows客戶端使用(1479) C++(1440) HtmlCss(1411) ASP.NET(1364) VCL組件開發及應用(1353) Unity3D(1349) HTML(CSS)(1210) WindowsServer(1183) 其他技術討論專區(1179) 交換及路由技術(1144) 語言基礎算法系統設計(1132) WindowsSDKAPI(1123) 界面(1081) JavaSE(1063) Qt(1026) 新手樂園(1009) VBA(990) .NET技术(960) 其他開發語言(939) 新技術前沿(895) HTML5(880) 硬件設計(868) 區塊鏈技術(858) 網絡編程(855) 非技術版(843) 一般軟件使用(834) 網絡協議與配置(831) Go(827) Eclipse(785) Spark(750) 下載資源懸賞專區(743)
熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布