本文出现在第三方产品评论区。本栏目文章仅供会员使用,不得被工具商以任何方式或形式用于宣传或宣传其产品。要求会员报告任何垃圾邮件或广告。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技术中的经典框架(http://en.wikipedia.org/wiki/Server-sent_events)/cometdaily.com/2007/11/05/the-forever-frame-technique/)但现在我们有了更好的选择:WebSocket。它的标准于2011年发布,并已在现代浏览器中实施了一段时间。它更好的原因是使用更安全和成熟的协议,带来改进和升级。小提示:这个比较是几个月前做的,所以可能不够及时,但是如果有人正在寻找一个好的WebSocket库,我认为它对他还是有用的。此比较仅适用于以NuGet包形式发布的库。SuperWebSocket虽然使用了NuGet仓库,但是需要从网页上下载。也许当我有时间的时候,我会用一个新的库或我测试过的库的新版本来比较和更新这篇文章。Fleckhttps://github.com/statianzo/Fleck我发现这个库真的很好用,对于库、文档、示例等,只需添加库,从示例中复制几行代码,然后运行-就这么简单。但是简单是有代价的:它不是很强大,而且可配置的地方太少了。privatestaticvoidMain(string[]args){varserver=newWebSocketServer("ws://localhost:8181");server.Start(socket=>{socket.OnOpen=()=>OnOpen(socket);socket.OnClose=()=>OnClose(socket);socket.OnMessage=m=>OnMessage(socket,m);});}我会将它用于简单快速的项目,如果你不需要使用WebSocket发送过于复杂的数据结构,与命令消息相同,或者当客户端不支持WebSocket时作为替代方案,这就是你想要的.优点:简单无依赖缺点:可配置项少当客户端浏览器不支持WebSocket时,将无用武之地。SignalRhttp://www.asp.net/signalr是微软出品的,我觉得是这个库最大的优势。它已经与现有的ASP.NET框架进行了整合,并为服务器端和客户端代码都做了很好的抽象类,这意味着你不需要对协议了解太多。然后当客户端浏览器不支持WebSocket时,它可以足够聪明地自动使用其他通信机制。它还可以执行从服务器到客户端的称为远程过程调用(RPC)的操作。它可以向所有客户端广播消息,也可以将消息单独发送给指定的用户。它还能很好地处理大量并发连接。而且-它是开源的!听起来不错不是吗?但是...它需要IIS8或WindowsServer2012(Windows8也可以,但我相信你不会在win8上运行大项目)。对我来说,这就是“微软的下一代操作系统值得购买”的妙处。如果你开发企业项目很好,但对于小项目,为这个开源库购买操作系统——太贵了。当然,这些环境都是WebSocket所需要的。这篇文章是关于WebSocket通信的,所以我认为这是一个很大的缺点。publicclassMyHub1:Hub{publicvoidSend(stringname,stringmessage){//调用broadcastMessage方法更新clients.Clients.All.broadcastMessage(name,message);}}$(function(){varchat=$.connection.myHub1;chat.client.broadcastMessage=function(name,message){//...};$.connection.hub.start().done(function(){$('#sendmessage').click(function(){chat.server.send('message');});});});优点:很好的抽象与IIS和ASP.NET紧密集成许多候选人开源微软的官方库良好的可扩展性缺点:需要IIS8...即WindowsServer2012太贵了#p#AlchemyWebSockethttp://alchemywebsockets.net/当我想想websocket库,这个是不可思议的。是的,它是真实的。它可以与Fleck并驾齐驱,它非常易于使用、易于安装(提供Nuget包),并且文档中有很好的示例。它包含server和client两部分,也有可扩展性staticvoidMain(string[]args){//创建一个新的server-accept端口和ip范围,//设置方法varaServer=newWebSocketServer(81,IPAddress.Any){OnReceive=OnReceive,OnSend=OnSend,OnConnect=OnConnect,OnConnected=OnConnected,OnDisconnect=OnDisconnect,TimeOut=newTimeSpan(0,5,0)};aServer.Start();字符串控制台读取行;做{consoleReadLine=Console.ReadLine();sockets.ForEach(s=>s.Send(consoleReadLine));}while(consoleReadLine!="exit");但这有点尴尬,我无法绕过它。例如,没有简单的事件方法“OnReceive”,只有字符串,以及消息是在客户端发送的。你必须自己做。是的,您必须调用,并且只能调用.ToString()来获取实际消息,但使用该库的要点是不要强迫自己实现通信协议。privatestaticvoidOnReceive(UserContextcontext){Console.WriteLine("Client"+context.ClientAddress.ToString()+"sended:"+context.DataFrame.ToString());WebSocket服务器初始化方法首先接收端口,然后接收IP设置。我一直认为地址的表达方式应该是先IP后端口,只有在需要指定端口的时候才可以。还有超时设置:为什么一定要有超时呢?我能理解这有时可能会有用,但作为一项功能,它不应该成为主要设置之一。当然,这只是细节问题。对我来说,这迫使您首先通过库将其抽象为另一层代码。总之,你可以试试看,和Fleck比较一下性能,再决定哪一个更适合你的简单项目。优点:简单没有依赖性有据可查缺点:有点笨拙,比Fleck结构更复杂没有回退XSocketshttp://xsockets.net/这个库看起来很有前途。我已经尝试过,并花了很多时间在其他库上使用它(甚至用于测试等)。但不幸的是我没有运气,我认为的任何错误都是这个库中的错误,糟糕的文档与代码不一致。是因为代码或文档过时了吗?安装和运行并不容易,事实上我很难构建和运行该库的示例用法。Xsocket向我们展示了更多有关MVC框架的信息。我尝试在ASP.NET项目、MVC和WinService中运行它,不幸的是它们都不起作用。我真的很想使用这个库,但是***我放弃了,转而使用更好的库(阅读其他)。说真的,为什么使用这个库很困难,即使对于一个简单的项目也是如此。在项目中使用它可以预测更多问题,我强烈建议避免这个项目。publicstaticclassXSocketsBootstrap{privatestaticIXBaseServerContainerwss;publicstaticvoidStart(){wss=XSockets.Plugin.Framework.Composable.GetExport();wss.StartServers();}}
优点:
- 看起来很强大
- 应该很好的JavaScript集成
缺点:
- 复杂难
- 在WebForms、MVC和WinService中配置和运行很复杂
- 代码和文档之间的差异
- 过时的文档和示例
Microsoft.WebSocket
Microsoft的另一个库。它也需要IIS8,所以我没有办法测试它。例子真的很低级,所以强制你不处理缓冲区和stremsinsteadofstrings。在某些情况下,这可能是好的,但大多数情况下没有意义。如果服务器上有IIS8,如果可以使用SignalR,为什么还要用这个库,它会为你处理大部分内容。
我认为这是更多的概念验证然后可用的库。
intcount=receiveResult.Count;while(receiveResult.EndOfMessage==false){if(count>=maxMessageSize){stringcloseMessage=string.Format("Maximummessagesize:{0}bytes.",maxMessageSize);waitsocket.CloseAsync(WebSocketCloseStatus.MessageTooBig、closeMessage、CancellationToken.None);返回;}receiveResult=awaitsocket.ReceiveAsync(newArraySegment(receiveBuffer,count,maxMessageSize-count),CancellationToken.None);count+=receiveResult.Count;}varreceivedString=Encoding.UTF8.GetString(receiveBuffer,0,count);varechoString="Yousaid"+receivedString;ArraySegmentoutputBuffer=newArraySegment(编码.UTF8.GetBytes(echoString));waitsocket.SendAsync(outputBuffer,WebSocketMessageType.Text,true,CancellationToken.None);SuperWebsockethttp://superwebsocket.codeplex.com/***但尤其是SuperWebsocket我对此有点怀疑(如果我没记错的话,它只是我通过NuGet网站找到的一个包,但同样不是可用的包)。它可能看起来有点复杂,但实际上非常简单。文档示例可帮助您逐步从最简单的WebSocket服务器到具有命令请求、JSON、多个服务器实例、.config文件配置等的复杂WebSocket服务器。这个库可能没有所有其他库所具有的所有很酷的特性,但这没关系,因为它是高度可配置的,你可以很容易地让它做你想做的事。它可以作为控制台应用程序或Windows服务在ASP.NET中运行。文献建议将服务器作为系统服务运行。根据我的经验,不建议在Web应用程序中运行它,因为这种解决方案很慢(性能非常差,比控制台应用程序慢大约50倍)。另一方面,独立服务器应用程序需要运行以.exe结尾的文件,这些文件不是库的一部分,而是SuperSocket项目(SuperWebSocket所基于的项目)的一部分。这使得在调试会话中启动服务器或完全启用调试变得有点棘手。当您将服务器作为应用程序运行时,虽然它不是解决方案的一部分,但您还需要确保服务器使用来自其他项目的最新版本的组件。作为回报,您将获得著名的灵活WebSocket解决方案。它仍然是开源的,因此您可以根据需要更改它。另一方面,您可能会认为服务器缺少JavaScript客户端是一个弱点(但它确实有C#客户端)。该服务器还具有第三方依赖项。使用这个库几个月后,我没有发现任何重大问题。缺点和优点:没有回退通信依赖性优雅的功能和高度可配置的很好的例子带有推荐设置的文档可以作为Windows服务和ASP.NET模块和控制台应用程序运行良好的性能总结对于复杂的对于解决方案/项目,我推荐SuperWebSocket,因为它是稳定且高度可配置的库。对于简单且需要快速开发的项目,我会选择Fleck,但如果有办法使用最新的windowsserver作为测试和生产机器,我会放弃使用这两个而选择SignalR。英文原文:WebSocketlibrariescomparison原文链接:http://www.oschina.net/translate/websocket-libraries-comparison-2