日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET下使用socket.io随笔记录

發布時間:2023/12/4 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET下使用socket.io随笔记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、問題背景

目前公司在互聯網產品上需要程序與前端部分要進行一個實時交互,在進行一定程度上的選型后,決定使用socket.io框架進行一個實踐,算是公司的一個新的 嘗試,也算是給自己增加增長見聞,由于我是做后端以及桌面程序開發,所以前端部分就不細聊,主要是針對桌面程序如何連接socket.io進行一個嘗試

二、基本邏輯圖

  本地應用程序:部署在局域網內(可以聯通外網),主要負責相關數據獲取

  Web瀏覽器端:跟本地應用程序不是處于同一個網絡,請求發起方

  中轉服務(重點):中轉服務集成認證功能,必須經過認證的客戶端才允許進行連接,并且對于客戶端要有唯一指定的ID進行連接操作

  整體思路如以上的流程圖,由Web瀏覽器端開始發起請求,Web瀏覽器端通過連接中轉服務,將信息發送給指定的本地應用程序,應用程序處理完成后,將結果通過原路徑進行一個反饋

二、客戶端程序開發

  客戶端SDK采用SocketIoClientDotNet,這是一個github上開源的,可以連接socket.io的客戶端,支持.net 3.5及以上,可以方便的幫助我們進行連接socket.io的開發

Socket? socket = IO.Socket("ws://192.168.7.4:3000", new IO.Options()

? ? ? ? ? ?{

? ? ? ? ? ? ? ?Reconnection = true,

? ? ? ? ? ? ? ?Cookies = new Dictionary<string, string>() { { "companyId", GlobalStatic.COMPANY.COMPANY_ID }, { "userId", GlobalStatic.UserDomain.user.USER_ID } },

? ? ? ? ? ? ? ?Timeout = 60000,

? ? ? ? ? ? ? ?ReconnectionDelay = 1000,

?

? ? ? ? ? ? ? ?Transports = new List<string>() { "websocket" },

? ? ? ? ? ? ? ?Path ="heart"

? ? ? ? ? ?});

?

? ? ? ? ? ?socket.On(Socket.EVENT_CONNECT, () =>

? ? ? ? ? ?{

?

? ? ? ? ? ? ? ?JObject jObject = JObject.Parse(Newtonsoft.Json.JsonConvert.SerializeObject(new

? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ?companyId = GlobalStatic.COMPANY.COMPANY_ID,

? ? ? ? ? ? ? ? ? ?token = GlobalStatic.TOKEN,

? ? ? ? ? ? ? ? ? ?hostId = GlobalStatic.HOST_ID,

? ? ? ? ? ? ? ? ? ?hostName = GlobalStatic.HOST_NAME,

? ? ? ? ? ? ? ? ? ?printerNames = GlobalStatic.HOSTINFO.PrinterName,

? ? ? ? ? ? ? ? ? ?source = "assistant",

? ? ? ? ? ? ? ? ? ?userId = GlobalStatic.UserDomain.user.USER_ID

? ? ? ? ? ? ? ?}));

? ? ? ? ? ? ? ?socket.Emit("authentication", jObject);

? ? ? ? ? ? ? ?Debug.WriteLine("authentication");

? ? ? ? ? ?});

? ? ? ? ? ?socket.On(Socket.EVENT_DISCONNECT, (data) =>

? ? ? ? ? ?{

? ? ? ? ? ? ? ?Debug.WriteLine("心跳斷開連接" + data);

? ? ? ? ? ? ? ?flag = false;

? ? ? ? ? ? ? ?OnConnectionStatus?.Invoke(flag);

? ? ? ? ? ? ? ?socket.Disconnect();

? ? ? ? ? ?});

? ? ? ? ? ?socket.On("authenticated", (obj) =>

? ? ? ? ? ?{

? ? ? ? ? ? ? ?flag = true;

? ? ? ? ? ? ? ?OnConnectionStatus?.Invoke(flag);

? ? ? ? ? ? ? ?Debug.WriteLine("心跳認證成功:" + obj);

? ? ? ? ? ?});

