Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有TCP和压缩的客户端服务器_C#_Sockets_Tcp_Client Server - Fatal编程技术网

C# 具有TCP和压缩的客户端服务器

C# 具有TCP和压缩的客户端服务器,c#,sockets,tcp,client-server,C#,Sockets,Tcp,Client Server,我有一个类似聊天的程序。 客户端和服务器通过两个TCP套接字连接,一个用于传入消息,另一个用于传出消息。 有时消息可能非常大(例如,2 MB的文本),因此我希望在通过频道发送之前对其进行压缩。 问题是我不知道如何找到压缩消息的开头和结尾。 现在,我使用两个特殊字符来查找消息的开头和结尾,但在压缩过程中可能会出现错误 可能存在一种不使用特定字节的压缩类型? 我使用C#打开和管理套接字,因此我需要在windows下工作的压缩。附加到消息开头的it长度。在这之后,您只需要读取长度,然后获得所需的准确字

我有一个类似聊天的程序。
客户端和服务器通过两个TCP套接字连接,一个用于传入消息,另一个用于传出消息。
有时消息可能非常大(例如,2 MB的文本),因此我希望在通过频道发送之前对其进行压缩。
问题是我不知道如何找到压缩消息的开头和结尾。
现在,我使用两个特殊字符来查找消息的开头和结尾,但在压缩过程中可能会出现错误

可能存在一种不使用特定字节的压缩类型?

我使用C#打开和管理套接字,因此我需要在windows下工作的压缩。

附加到消息开头的it长度。在这之后,您只需要读取长度,然后获得所需的准确字节数。
它看起来像:

|长度数据长度数据|

更确切地说

|3 | 26 | 125 | 36 | 4 | 12 | 45 | 16 | 34 |


其中3和4是长度。

您只需要一个转义方案

  • 在开始时发送STX(传输开始)
  • 在末尾发送ETX(传输结束)
  • 如果数据中出现STX或ETX,请在其前面加上ESC(escape)
  • 如果数据中出现ESC,请在其前面加上ESC
在接收器处:

  • 第一个字节应该是STX,否则就会出现错误。丢弃它
  • 之后,如果一个字节是ESC,则丢弃它并接受下一个字节,不管它是什么
  • 否则,如果下一个字节是ETX,则丢弃它并停止读取

另一个答案中建议的长度词前缀的问题是,如果不先进行压缩,就无法知道长度,这需要花费时间和空间。

在消息的开头追加它的长度。在这之后,您只需要读取长度,然后获得所需的准确字节数。@Vlad您应该将其作为答案发布。