【转】.NET 的 WebSocket 开发包比较
轉(zhuǎn)載于http://www.oschina.net/translate/websocket-libraries-comparison-2
?
編者按
本文出現(xiàn)在第三方產(chǎn)品評(píng)論部分中。在這一部分的文章只提供給會(huì)員,不允許工具供應(yīng)商用來(lái)以任何方式和形式來(lái)促銷或宣傳產(chǎn)品。請(qǐng)會(huì)員報(bào)告任何垃圾信息或廣告。
Web項(xiàng)目常常需要將數(shù)據(jù)盡可能快地推送給客戶,必要時(shí)無(wú)需等待客戶端請(qǐng)求。對(duì)于與用戶之間進(jìn)行實(shí)時(shí)通信的網(wǎng)站,例如在線交流或文檔協(xié)作工具,或者在長(zhǎng)期運(yùn)行的計(jì)算/執(zhí)行任務(wù)的服務(wù)器上更新系統(tǒng)狀態(tài),等等這些時(shí)候,采用雙向溝通機(jī)制是理想的。
以前,這類問(wèn)題一般使用下面的解決方案:
-
使用 Flash 中的 Socket 連接(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html)
-
Ajax 長(zhǎng)輪詢(https://gist.github.com/jasdeepkhalsa/4353139)
-
服務(wù)器發(fā)送事件... (http://en.wikipedia.org/wiki/Server-sent_events)
-
...或者就用 IE 中經(jīng)典的 Frame 技術(shù)?(http://cometdaily.com/2007/11/05/the-forever-frame-technique/)
趙亮-碧海情天
翻譯于 3年前
2人頂
頂?翻譯得不錯(cuò)哦!
但現(xiàn)在我們有了更好的選擇:WebSocket。它的標(biāo)準(zhǔn)在2011年發(fā)布,在現(xiàn)代瀏覽器上已實(shí)施了一段時(shí)間。它更好的原因是使用更安全和更成熟的協(xié)議,帶來(lái)了改進(jìn)和升級(jí)。
略注:
這份比較是幾個(gè)月前做的,可能不夠及時(shí),但如果有人要找好的WebSocket庫(kù),我認(rèn)為這對(duì)他仍然是有用的。
本比較只針對(duì)以 NuGet 包形式發(fā)布的庫(kù), SuperWebSocket 雖然使用 NuGet 的 repository,但需要從網(wǎng)頁(yè)中下載。
也許等我抽出空來(lái),我會(huì)使用新的庫(kù)或已測(cè)試的庫(kù)的新版本進(jìn)行比較然后更新這篇文章。
趙亮-碧海情天
翻譯于 3年前
1人頂
頂?翻譯得不錯(cuò)哦!
Fleck
https://github.com/statianzo/Fleck
我發(fā)現(xiàn)這個(gè)庫(kù)真的是簡(jiǎn)單易用,對(duì)于庫(kù)、文檔、例子等都是,只要添加庫(kù),復(fù)制幾行例子里的代碼,然后運(yùn)行——就這么簡(jiǎn)單。
但是簡(jiǎn)單是有代價(jià)的:其功能并不強(qiáng)大,且可配置的地方太少。
private?static?void?Main(string[]?args)
{
?????var?server?=?new?WebSocketServer("ws://localhost:8181");
?????server.Start(socket?=>
?????{
??????????socket.OnOpen?=?()?=>?OnOpen(socket);
??????????socket.OnClose?=?()?=>?OnClose(socket);
??????????socket.OnMessage?=?m?=>?OnMessage(socket,?m);
?????});
}
?
對(duì)于簡(jiǎn)單快速的項(xiàng)目我會(huì)用它,如果你不需要用WebSocket發(fā)送太復(fù)雜的數(shù)據(jù)結(jié)構(gòu)、命令一樣的消息、或在客戶端無(wú)WebSocket支持時(shí)的備選方式,這就是你要的了。
優(yōu)點(diǎn):
-
簡(jiǎn)單
-
無(wú)依賴項(xiàng)
缺點(diǎn):
-
可配置項(xiàng)少
-
客戶端瀏覽器不支持WebSocket時(shí)就沒(méi)戲了
ayeah
翻譯于 3年前
1人頂
頂?翻譯得不錯(cuò)哦!
SignalR
http://www.asp.net/signalr
微軟出品是我認(rèn)為這個(gè)庫(kù)最大的優(yōu)點(diǎn)了。它已經(jīng)和現(xiàn)有的ASP.NET框架做了集成,對(duì)服務(wù)器端和客戶端代碼都做了很好的抽象類, 這意味著你不需要太深入了解協(xié)議的東西。然后它還可以很聰明地在客戶端瀏覽器不支持WebSocket時(shí)自動(dòng)使用別的通信機(jī)制。它還可以完成一些叫遠(yuǎn)程過(guò)程調(diào)用(RPC)的東西,從服務(wù)器到客戶端。?
它能廣播消息到所有客戶端,也能單獨(dú)發(fā)給指定用戶。對(duì)大量并發(fā)連接的處理也很優(yōu)秀。還有——它是開(kāi)源的!
ayeah
翻譯于 3年前
1人頂
頂?翻譯得不錯(cuò)哦!
聽(tīng)起來(lái)很棒是不?但是...它需要IIS8或者說(shuō)Windows Server 2012(Windows8也行,不過(guò)相信你不會(huì)在win8上面跑大項(xiàng)目的)。對(duì)我來(lái)說(shuō),這就是“微軟新一代值得買(mǎi)的操作系統(tǒng)”的超酷特性。如果開(kāi)發(fā)企業(yè)項(xiàng)目的話是不錯(cuò)的,但對(duì)小項(xiàng)目來(lái)說(shuō),為了這個(gè)開(kāi)源的庫(kù)買(mǎi)操作系統(tǒng)——太貴了。
?
當(dāng)然這些環(huán)境是WebSocket必須要求的. 這篇文章就是講WebSocket通訊的,所以我把這個(gè)算成大缺點(diǎn)。
public?class?MyHub1?:?Hub {public?void?Send(string?name,?string?message){//?Call?the?broadcastMessage?method?to?update?clients.Clients.All.broadcastMessage(name,?message);} }?
$(function?()?{
????var?chat?=?$.connection.myHub1;
????chat.client.broadcastMessage?=?function?(name,?message)?{
????????//...
????};
????$.connection.hub.start().done(function?()?{
????????$('#sendmessage').click(function?()?{
????????????chat.server.send('message');
????????});
????});
});
?
優(yōu)點(diǎn):
-
非常好的抽象
-
與IIS和ASP.NET緊密集成
-
很多候選方式
-
開(kāi)源
-
微軟官方庫(kù)
-
可擴(kuò)展性好
缺點(diǎn):
-
需要IIS8…
-
… 也就是Windows Server 2012太貴了
ayeah
翻譯于 3年前
1人頂
頂?翻譯得不錯(cuò)哦!
AlchemyWebSocket
http://alchemywebsockets.net/
當(dāng)我想到websocket庫(kù)時(shí),這個(gè)讓人不可思議。沒(méi)錯(cuò)這是真的。它可以排在Fleck后面,它非常容易使用,容易安裝(Nuget包可用),文檔中含有很好的例子。
它包含服務(wù)端和客戶端兩部分,同時(shí)也具有可伸縮性
static?void?Main(string[]?args) {//?創(chuàng)建一個(gè)新的server?-?接受端口和ip范圍,//?設(shè)置方法var?aServer?=?new?WebSocketServer(81,?IPAddress.Any){OnReceive?=?OnReceive,OnSend?=?OnSend,OnConnect?=?OnConnect,OnConnected?=?OnConnected,OnDisconnect?=?OnDisconnect,TimeOut?=?new?TimeSpan(0,?5,?0)};aServer.Start();string?consoleReadLine;do{consoleReadLine?=?Console.ReadLine();sockets.ForEach(s?=>?s.Send(consoleReadLine));}?while?(consoleReadLine?!=?"exit"); }?
但是它有一些別扭,我不能避開(kāi)。例如那里沒(méi)有簡(jiǎn)單的事件方法"OnReceive",僅僅只有string,事實(shí)上消息在客戶端被發(fā)送了。你必須你自己完成。是的,你必須調(diào)用,而且只能調(diào)用 .ToString()來(lái)得到真實(shí)的消息,但使用庫(kù)的目的是為了不要強(qiáng)迫自己實(shí)現(xiàn)通信協(xié)議。
private?static?void?OnReceive(UserContext?context)
{
????Console.WriteLine("Client?"?+?context.ClientAddress.ToString()?+?"?sended:?"?+?context.DataFrame.ToString());
}
MeiKai
翻譯于 3年前
1人頂
頂?翻譯得不錯(cuò)哦!
WebSocket服務(wù)器初始化方法首先接收端口然后是IP設(shè)置。我一直認(rèn)為,地址的表達(dá)應(yīng)該是先IP然后是端口,而且只有當(dāng)有必要指明端口的時(shí)候。還有超時(shí)設(shè)置:為什么必須有超時(shí)呢?我可以理解這有時(shí)可能是有用的,但它作為一個(gè)特性不應(yīng)作為主要設(shè)置之一。當(dāng)然,這只是一些細(xì)節(jié)問(wèn)題。
對(duì)我來(lái)說(shuō)這迫使你一開(kāi)始就得通過(guò)這個(gè)庫(kù)用另一層代碼把它抽象出來(lái)。
總之你可以試試,和Fleck比較一下性能,然后決定哪個(gè)更適合你的簡(jiǎn)單項(xiàng)目。
優(yōu)勢(shì):
-
簡(jiǎn)單
-
無(wú)依賴性
-
文檔完備
缺點(diǎn):
-
有點(diǎn)笨拙,比Fleck結(jié)構(gòu)更復(fù)雜
-
沒(méi)有 fallback
趙亮-碧海情天
翻譯于 3年前
1人頂
頂?翻譯得不錯(cuò)哦!
XSockets
http://xsockets.net/
這個(gè)庫(kù)看上去很有前途。我嘗試過(guò)它,并且還花了很多時(shí)間,用它工作超過(guò)其它的庫(kù)(甚至用來(lái)執(zhí)行測(cè)試工作等等)。但是很不幸我沒(méi)有運(yùn)氣,任何我考慮到的錯(cuò)誤在這個(gè)庫(kù)中都是錯(cuò)誤的,與代碼不一致的糟糕文檔。難道是因?yàn)榇a或者文檔過(guò)期了?它不容易安裝和運(yùn)行,事實(shí)上這個(gè)庫(kù)的使用樣例我很難組建和運(yùn)行。Xsocket更多向我們展示了MVC框架的樣子。我嘗試把它運(yùn)行在ASP.NET項(xiàng)目里面,MVC和WinService,遺憾的是沒(méi)有一個(gè)能夠工作。
我真的很想用這個(gè)庫(kù),但最后我放棄了以便支持更好的庫(kù)(閱讀其他)。認(rèn)真地說(shuō)為什么使用這個(gè)庫(kù)是困難的,甚至一個(gè)簡(jiǎn)單的項(xiàng)目。你可以預(yù)測(cè)更多的問(wèn)題當(dāng)把它使用在項(xiàng)目里,我強(qiáng)烈建議避開(kāi)這個(gè)項(xiàng)目。
public?static?class?XSocketsBootstrap
{
????private?static?IXBaseServerContainer?wss;
????public?static?void?Start()
????{????????????
????????wss?=?XSockets.Plugin.Framework.Composable.GetExport();
????????wss.StartServers();
????}
}
?
<p>Advantages:</p>
<ul>
<li>Seems?powerful</li>
<li>Should?have?good?JavaScript?integration</li>
</ul>
<p>Disadvantages:</p>
<ul>
<li>Complicated?and?hard</li>
<li>Complicated?to?configure?and?run?inside?of?WebForms,?MVC?and?WinService</li>
<li>Differences?between?code?and?documentation</li>
<li>Outdated?documentation?and?examples</li>
</ul>
</li>
<li>
<h2>Microsoft.WebSocket</h2>
<p><a?href="http://msdn.microsoft.com/en-us/hh969243.aspx">http://msdn.microsoft.com/en-us/hh969243.aspx</a></p>
<p>Another?library?from?Microsoft.?And?it?requires?IIS?8?too,?so?I?did?not?have?means?to?test?it.?Examples?are?really?low?level,?so?it?force?you?to?deal?with?buffers?and?streams?instead?of?strings.?In?some?cases?this?can?be?good,?but?mostly?there?is?no?point.?If?you?have?IIS?8?on?server?why?bother?with?this?library?if?you?can?use?SignalR,?which?will?take?care?most?of?the?stuff?for?you.</p>
<p>I?think?this?is?more?of?proof-of-concept?then?usable?library.</p>
<pre>int?count?=?receiveResult.Count;
while?(receiveResult.EndOfMessage?==?false)
{
????if?(count?>=?maxMessageSize)
????{
????????string?closeMessage?=?string.Format("Maximum?message?size:?{0}?bytes.",?maxMessageSize);
????????await?socket.CloseAsync(WebSocketCloseStatus.MessageTooBig,?closeMessage,?CancellationToken.None);
????????return;
????}?receiveResult?=?await?socket.ReceiveAsync(new?ArraySegment(receiveBuffer,?count,?maxMessageSize?-?count),?CancellationToken.None);
????count?+=?receiveResult.Count;
}?var?receivedString?=?Encoding.UTF8.GetString(receiveBuffer,?0,?count);
var?echoString?=?"You?said?"?+?receivedString;
ArraySegment?outputBuffer?=?new?ArraySegment(Encoding.UTF8.GetBytes(echoString));
await?socket.SendAsync(outputBuffer,?WebSocketMessageType.Text,?true,?CancellationToken.None);
MeiKai
翻譯于 3年前
1人頂
頂?翻譯得不錯(cuò)哦!
SuperWebsocket
http://superwebsocket.codeplex.com/
最后但并不是最不重要的是SuperWebsocket。我對(duì)這個(gè)有一點(diǎn)懷疑(如果我沒(méi)記錯(cuò)的話,這僅僅是一個(gè)我通過(guò)NuGet網(wǎng)站發(fā)現(xiàn)的包,但又不是一個(gè)可用的包)。它似乎有一點(diǎn)復(fù)雜,但實(shí)際上它是非常簡(jiǎn)單的。有文獻(xiàn)支持的例子幫助你一步步的從最簡(jiǎn)單的WebSocket服務(wù)器,到有命令請(qǐng)求,JSON,多服務(wù)器實(shí)例,.config文件配置或者更多的復(fù)雜Websocket服務(wù)器。
這個(gè)庫(kù)也許沒(méi)有包含所有其他庫(kù)有的那些很酷的特性,但是這沒(méi)關(guān)系,因?yàn)樗歉叨瓤膳渲玫?#xff0c;你可以很容易的讓它實(shí)現(xiàn)你想要的。它可以作為控制臺(tái)應(yīng)用程序或者windows服務(wù)運(yùn)行于ASP.NET中。文獻(xiàn)上則建議以系統(tǒng)服務(wù)的形式來(lái)運(yùn)行服務(wù)器。從我的經(jīng)驗(yàn)來(lái)看,建議不要在一個(gè)web應(yīng)用程序里面運(yùn)行它因?yàn)檫@種解決方案很慢(非常糟糕的表現(xiàn),比控制臺(tái)應(yīng)用程序大約慢50倍)。從另一方面,獨(dú)立的服務(wù)器應(yīng)用程序,需要運(yùn)行.exe結(jié)尾的文件,這個(gè)文件并不是庫(kù)的一部分,但是是SuperSocket項(xiàng)目的一部分(SuperWebSocket就是基于這個(gè)項(xiàng)目的)。這使得你需要一點(diǎn)技巧在調(diào)試會(huì)話中開(kāi)啟服務(wù)器,或者完全啟用調(diào)試。當(dāng)你作為應(yīng)用程序運(yùn)行服務(wù)器的時(shí)候,雖然這不是解決方案的一部分,也需要確保服務(wù)器采用來(lái)自其他項(xiàng)目的最新版的組件。
獨(dú)步寒風(fēng)
翻譯于 3年前
1人頂
頂?翻譯得不錯(cuò)哦!
作為回報(bào),你得到了關(guān)于靈活的WebSocket的眾所周知的解決方案。
它仍然是開(kāi)源的所以你可以根據(jù)需要改變它。
從另一方面,你可能把這個(gè)服務(wù)器缺乏JavaScript客戶端看做是它的缺點(diǎn)(但是它有C#客戶端)。這個(gè)服務(wù)器也有第三方的依賴關(guān)系。
在使用這個(gè)庫(kù)工作了幾個(gè)月之后我沒(méi)發(fā)現(xiàn)什么主要的問(wèn)題。
缺點(diǎn)和優(yōu)點(diǎn):
-
無(wú)備用通信
-
依賴
-
優(yōu)雅的特性和高度可配置性
-
很棒的例子
-
例子的都有推薦設(shè)置的文檔
-
可以作為windows服務(wù)和ASP.NET模塊和控制臺(tái)應(yīng)用程序運(yùn)行
-
好的性能表現(xiàn)
總結(jié)
對(duì)于復(fù)雜的解決方案/項(xiàng)目我建議用SuperWebSocket,因?yàn)樗且粋€(gè)穩(wěn)定而且高度可配置的庫(kù)。對(duì)于簡(jiǎn)單和需要快速開(kāi)發(fā)的項(xiàng)目我會(huì)選擇Fleck,但是如果有辦法使用最新的windows服務(wù)器來(lái)作為測(cè)試和生產(chǎn)機(jī)器的話,我會(huì)放棄使用這兩個(gè)而選擇SignalR。
總結(jié)
以上是生活随笔為你收集整理的【转】.NET 的 WebSocket 开发包比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2017交通银行白金卡可以网上申请吗
- 下一篇: 可转债基金和可转债的区别,划重点啦!