是否有一个 TCP 套接字库/协议可以进行消息框架并在 JS 和 C# 中受支持?

Posted

技术标签:

【中文标题】是否有一个 TCP 套接字库/协议可以进行消息框架并在 JS 和 C# 中受支持?【英文标题】:Is there a TCP Socket Library/Protocol that does message framing and is supported in JS & C#? 【发布时间】:2016-07-20 18:09:15 【问题描述】:

我正在构建一个应用程序,该应用程序需要客户端使用服务器在彼此之间交换消息(类似于聊天)。

我想使用 Node JS 用 Ja​​vaScript 编写服务器,客户端应用程序是用 C#.NET 编写的。

由于缺乏 C# 支持以及我正在寻找更底层和灵活/可定制的东西,我研究了一段时间并放弃了 Socket.IO。

我曾经写过一个非常相似的应用程序,它使用内置的 NodeJS 'net' 模块作为服务器和 C# TCPClient 客户端,它可以工作,但它使用流,我必须在消息长度之前加上前缀每条消息。

我正在寻找更冗余的东西,它具有开箱即用的消息框架,并且受我使用的语言的支持。

我发现 'ws' (WebSocket) npm 模块似乎是一个很有前途的候选者,特别是因为它可能与 C# Socket 类(这也是 TCPistener 和 TCPClient 类使用的底层套接字)配合得很好但是对于我的生活,我无法弄清楚我是否仍然需要期待一个 Socket Stream 或者只是为新的消息事件设置一个事件处理程序。

我正在寻找一种实现起来非常简单的东西,并且会通知我收到的每条消息,以便我可以处理它,无论消息或缓冲区的大小如何(我计划发送平均大小为 1 兆字节的消息.. .),我从不想处理缓冲区,当然它应该在上述语言中得到很好的支持。

【问题讨论】:

WebSockets 与消息一起使用,您不需要前缀大小,您只需挂钩到 Message 事件,它将被完整接收。 @Gusman 所以服务器端我使用'ws'?客户端使用的包/类的名称是什么(使用 c#)? 我使用 websocket-sharp,因为它是可移植的,并且可以完美地与 mono/linux 配合使用,但是如果您的目标只是 Windows,那么您可以使用集成的 websockets:msdn.microsoft.com/es-es/library/… @Gusman 请发表您的评论作为答案,我会接受。 【参考方案1】:

WebSockets 已经可以处理消息了,你不需要在大小前加上前缀,只需挂钩到消息事件,它就会被完整接收。

我个人使用 websocket-sharp,因为它是可移植的并且在 mono/linux 下完美运行,但如果你的目标只是 Windows,你可以使用集成的 .net websockets:https://msdn.microsoft.com/es-es/library/system.net.websockets.websocket(v=vs.110).aspx

【讨论】:

我的最终实现将是带有高达 1MB 消息的流式图像,我在使用流协议时遇到了问题,其中消息仅部分到达缓冲区,我不得不等到完整的消息到达,如果我知道丢失了多少字节,我只能等待,才能知道我需要事先知道消息长度。 如果你说无论大小使用 WebSockets 都会确保消息完整到达,那么我没有问题,我也在网上阅读 WebSockets 是否有自己的消息框架来确保那个。 是的,WebSockets 内部使用它自己的框架控制,因此可以确保消息到达时它是完整的。

以上是关于是否有一个 TCP 套接字库/协议可以进行消息框架并在 JS 和 C# 中受支持?的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP网络编程 习题2

协议栈处理过程

发送消息保证后,是否与TCP套接字断开连接?

NodeJS:如何为测试服务器创建一个假的 tcp 套接字

TCP 套接字上的 send() 是不是可以返回 >=0 和 <length?

安装Lua套接字库