首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP客户端问题

TCP客户端问题
EN

Stack Overflow用户
提问于 2012-09-10 20:52:22
回答 3查看 265关注 0票数 2

我在c#中遇到了一个关于TCP客户端应用程序返回的大问题。正常情况下,它工作得很好,但在某些情况下,服务器向特定客户端发送同时响应,因此在这种情况下,所有同时响应在客户端side.So中作为单个消息接收。这种情况下,客户端无法识别单个消息。因此在这种情况下,我的客户端应用程序无法处理特定的活动。是否可以在客户端作为单独的消息读取?因此,为了解决这个问题,我有一些选择,但我不知道这是不是正确的方法。

在客户端使用固定长度的缓冲区(但我的消息是可变长度的)。

2-为每个响应消息添加分隔符。

如果有人知道解决这类问题的解决方案,请帮助我。

EN

回答 3

Stack Overflow用户

发布于 2012-09-10 21:06:33

TCP是基于流的,您可以获得从客户端到服务器的数据流。如果您不能构建一个应用程序协议来确保每个消息都是单独发送的,那么您需要“反序列化”从流中得到的内容(对于TCP来说,这通常不是一个明智的想法)。

因此,您需要与每条消息一起发送一些东西,以便您能够区分数据是什么。这通常是通过每个消息开头的标签或类型数据来完成的。有时一个字节就可以了(取决于你有多少不同的消息类型)。然后从流中读取该字节,并决定下一步要反序列化什么。例如,如果你想发送一个字符串,你可以序列化'1',然后序列化string。如果你想发送日期/时间,你可以序列化“2”,然后序列化DateTime。在服务器端,如果这两个对象几乎同时发送,您可以简单地反序列化byte,如果它是'1',反序列化string,然后继续反序列化:获取下一个byte,如果它是'2',反序列化DateTime

重要的是要记住,TCP是基于流的协议,而不是基于消息的协议。基于消息的需要在应用程序级别实现--例如类似于上面的内容。

这里所说的“序列化”和“反序列化”是指.NET文档中Serializing Objects中描述的典型的内置序列化程序和反序列化程序。对于JSON.NET或内置的DataContractJsonSerializerJavaScriptSerializer等库中包含的JSON序列化程序也是如此。

票数 5
EN

Stack Overflow用户

发布于 2012-09-10 21:35:49

只需确保每个消息的长度为前几个字节,这样您就可以将整个消息拆分成单个消息。

例如,假设您从服务器收到这条20字节的消息:

代码语言:javascript
复制
                                       (1)                                     (2)
0   1   2   3   4   5   6   7   8   9   0   1   2   3   4   5   6   7   8   9   0

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 2 | 4 | 6 | 1 | 5 | 3 | 3 | 2 | 6 | 3 | 4 | 1 | 6 | 2 | 3 | 5 | 3 | 0 | 4 | 6 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  ^           ^       ^               ^               ^           ^

  • 第一个字节表示第一个消息有2个字节的数据,因此您可以将该消息作为字节1和2进行检索。
  • 接下来您将读取字节3,它告诉您第二个消息只有1个字节的附加数据(字节4)。
  • 第三个和第四个消息有3个字节的数据(如字节5和9所示),然后是一个2个字节的消息和一个3个字节的消息。
票数 0
EN

Stack Overflow用户

发布于 2012-09-10 21:44:14

使用至少包含正文长度的固定长度的头部是最简单的方法。然后,根据正文的不同,您可能需要额外的信息(比如类型名称,如果您想使用JSON之类的东西来序列化/反序列化实际的消息)。

如果你不想自己处理所有的事情,你可以使用像mine这样的网络库。向下滚动到本文末尾,查看JSON RPC示例实现。您可以使用其中的大部分内容来获得基于JSON的通信通道。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12352125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档