【问题标题】:.NET WebSocket client and server library.NET WebSocket 客户端和服务器库
【发布时间】:2016-02-01 17:09:22
【问题描述】:

我正在寻找一个开源、跨平台、积极维护的 .NET 库,它为 客户端和服务器提供 websocket 功能,这样大部分代码(连接后已建立)可以使用相同的抽象,而不管它位于连接的哪一侧。理想情况下,这将是System.Net.WebSockets 的独立于平台的实现,但我并不关心它是否定义了自己的类型,只要有一些可以由客户端和服务器代码共享的抽象WebSocket 类即可。

我看过但不符合条件的东西(如果我错了,请纠正我):

  • System.Net.WebSockets(仅限客户端,仅限 Win8+)
  • WebSocket4Net(仅限客户端)
  • WebSocket Portable(仅限客户端)
  • Fleck(仅限服务器)
  • WebSocketListener(仅限服务器)
  • SuperWebSocket(仅限服务器)
  • Owin.WebSocket(仅限服务器)
  • PowerWebSockets(专有)
  • XSockets(专有)
  • Alchemy Websockets(最后一次发布于 2012 年,跟踪器中有许多活跃的错误没有答案)

我能找到的唯一一个似乎符合要求的是 websocket-sharp。然而,让我担心的是跟踪器中的 sheer number 已打开问题,如客户端无法连接、无效数据帧等 - 听起来它还不是很成熟。

是否还有其他符合我要求但我错过的候选人?或者我对上面列出的任何库都只是客户端/服务器有误?

【问题讨论】:

  • 为什么您需要同时来自同一供应商的客户端和服务器? WebSocket 是一个标准,如果您以 WebSocketListener 和 WebSocket4Net 为例,它应该可以工作。如果你同时控制服务器和客户端......为什么是 WebSocket 而不是直接 TCP?
  • 我真的不想在这里讨论太多细节(无论如何这在很大程度上是无关紧要的)。基本上,有两个组件需要相互通信,其中任何一个都可以是客户端和服务器,具体取决于具体场景。一旦在任一方向建立了连接,其余代码并不真正关心哪个是客户端,哪个是服务器。因此,我想要一个可以在任何地方使用的 websocket 抽象,这样唯一不同的代码路径就是建立连接的路径。
  • 为什么不使用 TCP - websockets 具有 HTTP 免费提供的一些理想属性,例如代理连接的能力,以及通常与防火墙更好的交互等。
  • 澄清一下,客户端和服务器库不需要来自同一个供应商,只要它们共享相同的抽象即可。例如。如果有两个单独的库,其中一个实现 websocket 客户端,另一个实现 websocket 服务器,但都通过实现System.Net.WebSockets.WebSocket 来实现,那么这对我有用。
  • 根据我的经验,WebSocket 只是一种传输方式,您的软件永远不应该知道这些细节。通常我有自己的抽象,或者通信通过一个服务总线,一个监听器向队列写入消息并从队列中读取消息。

标签: c# .net websocket


【解决方案1】:

看看微软的SignalR。 SignalR 是围绕 websocket 的更高级别的抽象。 SignalR 还允许用 .NET (C#) 编写客户端。来自SignalR documentation

SignalR 集线器 API 使您能够从服务器到连接的客户端以及从客户端到服务器进行远程过程调用 (RPC)。在服务器代码中,您定义可由客户端调用的方法,并调用在客户端上运行的方法。在客户端代码中,您定义可以从服务器调用的方法,并调用在服务器上运行的方法。 SignalR 为您处理所有客户端到服务器的管道。

SignalR 还提供了一个名为 Persistent Connections 的较低级别的 API。有关 SignalR、集线器和持久连接的介绍,或有关如何构建完整 SignalR 应用程序的教程,请参阅 SignalR - 入门。

【讨论】:

  • 如果我错了,请纠正我,但 SignalR 仅受管理 - 这意味着必须管理连接的双方(并使用 SignalR)。由于一侧是本机应用程序,因此这里不是一个选项。
  • 您的问题表明您正在寻找 .NET 库。 SignalR 的服务器端是 .NET。有许多不同的客户端选项:.NET、Javascript。甚至还有一个 Python 客户端。你在客户端使用什么?你在服务器端使用什么?
  • 我的问题表明我正在为 websockets 寻​​找一个托管的 client and server 库,而不仅仅是任何类型的 IPC。协议是约束的一部分。它并没有真正触及通信的另一面,但它是一个本机 (C++) 应用程序。我愿意探索协议的其他可能性,但它必须是开放的、文档化的、相当广泛的,并且具有可用于 .NET 和 C++ 的库。
  • 另外,如果有办法以某种方式直接使用 SignalR websocket 实现,那也会很有趣。
  • 据我所知,它仍然在传输之上使用 SignalR 协议,所以另一端(提醒一下,它是在 C++ 中)必须知道如何说它 - 即它需要本机 SignalR 实现。我环顾四周,存在用于 C++ 的 SignalR client 库,但我找不到它的服务器实现(或者,就此而言,找不到其他语言)。提醒一下,我的场景中的两个组件都需要能够在建立连接时充当客户端角色或服务器角色。
【解决方案2】:

另一种解决方案是使用 Edge.js。这是一个使用 Node.js 的 .NET 库。您可以让 Node.js 充当 WebSocket 通道的服务器和客户端。然后利用 Edge.js 作为世界、Nodejs 和 .Net 之间的桥梁。看看下面的,也有很多样本。 github.com/tjanczuk/edge/tree/master#scripting-clr-from-nodejs。两者都是积极维护的优秀框架。

不过,Edge.js 的使用确实引入了一个额外的依赖,node.js

【讨论】:

    【解决方案3】:

    您可以查看WebSocketRPC。该库基于 System.Net.WebSockets 并且是可移植的。此外,它自动生成 JavaScript 客户端代码并支持 ASP.NET Core。 我建议您先试用 GitHub 存储库中的示例。

    免责声明:我是图书馆的作者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多