? ? ? ? ? ?socket.On("unauthorized", (obj) =>

? ? ? ? ? ?{

? ? ? ? ? ? ? ?Debug.WriteLine("心跳認證失敗" + obj);

? ? ? ? ? ? ? ?socket.Disconnect();

? ? ? ? ? ?});

SocketIoClientDotNet注意點:

  • emit的數據必須為字符串或者JObject(Newtonsoft.Json中的)

  • 從實際情況來看,內部每個On的監聽都是維護了一個線程,所有如果是不想要阻塞的話,那在on的方法中還需要自己起線程去完成

  • 如果不在options中設置AutoConnect=false的話,那實例化socket成功之后就會進行connect動作

  • 三、關于SocketIoClientDotNet坑的問題

      在實際的使用過程中,偶然發現在程序開了很久 之后,線程數會一直增多,嘗試調節各種參數都毫無作用,最后只能無奈的跟蹤源碼部分,在Thread文件夾下找到Heartbeat_net35.cs文件中,發現run方法里的while一直無法跳出去,并且注冊DoWork越來越多,如下所示,導致線程越來越多,目前解決辦法是將該代碼注釋掉,還沒發現什么問題,如果有哪位知道這段代碼作用的話,望告知,謝謝

    using System;

    using System.ComponentModel;

    using System.Threading;

    ?

    namespace Quobject.EngineIoClientDotNet.Thread

    {

    ? ? public class Heartbeat

    ? ? {

    ? ? ? ? private volatile bool gotHeartbeat = false;

    ? ? ? ? private BackgroundWorker heartBeatTimer= new BackgroundWorker();

    ? ? ? ? private CancellationTokenSource ts;

    ?

    ? ? ? ? private Heartbeat()

    ? ? ? ? {

    ? ? ? ? ? ? ts = new CancellationTokenSource();

    ? ? ? ? }

    ?

    ? ? ? ? public static Heartbeat Start(Action onTimeout, int timeout)

    ? ? ? ? {

    ? ? ? ? ? ? Heartbeat heartbeat = new Heartbeat();

    ? ? ? ? ? ? heartbeat.Run(onTimeout, timeout);

    ? ? ? ? ? ? return heartbeat;? ? ? ? ? ?

    ? ? ? ? }

    ?

    ? ? ? ? public void OnHeartbeat()

    ? ? ? ? {

    ? ? ? ? ? ? gotHeartbeat = true;

    ? ? ? ? }

    ?

    ? ? ? ? private void Run(Action onTimeout, int timeout)

    ? ? ? ? {

    ? ? ? ? ? ? heartBeatTimer = new BackgroundWorker();

    ?

    ? ? ? ? ? ? heartBeatTimer.DoWork += (s, e) =>

    ? ? ? ? ? ? {

    ? ? ? ? ? ? ? ?while (!ts.IsCancellationRequested)

    ? ? ? ? ? ? ? ?{

    ? ? ? ? ? ? ? ? ? ? System.Threading.Thread.Sleep(timeout);

    ? ? ? ? ? ? ? ? ? ? if (!gotHeartbeat && !ts.IsCancellationRequested)

    ? ? ? ? ? ? ? ? ? ? {

    ? ? ? ? ? ? ? ? ? ? ? ? onTimeout();

    ? ? ? ? ? ? ? ? ? ? ? ? break;

    ? ? ? ? ? ? ? ? ? ? }

    ? ? ? ? ? ? ? ? }

    ? ? ? ? ? ? };

    ?

    ? ? ? ? ? ? heartBeatTimer.RunWorkerAsync();

    ? ? ? ? }

    ?

    ? ? ? ? public void Stop()

    ? ? ? ? {

    ? ? ? ? ? ? ts.Cancel();

    ? ? ? ? }

    ? ? }

    }

    原文地址: http://www.cnblogs.com/OMango/p/8443395.html


    .NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

    總結

    以上是生活随笔為你收集整理的.NET下使用socket.io随笔记录的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。