带压缩的TCP的客户端服务器

时间:2014-08-23 17:04:31

标签: c# sockets tcp client-server

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

可能有一种压缩不能使用某些特定的字节?  我使用C#来打开和管理套接字,所以我需要一个在windows下工作的压缩。

2 个答案:

答案 0 :(得分:1)

追加消息的开头长度。之后你只需要读取长度,然后获得所需的字节数 它看起来像:

  

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

更准确地说

  

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

3和4的长度。

答案 1 :(得分:0)

你只需要一个逃避计划。

  • 在开始时发送STX(传输开始)。
  • 最后发送ETX(传输结束)。
  • 如果数据中出现STX或ETX,请在其前面加上ESC(转义)。
  • 如果数据中出现ESC,请在其前面加上ESC。

在接收方:

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

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