SignalR的另類實現技巧

2021-09-07 14:19:29 字數 3375 閱讀 9816

很久之前發表過一篇名為《通過三個demo學會signalr的三種實現方式》的文章,在那篇文章裡面詳細介紹了在web應用下的常用signalr實現方法,而今天我們來利用signalr來實現其它的一些用法,比如:b/s 與 c/s互相通訊,比如:c/s與c/s通訊。

一、b/s 與 c/s互相通訊(asp.net 向  winform  廣播訊息),先看效果如下:

如上圖所示,採用服務端傳送訊息(指在c#**傳送),然後winform接收訊息。

如上圖所示,採服客戶端(瀏覽器)js **物件傳送訊息,然後winform接收訊息。

上述示例的實現**如下:

asp.net 服務端**:

myhub:

[hubname("myhub")]

public class myhub : hub

private void sendmsg(string msg)

[hubmethodname("broadcast")]

public void broadcast(string msg)

}public override system.threading.tasks.task onconnected()

[hubmethodname("testconnect")]

public void testconnect()

}

asp.net 頁面:(演示就用了伺服器控制項,以便到服務端進行傳送)

廣播訊息:

asp.net cs**:

protected void button1_click(object sender, eventargs e)

}

在這裡特別說明一下,因為myhub是有連線時才會生成例項,我們無法直接在服務端獲取到myhub的例項,所以採取了在myhub建構函式時,將sendmsg暴露給靜態的 sendmsgaction委託,這樣服務端就可以直接通過判斷sendmsgaction是否有訂閱來決定是否可以傳送訊息。這是乙個取巧的的方式,當然如果大家有更好的方法,歡迎交流。

廣播訊息:

這裡有乙個注意點:我們在定義myhub類時,按照csharp的**規範是:類名 及方法名首字母都大寫,但js自動生成的**js類及方法名卻會變成js的命規範,即:函式名首個字母是小寫,如:myhub -->myhub,所以為了便於相容js呼叫,在定義hub類時,用上hubname及hubmethodname特性,指定統一名稱。

winform客戶端接收訊息步驟:

1.通過nuget安裝signalr.client相關元件

/// /// 建立hub**類,並啟動

///

private void createhubconnection()

/// /// 接收signalr服務端的訊息

///

///

private void recvmsg(string msg)

\r\n", datetime.now, o);

}, msg);

}private void form1_formclosed(object sender, formclosedeventargs e)

private void button1_click(object sender, eventargs e)

}通過上述**可以看出,與asp.net 頁面生成的js**類的方式原理基本相同,都是通過**類來與服務端進行互動,都是通過http協議進行通訊。

二、c/s 與 c/s 互相通訊(winform與winform),其實本質上服務端還是b/s,只不過我們採取了signalr self host(裡面用到了owin self host),也就是將**寄宿到winform而矣,只是我們通過winform操作更方更而矣,效果如下:

winform服務端實現流程:

1.先通過nuget 分別安裝microsoft.aspnet.signalr、microsoft.aspnet.signalr self host,如下圖示:

2.新增startup類檔案,並在裡面新增對映signalr,**如下:(與asp.net服務端的startup**相同)

public class startup

}

3.編寫owin 的寄宿**,myhub與上文中的相同,故不再貼出

public partial class form1 : form

private void form1_load(object sender, eventargs e)

catch (exception ex)

}private void form1_formclosed(object sender, formclosedeventargs e)

catch

}private void button1_click(object sender, eventargs e)

}public void showmsg(string msg)

));}

}

這裡有幾個小細節需要注意:

1.安裝microsoft.aspnet.signalr後會在專案中生成sciprts資料夾,這個在winform專案時就可以刪除掉;

2.安裝microsoft.aspnet.signalr self host後,編譯可能無問題,但執行起來時,可能會報朱找到匹配的owin程式集,這個是因為owin版本問題,只需單獨再安裝一下指定的owin版本即可。

SignalR的另類實現技巧

原文 signalr的另類實現技巧 很久之前發表過一篇名為 通過三個demo學會signalr的三種實現方式 的文章,在那篇文章裡面詳細介紹了在web應用下的常用signalr實現方法,而今天我們來利用signalr來實現其它的一些用法,比如 b s 與 c s互相通訊,比如 c s與c s通訊。一...

SignalR的另類實現技巧

原文 signalr的另類實現技巧 很久之前發表過一篇名為 通過三個demo學會signalr的三種實現方式 的文章,在那篇文章裡面詳細介紹了在web應用下的常用signalr實現方法,而今天我們來利用signalr來實現其它的一些用法,比如 b s 與 c s互相通訊,比如 c s與c s通訊。一...

SignalR的另類實現技巧

很久之前發表過一篇名為 通過三個demo學會signalr的三種實現方式 的文章,在那篇文章裡面詳細介紹了在web應用下的常用signalr實現方法,而今天我們來利用signalr來實現其它的一些用法,比如 b s 與 c s互相通訊,比如 c s與c s通訊。一 b s 與 c s互相通訊 asp...