AlchemyWebSocket

http://alchemywebsockets.net/

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

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

  1. static void Main(string[] args)
  2. {
  3. // 创建一个新的server - 接受端口和ip范围,
  4. // 设置方法
  5. var aServer = new WebSocketServer(81, IPAddress.Any)
  6. {
  7. OnReceive = OnReceive,
  8. OnSend = OnSend,
  9. OnConnect = OnConnect,
  10. OnConnected = OnConnected,
  11. OnDisconnect = OnDisconnect,
  12. TimeOut = new TimeSpan(0, 5, 0)
  13. };
  14. aServer.Start();
  15. string consoleReadLine;
  16. do
  17. {
  18. consoleReadLine = Console.ReadLine();
  19. sockets.ForEach(s => s.Send(consoleReadLine));
  20. } while (consoleReadLine != "exit");
  21. }

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

  1. private static void OnReceive(UserContext context)
  2. {
  3. Console.WriteLine("Client " + context.ClientAddress.ToString() + " sended: " + context.DataFrame.ToString());
  4. }

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

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

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

优势:

  • 简单

  • 无依赖性

  • 文档完备

缺点:

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

  • 没有 fallback

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. while (receiveResult.EndOfMessage == false)
  21. {
  22. if (count >= maxMessageSize)
  23. {
  24. string closeMessage = string.Format("Maximum message size: {0} bytes.", maxMessageSize);
  25. await socket.CloseAsync(WebSocketCloseStatus.MessageTooBig, closeMessage, CancellationToken.None);
  26. return;
  27. } receiveResult = await socket.ReceiveAsync(new ArraySegment(receiveBuffer, count, maxMessageSize - count), CancellationToken.None);
  28. count += receiveResult.Count;
  29. } var receivedString = Encoding.UTF8.GetString(receiveBuffer, 0, count);
  30. var echoString = "You said " + receivedString;
  31. ArraySegment outputBuffer = new ArraySegment(Encoding.UTF8.GetBytes(echoString));
  32. await socket.SendAsync(outputBuffer, WebSocketMessageType.Text, true, CancellationToken.None);

SuperWebsocket

http://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,但是如果有办法使用最新的windows服务器来作为测试和生产机器的话,我会放弃使用这两个而选择SignalR。

.NET 的WebSocket开发包详细比较(2)的更多相关文章

  1. .NET 的 WebSocket 开发包比较(转)

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

  2. .NET 的 WebSocket 开发包比较

    编者按 本文出现在第三方产品评论部分中.在这一部分的文章只提供给会员,不允许工具供应商用来以任何方式和形式来促销或宣传产品.请会员报告任何垃圾信息或广告. Web项目常常需要将数据尽可能快地推送给客户 ...

  3. .NET 的 WebSocket 开发包比较 【已翻译100%】--网址:http://www.oschina.net/translate/websocket-libraries-comparison-2

    编者按 本文出现在第三方产品评论部分中.在这一部分的文章只提供给会员,不允许工具供应商用来以任何方式和形式来促销或宣传产品.请会员报告任何垃圾信息或广告. Web项目常常需要将数据尽可能快地推送给客户 ...

  4. 易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码

    易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码        怎么才能获取到外盘期货行情数据API接口呢?不少朋友就会考虑到易盛9.0行情API接口,本身易盛就是一个软件提供商,提供行 ...

  5. java在线聊天项目 实现基本聊天功能后补充的其他功能详细需求分析 及所需要掌握的Java知识基础 SWT的激活方法,swt开发包下载,及破解激活码

    补充聊天项目功能,做如下需求分析: 梳理项目开发所需的必要Java知识基础 GUI将使用更快速的swt实现 SWT(Standard Widget Toolkit) Standard Widget T ...

  6. *** wechat-php-sdk 微信公众平台php开发包

    wechat-php-sdk 微信公众平台php开发包,细化各项接口操作,支持链式调用,欢迎Fork此项目weixin developer SDK. 项目地址:https://github.com/d ...

  7. 条形码软件开发包Dynamic .NET TWAIN v5.0提供WPF功能

    Dynamsoft是一家著名的开发条形码控件开发包的公司,其旗下 Dynamic .NET TWAIN产品近日升级到v5.0版本,对于在支持WPF功能方面有着较大的改进.下面就让我们一起来看看这次更新 ...

  8. Android SDK开发包国内下载地址

    不知道是因为最近kaihui还是怎么的,打开android sdk官方网站特别的慢,想下载最新版本的platform几乎变成不可能完成的任务,不知道为什么Google不像Apache那样在各国设立镜像 ...

  9. 数据库内置视图以及常见的DBMS开发包

    如果想了解oracle运行的一些数据信息,oracle有一些视图可以供我们查询,通过这些内置的视图我们可以了解数据库 运行的一些信息,比如数据库文件存在什么地方.有哪些表空间.表空间的利用率.orac ...

随机推荐

  1. CAD使用GetxDataString读数据(网页版)

    主要用到函数说明: MxDrawEntity::GetxDataString2 读取一个字符扩展数据,详细说明如下: 参数 说明 [in] LONG lItem 该值所在位置 [out, retval ...

  2. 05JavaScript中的事件处理

    JavaScript中的事件处理 在JavaScript中,事件的发生主要是由窗口中内容变化.键盘和鼠标引起的.JavaScript在某些事件发生的时候,可以通过一些相应的事件处理器来捕获这些事件,并 ...

  3. 运行容器出现docker: Error response from daemon: driver failed programming external connectivity on endpoint elegant_ptolemy (7fe85ca6bd744449ff82b81c1577d73b6821c4e51780c8238fad6aa0cb940522): (iptables fai

    运行容器时出现以下报错: docker: Error response from daemon: driver failed programming external connectivity on ...

  4. cc.Node—Action

    1: Action类是动作命令,我们创建Action,然后节点运行action就能够执行Action的动作; 2: Action分为两类: (1) 瞬时就完成的ActionInstant, (2) 要 ...

  5. vs2012+ winform+.net4.0发布如何在xp上运行

    今天在英文版vs2013打包发布4.0(非4.0 client)的winform时,遇到了在xp上无法运行的情况,.net framework 4.0在xp上已安装.在打包前,winform工程,即菜 ...

  6. day21 01 包的初识

    day21 01包的初识 包:把解决一类问题的模块放在同一个文件夹里面-----包(一个包里面通常会含有_init_.py文件(python2里面必须有),但是后面的就没有要求一定要有了) 同样导入的 ...

  7. 【Python实践-9】将字符串转化为浮点型

    利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456. 思路:计算小数位数--->将字符串中的小数点去掉--->字符串转换为整数-- ...

  8. 2.5.4 华丽的 printf 输出

        如同echo命令,printf命令可以输出简单的字符串:         [many@avention my_sh]$ printf "Hello, world\n"    ...

  9. 关于datanode多磁盘存储策略

    目的: 节点内各存储磁盘均衡 相关参数: dfs.datanode.fsdataset.volume.choosing.policy=org.apache.hadoop.hdfs.server.dat ...

  10. type="application/javascript"

    type="application/javascript" html script 标签中 type有如下这些值,请问分别是什么意思,在什么情况下使用? type="te ...