首页 文章

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

提问于
浏览
0

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

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

2 回答

  • 1

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

    | length | data | .. | .. | length | data | .. | .. | .. |

    更确切地说

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

    其中3和4是长度 .

  • 0

    你只需要一个逃避计划 .

    • 开始时发送STX(传输开始) .

    • 结束时发送ETX(传输结束) .

    • 如果数据中出现STX或ETX,请在其前面加上ESC(转义) .

    • 如果数据中出现ESC,请在ESC前面加上前缀 .

    在接收方:

    • 第一个字节应该是STX,否则你有一个bug . 丢弃它 .

    • 之后,如果一个字节是ESC,则丢弃它并接受下一个字节,无论它是什么 .

    • 否则,如果下一个字节是ETX,则丢弃它并停止读取 .

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

相关问题