我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何进行.NET 的WebSocket开发包比较

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何进行.NET 的WebSocket开发包比较

如何进行.NET 的WebSocket开发包比较,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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 技术如何进行.NET 的WebSocket开发包比较 (http://cometdaily.com/2007/11/05/the-forever-frame-technique/)

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

略注:

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

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

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

Fleck

https://github.com/statianzo/Fleck

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

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

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

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

优点:

  • 简单

  • 无依赖项

缺点:

  • 可配置项少

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

SignalR

http://www.asp.net/signalr

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

如何进行.NET 的WebSocket开发包比较

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

听起来很棒是不?但是...它需要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);      }  }
$(function () {      var chat = $.connection.myHub1;      chat.client.broadcastMessage = function (name, message) {          //...      };      $.connection.hub.start().done(function () {          $('#sendmessage').click(function () {              chat.server.send('message');          });      });  });

优点:

  • 非常好的抽象

  • 与IIS和ASP.NET紧密集成

  • 很多候选方式

  • 开源

  • 微软官方库

  • 可扩展性好

缺点:

  • 需要IIS8…

  • … 也就是Windows Server 2012太贵了

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()来得到真实的消息,但使用库的目的是为了不要强迫自己实现通信协议。

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

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

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

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

优势:

  • 简单

  • 无依赖性

  • 文档完备

缺点:

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

  • 没有 fallback

XSockets

http://xsockets.net/

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

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

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> <h3>Microsoft.WebSocket</h3> <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

最不重要的是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开发包比较的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何进行.NET 的WebSocket开发包比较

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何进行.NET 的WebSocket开发包比较

如何进行.NET 的WebSocket开发包比较,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Web项目常常需要将数据尽可能快地推送给客户,必要时无需等待客户端请求。对于与用户
2023-06-17

如何进行小程序定制开发和APP开发相比较

如何进行小程序定制开发和APP开发相比较,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一说起微信小程序开发,很多人的第一印象就是微信上的衍生应用软件。而且现如今
2023-06-05

如何进行 java和.net的HashSet对比

本篇文章给大家分享的是有关如何进行 java和.net的HashSet对比,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。今天,应为工作问题,测试了一下C#和java同意的代码功
2023-06-17

如何在Linux上使用.NET进行开发

本篇内容主要讲解“如何在Linux上使用.NET进行开发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在Linux上使用.NET进行开发”吧!如何安装 .NET.NET 下载被分为多个包:一
2023-06-16

如何进行equals()方法和==异同的比较

如何进行equals()方法和==异同的比较,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。equals()方法是Object类的方法,所有的类都集成了此方法,还
2023-06-02

如何进行网站开发中转化率比较低的解决方法分析

如何进行网站开发中转化率比较低的解决方法分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。网站转化率低的一些表现,主要分析网站的转化率低的一些情况,这些情况大家应该都遇到过,但
2023-06-12

如何用vim开发比较简单的Python

本篇内容介绍了“如何用vim开发比较简单的Python”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先下载python,gvim,pytho
2023-06-17

如何进行SAP S4CRM和C4C的技术比较

如何进行SAP S4CRM和C4C的技术比较,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。部署方式这一差异显而易见,本地部署和云端部署的区别导致了表格里其他比较项目的差异。
2023-06-04

如何进行VPS中三种虚拟技术的比较

如何进行VPS中三种虚拟技术的比较,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。很多人看到同样配置的VPS价格相差很大,甚是不理解,其实VPS使用的虚拟技术种类有很多,如Ope
2023-06-12

如何进行C++Builder的开发

这篇文章将为大家详细讲解有关如何进行C++Builder的开发,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++ Builder是由Borland公司推出的一款集成开发环境,C++Buil
2023-06-17

如何进行docker容器集群管理平台的比较

如何进行docker容器集群管理平台的比较,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。容器化和微服务是当前最热话题,不久之前,笔者(据说因为现在都不用笔了,“
2023-06-19

如何进行Java中对HashMap的深度分析与比较

如何进行Java中对HashMap的深度分析与比较,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能
2023-06-03

MySQL如何进行区分大小写的字符串比较?

As we know that MySQL is not case-sensitive while comparing characters but it can be changed i.e. MySQL can perform case
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录