.NET WebSocket客户端和服务器库

12
我正在寻找一个开源的、跨平台的、积极维护的.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。然而,让我担心的是跟客户端无法连接、无效数据帧等问题相关的大量已打开的问题 - 这听起来它还不太成熟。是否有其他符合我的要求的候选库我错过了?或者我对上面列出的任何库仅支持客户端/服务器有误吗?

澄清一下,客户端和服务器库不需要来自同一供应商,只要它们共享相同的抽象即可。例如,如果有两个独立的库,其中一个实现了WebSocket客户端,另一个实现了WebSocket服务器,但两者都通过实现System.Net.WebSockets.WebSocket来实现,则对我而言这将起作用。 - Pavel Minaev
根据我的经验,WebSocket 只是一种传输方式,您的软件不应该意识到这样的细节。通常我会有自己的抽象层或者通过服务总线进行通信,使用监听器将消息写入队列并从队列中读取消息。 - vtortola
编写自己的抽象层是一种选择 - 这只是我在这里试图避免的选择。对于我的情况,我不需要多个传输,我只想要WS。使用常规套接字,我所描述的场景“只需运行”-您有TcpClientTcpListener,但最终都会给您一个Stream。我觉得标准的.NET库已经有了WebSocket,它是WebSockets的等效共享抽象,但似乎没有人在他们的WS库中实际使用它。 - Pavel Minaev
大多数情况下,您已经尝试了太多库(所有可用的),现在是编写自定义库的时候了 :)。 在这种情况下,这并不太难。 在 MDN 上有如何做到这一点的说明 https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers - exyi
另一个解决方案是利用Edge.js。这是一个利用Node.js的.NET库。您可以让Node.js充当WebSocket通道的服务器和客户端。然后利用Edge.js作为连接Node.js和.Net之间的桥梁。请查看以下内容,还有很多示例。https://github.com/tjanczuk/edge/tree/master#scripting-clr-from-nodejs。两者都是优秀的框架,正在积极维护。 - Don
显示剩余8条评论
3个回答

10
请看微软的SignalR。SignalR是围绕Websockets的更高级别的抽象。SignalR还允许使用.NET(C#)编写客户端。从SignalR文档中得知:
SignalR Hubs API使您能够从服务器向连接的客户端进行远程过程调用(RPC),并从客户端向服务器进行调用。在服务器代码中,您定义可以由客户端调用的方法,并调用在客户端上运行的方法。在客户端代码中,您定义可以从服务器调用的方法,并调用在服务器上运行的方法。SignalR会为您处理所有客户端到服务器的管道。
SignalR还提供了一个称为Persistent Connections的低级API。有关SignalR,Hubs和Persistent Connections的介绍,或者有关如何构建完整的SignalR应用程序的教程,请参见SignalR - 入门。

请纠正我,但是SignalR仅受管理-这意味着连接的两侧都必须受到管理(并且要使用SignalR)。由于一侧是本机应用程序,因此在此处不是选项。 - Pavel Minaev
你的问题指定了你正在寻找一个.NET库。SignalR的服务器端是.NET的。有许多不同的客户端选项:.NET、Javascript。甚至还有一个Python客户端。你在客户端上使用什么?你在服务器端上使用什么? - Jared Dykstra
1
我的问题明确指出,我正在寻找一个专门用于Websockets的托管客户端和服务器库,而不仅仅是任何类型的IPC。协议是约束的一部分。它并没有真正涉及通信的另一侧,但它是一个本地(C ++)应用程序。我愿意探索其他协议的可能性,但它必须是开放的,有文档记录,广泛使用,并且在.NET和C ++两者都有可用的库。 - Pavel Minaev
另外,如果有直接使用SignalR WebSocket实现的方法,那也很有趣。 - Pavel Minaev
如果有某些原因需要限制SignalR使用Websockets,您可以配置允许的传输方式 - Jared Dykstra
1
据我所见,它仍然在传输层之上使用SignalR协议,因此另一端(提醒一下,是C++)必须知道如何使用它 - 即它需要本地的SignalR实现。我已经查找了C++的SignalR客户端库,但我找不到其服务器实现(或者说,其他语言的实现)。提醒一下,在我的场景中,连接建立时两个组件都需要能够扮演客户端角色或服务器角色。 - Pavel Minaev

1
另一种解决方案是利用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。

0
你可以看一下WebSocketRPC。该库基于System.Net.WebSockets,且可移植。此外,它会自动生成JavaScript客户端代码,并支持ASP.NET Core。 我建议您先尝试GitHub存储库中的示例。
免责声明:我是该库的作者。

链接无效。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接