【问题标题】:Client-Server with TCP with compression带有压缩的 TCP 客户端-服务器
【发布时间】:2014-08-23 17:04:30
【问题描述】:

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

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

【问题讨论】:

  • 附加到消息的开头它的长度。之后你只需要读取长度,然后得到你需要的字节数。
  • @Vlad 您应该将其发布为答案。

标签: c# sockets tcp client-server


【解决方案1】:

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

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

更准确地说

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

其中 3 和 4 是长度。

【讨论】:

    【解决方案2】:

    你只需要一个转义方案。

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

    在接收方:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 2013-08-20
      • 2012-01-04
      相关资源
      最近更新 更多