【转】.NET 的 WebSocket 开发包比较

转载于http://www.oschina.net/translate/websocket-libraries-comparison-2

 

编者按

本文出现在第三方产品评论部分中。在这一部分的文章只提供给会员,不允许工具供应商用来以任何方式和形式来促销或宣传产品。请会员报告任何垃圾信息或广告。

Web项目常常需要将数据尽可能快地推送给客户,必要时无需等待客户端请求。对于与用户之间进行实时通信的网站,例如在线交流或文档协作工具,或者在长期运行的计算/执行任务的服务器上更新系统状态,等等这些时候,采用双向沟通机制是理想的。

以前,这类问题一般使用下面的解决方案:

  • 使用 Flash 中的 Socket 连接(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html)

  • Ajax 长轮询(https://gist.github.com/jasdeepkhalsa/4353139)

  • 服务器发送事件... (http://en.wikipedia.org/wiki/Server-sent_events)

  • ...或者就用 IE 中经典的 Frame 技术Smile (http://cometdaily.com/2007/11/05/the-forever-frame-technique/)

赵亮-碧海情天

赵亮-碧海情天

翻译于 3年前

2人顶

顶 翻译得不错哦!

但现在我们有了更好的选择:WebSocket。它的标准在2011年发布,在现代浏览器上已实施了一段时间。它更好的原因是使用更安全和更成熟的协议,带来了改进和升级。

略注:

这份比较是几个月前做的,可能不够及时,但如果有人要找好的WebSocket库,我认为这对他仍然是有用的。

本比较只针对以 NuGet 包形式发布的库, SuperWebSocket 虽然使用 NuGet 的 repository,但需要从网页中下载。

也许等我抽出空来,我会使用新的库或已测试的库的新版本进行比较然后更新这篇文章。

赵亮-碧海情天

赵亮-碧海情天

翻译于 3年前

1人顶

顶 翻译得不错哦!

Fleck

https://github.com/statianzo/Fleck

我发现这个库真的是简单易用,对于库、文档、例子等都是,只要添加库,复制几行例子里的代码,然后运行——就这么简单。

但是简单是有代价的:其功能并不强大,且可配置的地方太少。

 
  1. private static void Main(string[] args)

  2. {

  3.      var server = new WebSocketServer("ws://localhost:8181");

  4.      server.Start(socket =>

  5.      {

  6.           socket.OnOpen = () => OnOpen(socket);

  7.           socket.OnClose = () => OnClose(socket);

  8.           socket.OnMessage = m => OnMessage(socket, m);

  9.      });

  10. }

 

对于简单快速的项目我会用它,如果你不需要用WebSocket发送太复杂的数据结构、命令一样的消息、或在客户端无WebSocket支持时的备选方式,这就是你要的了。

优点:

  • 简单

  • 无依赖项

缺点:

  • 可配置项少

  • 客户端浏览器不支持WebSocket时就没戏了

ayeah

ayeah

翻译于 3年前

1人顶

顶 翻译得不错哦!

SignalR

http://www.asp.net/signalr

微软出品是我认为这个库最大的优点了。它已经和现有的ASP.NET框架做了集成,对服务器端和客户端代码都做了很好的抽象类, 这意味着你不需要太深入了解协议的东西。然后它还可以很聪明地在客户端浏览器不支持WebSocket时自动使用别的通信机制。它还可以完成一些叫远程过程调用(RPC)的东西,从服务器到客户端。 

它能广播消息到所有客户端,也能单独发给指定用户。对大量并发连接的处理也很优秀。还有——它是开源的!

ayeah

ayeah

翻译于 3年前

1人顶

顶 翻译得不错哦!

听起来很棒是不?但是...它需要IIS8或者说Windows Server 2012(Windows8也行,不过相信你不会在win8上面跑大项目的)。对我来说,这就是“微软新一代值得买的操作系统”的超酷特性。如果开发企业项目的话是不错的,但对小项目来说,为了这个开源的库买操作系统——太贵了。

 

当然这些环境是WebSocket必须要求的. 这篇文章就是讲WebSocket通讯的,所以我把这个算成大缺点。

public class MyHub1 : Hub
{public void Send(string name, string message){// Call the broadcastMessage method to update clients.Clients.All.broadcastMessage(name, message);}
}

 

 
  1. $(function () {

  2.     var chat = $.connection.myHub1;

  3.     chat.client.broadcastMessage = function (name, message) {

  4.         //...

  5.     };

  6.     $.connection.hub.start().done(function () {

  7.         $('#sendmessage').click(function () {

  8.             chat.server.send('message');

  9.         });

  10.     });

  11. });

 

优点:

  • 非常好的抽象

  • 与IIS和ASP.NET紧密集成

  • 很多候选方式

  • 开源

  • 微软官方库

  • 可扩展性好

缺点:

  • 需要IIS8…

  • … 也就是Windows Server 2012太贵了

ayeah

ayeah

翻译于 3年前

1人顶

顶 翻译得不错哦!

AlchemyWebSocket

http://alchemywebsockets.net/

当我想到websocket库时,这个让人不可思议。没错这是真的。它可以排在Fleck后面,它非常容易使用,容易安装(Nuget包可用),文档中含有很好的例子。

它包含服务端和客户端两部分,同时也具有可伸缩性

static void Main(string[] args)
{// 创建一个新的server - 接受端口和ip范围,// 设置方法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");
}

 

但是它有一些别扭,我不能避开。例如那里没有简单的事件方法"OnReceive",仅仅只有string,事实上消息在客户端被发送了。你必须你自己完成。是的,你必须调用,而且只能调用 .ToString()来得到真实的消息,但使用库的目的是为了不要强迫自己实现通信协议。

 
  1. private static void OnReceive(UserContext context)

  2. {

  3.     Console.WriteLine("Client " + context.ClientAddress.ToString() + " sended: " + context.DataFrame.ToString());

  4. }

MeiKai

MeiKai

翻译于 3年前

1人顶

顶 翻译得不错哦!

WebSocket服务器初始化方法首先接收端口然后是IP设置。我一直认为,地址的表达应该是先IP然后是端口,而且只有当有必要指明端口的时候。还有超时设置:为什么必须有超时呢?我可以理解这有时可能是有用的,但它作为一个特性不应作为主要设置之一。当然,这只是一些细节问题。

对我来说这迫使你一开始就得通过这个库用另一层代码把它抽象出来。

总之你可以试试,和Fleck比较一下性能,然后决定哪个更适合你的简单项目。

优势:

  • 简单

  • 无依赖性

  • 文档完备

缺点:

  • 有点笨拙,比Fleck结构更复杂

  • 没有 fallback

赵亮-碧海情天

赵亮-碧海情天

翻译于 3年前

1人顶

顶 翻译得不错哦!

XSockets

http://xsockets.net/

这个库看上去很有前途。我尝试过它,并且还花了很多时间,用它工作超过其它的库(甚至用来执行测试工作等等)。但是很不幸我没有运气,任何我考虑到的错误在这个库中都是错误的,与代码不一致的糟糕文档。难道是因为代码或者文档过期了?它不容易安装和运行,事实上这个库的使用样例我很难组建和运行。Xsocket更多向我们展示了MVC框架的样子。我尝试把它运行在ASP.NET项目里面,MVC和WinService,遗憾的是没有一个能够工作。

我真的很想用这个库,但最后我放弃了以便支持更好的库(阅读其他)。认真地说为什么使用这个库是困难的,甚至一个简单的项目。你可以预测更多的问题当把它使用在项目里,我强烈建议避开这个项目。

 
  1. public static class XSocketsBootstrap

  2. {

  3.     private static IXBaseServerContainer wss;

  4.     public static void Start()

  5.     {            

  6.         wss = XSockets.Plugin.Framework.Composable.GetExport();

  7.         wss.StartServers();

  8.     }

  9. }

 

 
  1. <p>Advantages:</p>

  2. <ul>

  3. <li>Seems powerful</li>

  4. <li>Should have good JavaScript integration</li>

  5. </ul>

  6. <p>Disadvantages:</p>

  7. <ul>

  8. <li>Complicated and hard</li>

  9. <li>Complicated to configure and run inside of WebForms, MVC and WinService</li>

  10. <li>Differences between code and documentation</li>

  11. <li>Outdated documentation and examples</li>

  12. </ul>

  13. </li>

  14. <li>

  15. <h2>Microsoft.WebSocket</h2>

  16. <p><a href="http://msdn.microsoft.com/en-us/hh969243.aspx">http://msdn.microsoft.com/en-us/hh969243.aspx</a></p>

  17. <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>

  18. <p>I think this is more of proof-of-concept then usable library.</p>

  19. <pre>int count = receiveResult.Count;

  20.  
  21. while (receiveResult.EndOfMessage == false)

  22. {

  23.     if (count >= maxMessageSize)

  24.     {

  25.         string closeMessage = string.Format("Maximum message size: {0} bytes.", maxMessageSize);

  26.         await socket.CloseAsync(WebSocketCloseStatus.MessageTooBig, closeMessage, CancellationToken.None);

  27.         return;

  28.     } receiveResult = await socket.ReceiveAsync(new ArraySegment(receiveBuffer, count, maxMessageSize - count), CancellationToken.None);

  29.     count += receiveResult.Count;

  30. } var receivedString = Encoding.UTF8.GetString(receiveBuffer, 0, count);

  31. var echoString = "You said " + receivedString;

  32. ArraySegment outputBuffer = new ArraySegment(Encoding.UTF8.GetBytes(echoString));

  33. await socket.SendAsync(outputBuffer, WebSocketMessageType.Text, true, CancellationToken.None);

MeiKai

MeiKai

翻译于 3年前

1人顶

顶 翻译得不错哦!

SuperWebsocket

http://superwebsocket.codeplex.com/

最后但并不是最不重要的是SuperWebsocket。我对这个有一点怀疑(如果我没记错的话,这仅仅是一个我通过NuGet网站发现的包,但又不是一个可用的包)。它似乎有一点复杂,但实际上它是非常简单的。有文献支持的例子帮助你一步步的从最简单的WebSocket服务器,到有命令请求,JSON,多服务器实例,.config文件配置或者更多的复杂Websocket服务器。

这个库也许没有包含所有其他库有的那些很酷的特性,但是这没关系,因为它是高度可配置的,你可以很容易的让它实现你想要的。它可以作为控制台应用程序或者windows服务运行于ASP.NET中。文献上则建议以系统服务的形式来运行服务器。从我的经验来看,建议不要在一个web应用程序里面运行它因为这种解决方案很慢(非常糟糕的表现,比控制台应用程序大约慢50倍)。从另一方面,独立的服务器应用程序,需要运行.exe结尾的文件,这个文件并不是库的一部分,但是是SuperSocket项目的一部分(SuperWebSocket就是基于这个项目的)。这使得你需要一点技巧在调试会话中开启服务器,或者完全启用调试。当你作为应用程序运行服务器的时候,虽然这不是解决方案的一部分,也需要确保服务器采用来自其他项目的最新版的组件。

独步寒风

独步寒风

翻译于 3年前

1人顶

顶 翻译得不错哦!

作为回报,你得到了关于灵活的WebSocket的众所周知的解决方案。

它仍然是开源的所以你可以根据需要改变它。

从另一方面,你可能把这个服务器缺乏JavaScript客户端看做是它的缺点(但是它有C#客户端)。这个服务器也有第三方的依赖关系。

在使用这个库工作了几个月之后我没发现什么主要的问题。

缺点和优点:

  • 无备用通信

  • 依赖

  • 优雅的特性和高度可配置性

  • 很棒的例子

  • 例子的都有推荐设置的文档

  • 可以作为windows服务和ASP.NET模块和控制台应用程序运行

  • 好的性能表现

总结

对于复杂的解决方案/项目我建议用SuperWebSocket,因为它是一个稳定而且高度可配置的库。对于简单和需要快速开发的项目我会选择Fleck,但是如果有办法使用最新的windows服务器来作为测试和生产机器的话,我会放弃使用这两个而选择SignalR。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb checkbox选中和不选中_UE4 4.23 RetainerBox 选中框位置不正确

Bug表现在UE4 4.23版本&#xff0c;实现自定义控件时&#xff0c;继承了RetainerBox&#xff0c;发现当内部包裹子控件时&#xff0c;先编辑器面板选中子物体&#xff0c;发现选中位置有偏移。位置偏移当窗口缩放时&#xff0c;选中框位置发现当窗口最小化时&#xff0c;偏移位…

去哪查阅ISO国际标准?

ISO官网 访问ISO官网&#xff0c;不需要翻墙&#xff0c;只要懂点英文就行。 ISO官网地址&#xff1a;https://www.iso.org/&#xff08;可进行全面了解、购买付费内容&#xff09; ISO部分公开标准下载地址&#xff1a;https://standards.iso.org/ittf/PubliclyAvailableSt…

【转】开源的C# websocket-sharp组件解析

下面我们介绍一款WebSocket组件websocket-sharp的相关内容。 一.websocket-sharp组件概述 websocket-sharp是一个C#实现websocket协议客户端和服务端&#xff0c;websocket-sharp支持RFC 6455&#xff1b;WebSocket客户端和服务器&#xff1b;消息压缩扩展&#xff1b;安全连接…

java异或_JAVA面试必备之HashMap必会点

今天我们就面试会问到关于HashMap的问题进行一个汇总&#xff0c;以及对这些问题进行解答。1、HashMap的数据结构是什么&#xff1f;2、为啥是线程不安全的&#xff1f;3、Hash算法是怎样实现的&#xff1f;4、HashMap是如何处理Hash碰撞的&#xff1f;5、增加元素的方法是怎么…

对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字

关注我——个人公众号&#xff1a;后端技术漫谈我目前是一名后端开发工程师。主要关注后端开发&#xff0c;数据安全&#xff0c;网络爬虫&#xff0c;物联网&#xff0c;边缘计算等方向。原创博客主要内容Java知识点复习全手册Leetcode算法题解析剑指offer算法题解析SpringClo…

rabbitmq导出队列_消息队列BCMQ在大云运维管理平台BCDeepWatch中的应用

友情提示&#xff1a;全文约2600字&#xff0c;预计阅读时间12分钟摘要消息队列作为重要的中间件&#xff0c;广泛用于分布式系统中各子系统间的异步解耦&#xff1b;本文主要介绍了大云消息队列中间件BC-MQ在BC-DeepWatch中的应用案例。一、消息队列应用场景简介消息队列是分布…

【编译原理】如何编写BNF?

此篇文章承接上一篇&#xff1a;【编译原理】理解BNF 前言 理解了BNF&#xff0c;就能实现代码解析了吗&#xff1f;还有点早&#xff0c;因为理解了BNF&#xff0c;还要会写BNF。实际上&#xff0c;BNF实现有固定的模式&#xff0c;也有现成的工具&#xff0c;比如可以使用ya…

python 当前时间减一个月_python排序了解一下

排序是每个开发人员都需要掌握的技能。排序是对程序本身有一个全面的理解。不同的排序算法很好地展示了算法设计上如何强烈的影响程序的复杂度、运行速度和效率。今天的文章和谈谈大家都熟悉的各种排序使用 Python 如何实现&#xff0c;废话就不多说啦&#xff0c;开干&#xf…

【转】4.1触碰jQuery:AJAX异步详解

传送门&#xff1a;异步编程系列目录…… 示例源码&#xff1a;触碰jQuery&#xff1a;AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。它并非一种新的技术&#xff0c;而是以下几种原有技术的结合体。 1) 使…

QStackedWidget实现自适应紧凑布局

前言 本文提出了一种使QStackedWidget尺寸根据内容自适应调整的解决方法。 问题提出 我们知道&#xff0c;QStackedWidget可以包含多个可切换的子窗口。多个子窗口的高度不一样时&#xff0c;此时将QStackedWidget放在一个垂直布局中&#xff0c;所有子窗口会保持和最高的子…

linux查看tcl版本_查看Linux内核版本的方法有几个?你也是这样操作吗?

请关注本头条号&#xff0c;每天坚持更新原创干货技术文章。如需学习视频&#xff0c;请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言内核是操作系统的核心组件。 它管理系统的资源&#xff0c;是计算机硬件和软件之间的桥梁。您可能因多种原因需要确切知道GNU / …

【转】4.2使用jQuery.form插件,实现完美的表单异步提交

传送门&#xff1a;异步编程系列目录…… 示例下载&#xff1a;使用jQuery.form插件&#xff0c;实现完美的表单异步提交.rar 抓住6月份的尾巴&#xff0c;今天的主题是 今天我想介绍的是一款jQuery的插件&#xff1a;Jquery.form.js 官网。 通过该插件&#xff0c;我们可以非常…

什么方式可以通过影子系统传播恶意代码_将恶意代码隐藏在图像中:揭秘恶意软件使用的隐写术...

概述本周&#xff0c;许多Facebook用户都会发现&#xff0c;一些用户发布图片上出现了原本应该隐藏的图像标签。由此可以证明&#xff0c;图像可以携带大量表面上不可见的数据。实际上&#xff0c;Facebook和Instagram所使用的图片元数据与恶意攻击者制作的特制图像相比显得非常…

无法嵌入互操作类型 请改用适用的接口_西门子COMOS软件开发定制学习7-嵌入谷歌浏览器内核...

首先需要声明的是&#xff0c;本篇并非COMOS实用案例&#xff0c;只是希望借此让大家了解&#xff0c;如何使用微软的WPF和C#语言开发COMOS插件。首先看下效果图功能说明&#xff1a;拖拽COMOS设备至定制的浏览器&#xff0c;自动根据设备的名称和其制造商参数值&#xff0c;搜…

【转】C#与C++的发展历程第一 - 由C#3.0起

C#5.0作为第五个C#的重要版本&#xff0c;将异步编程的易用度推向一个新的高峰。通过新增的async和await关键字&#xff0c;几乎可以使用同编写同步代码一样的方式来编写异步代码。 本文将重点介绍下新版C#的异步特性以及部分其他方面的改进。同时也将介绍WinRT程序一些异步编…

【转】5.2高性能IO模型浅析

服务器端编程经常需要构造高性能的IO模型&#xff0c;常见的IO模型有四种&#xff1a; &#xff08;1&#xff09;同步阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;即传统的IO模型。 &#xff08;2&#xff09;同步非阻塞IO&#xff08;Non-blocking IO&#xff0…

vba 修改文本文档 指定行_VBA程序报错,用调试三法宝,bug不存在的

如果把VBA比作一门刀法&#xff0c;那么经过前面内容的操练&#xff0c;大家已经掌握了很多实用的招式。如果我们在刀法招式的基础之上&#xff0c;再掌握更多的“磨刀”心法&#xff0c;那么我们的刀用起来才会又好又快。所以今天主要和大家分享——VBA“磨刀”心法之程序调试…

mqtt协议详解_IoT物联网设备上云技术方案详解

随着传感器和通信技术的不断发展&#xff0c;物联网行业方兴未艾&#xff0c;业务链路涉及数据采集&#xff0c;通信连接&#xff0c;数据存储&#xff0c;数据可视化&#xff0c;洞察&#xff0c;行动决策。但&#xff0c;在实施过程中&#xff0c;碎片化的设备端通信连接难题…

【转】基于WebSocketSharp 的IM 简单实现

websocket-sharp 是一个websocket的C#实现&#xff0c;支持.net 3.5及以上来开发服务端或者客户端。本文主要介绍用websocket-sharp来做服务端、JavaScript做客户端来实现一个简单的IM。 WebSocketBehavior WebSocketBehavior是核心对象&#xff0c;他包含了OnOpen,OnMessage…

【转】极限编程一览

极限编程&#xff08;XP&#xff09;起源始于1990年代。当时肯特布莱克&#xff08;Kent Black&#xff09;在戴姆勒克莱斯勒&#xff08;DaimlerChrysler&#xff09;处理项目时&#xff0c;试图寻找一种更好的软件开发方法。他的创立新方法后来被称为极限编程方法论&#xff…