中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

.NET 的 WebSocket 開(kāi)發(fā)包比較

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

 編者按

  本文出現(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/)

  但現(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)行比較然后更新這篇文章。

 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)戲了

 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)源的!

  聽(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太貴了

 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());
}

  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

 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);

 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)樗歉叨瓤膳渲玫,你可以很容易的讓它?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)目的最新版的組件。

  作為回報(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。

  原文地址:http://www.codeproject.com/Articles/733297/WebSocket-libraries-comparison-2

標(biāo)簽: 安全 代碼 服務(wù)器 服務(wù)器端 通信

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:Visual Studio原生開(kāi)發(fā)的10個(gè)調(diào)試技巧(一)

下一篇:C# 6與VB 12即將加入模式匹配