我在c#中遇到了一个关于TCP客户端应用程序返回的大问题。正常情况下,它工作得很好,但在某些情况下,服务器向特定客户端发送同时响应,因此在这种情况下,所有同时响应在客户端side.So中作为单个消息接收。这种情况下,客户端无法识别单个消息。因此在这种情况下,我的客户端应用程序无法处理特定的活动。是否可以在客户端作为单独的消息读取?因此,为了解决这个问题,我有一些选择,但我不知道这是不是正确的方法。
在客户端使用固定长度的缓冲区(但我的消息是可变长度的)。
2-为每个响应消息添加分隔符。
如果有人知道解决这类问题的解决方案,请帮助我。
发布于 2012-09-10 21:06:33
TCP是基于流的,您可以获得从客户端到服务器的数据流。如果您不能构建一个应用程序协议来确保每个消息都是单独发送的,那么您需要“反序列化”从流中得到的内容(对于TCP来说,这通常不是一个明智的想法)。
因此,您需要与每条消息一起发送一些东西,以便您能够区分数据是什么。这通常是通过每个消息开头的标签或类型数据来完成的。有时一个字节就可以了(取决于你有多少不同的消息类型)。然后从流中读取该字节,并决定下一步要反序列化什么。例如,如果你想发送一个字符串,你可以序列化'1',然后序列化string。如果你想发送日期/时间,你可以序列化“2”,然后序列化DateTime。在服务器端,如果这两个对象几乎同时发送,您可以简单地反序列化byte,如果它是'1',反序列化string,然后继续反序列化:获取下一个byte,如果它是'2',反序列化DateTime。
重要的是要记住,TCP是基于流的协议,而不是基于消息的协议。基于消息的需要在应用程序级别实现--例如类似于上面的内容。
这里所说的“序列化”和“反序列化”是指.NET文档中Serializing Objects中描述的典型的内置序列化程序和反序列化程序。对于JSON.NET或内置的DataContractJsonSerializer和JavaScriptSerializer等库中包含的JSON序列化程序也是如此。
发布于 2012-09-10 21:35:49
只需确保每个消息的长度为前几个字节,这样您就可以将整个消息拆分成单个消息。
例如,假设您从服务器收到这条20字节的消息:
(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 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
^ ^ ^ ^ ^ ^发布于 2012-09-10 21:44:14
使用至少包含正文长度的固定长度的头部是最简单的方法。然后,根据正文的不同,您可能需要额外的信息(比如类型名称,如果您想使用JSON之类的东西来序列化/反序列化实际的消息)。
如果你不想自己处理所有的事情,你可以使用像mine这样的网络库。向下滚动到本文末尾,查看JSON RPC示例实现。您可以使用其中的大部分内容来获得基于JSON的通信通道。
https://stackoverflow.com/questions/12352125
复制相似问题