Client-Server with TCP with compression

本文关键字:with compression TCP Client-Server | 更新日期: 2023-09-27 18:19:09

我有一个类似聊天的程序。
客户端和服务器通过2个TCP套接字连接,一个用于传入消息,另一个用于传出消息。有时消息可能非常大(例如2 MByte的文本),所以我想在通过通道发送之前压缩它们。
问题是我不知道如何找到压缩消息的开始和结束。
现在我使用两个特殊字符来查找消息的开始和结束,但是使用压缩可能会出现错误。

也许有一种类型的压缩不使用特定的字节?
我使用c#来打开和管理套接字,所以我需要一个在windows下工作的压缩。

Client-Server with TCP with compression

添加到消息的开始长度。之后,你只需要读取长度,然后得到你需要的确切字节数。
它看起来像:

| | |数据长度. . | . . | |长度数据 |..|..|..|

更确切地说

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

其中3和4为长度

只需要一个转义方案。

  • 开始发送STX (Start of Transmission)。
  • 在终端发送ETX (End of Transmission)。
  • 如果数据中出现STX或ETX,则在其前面加上ESC(转义)。
  • 如果数据中出现ESC,则在其前面加上ESC。

接收方:

  • 第一个字节应该是STX,否则你有一个bug。丢弃它。
  • 之后,如果一个字节是ESC,丢弃它并接受下一个字节,无论它是什么。
  • 否则,如果下一个字节是ETX,丢弃它并停止读取。

在另一个答案中,length-word前缀的问题是,如果不先进行压缩,就无法知道长度,这会耗费时间和空间。