我有一个像聊天一样工作的程序 .客户端和服务器连接有2个TCP套接字,一个用于传入消息,另一个用于传出消息 .有时消息可能非常大(例如2 MB的文本),所以我想在通过 Channels 发送之前压缩它们 .问题是我不知道如何找到压缩消息的开始和结束 .现在我使用两个特殊字符来查找消息的开始和结束,但是使用压缩可能会出现错误 .
可能有一种压缩不使用某些特定的字节?我使用C#来打开和管理套接字,所以我需要一个在windows下工作的压缩 .
追加消息的开头长度 . 之后你只需要读取长度,然后获得你需要的完全字节数 .它看起来像:
| length | data | .. | .. | length | data | .. | .. | .. |
更确切地说
| 3 | 26 | 125 | 36 | 4 | 12 | 45 | 16 | 34 |
其中3和4是长度 .
你只需要一个逃避计划 .
开始时发送STX(传输开始) .
结束时发送ETX(传输结束) .
如果数据中出现STX或ETX,请在其前面加上ESC(转义) .
如果数据中出现ESC,请在ESC前面加上前缀 .
在接收方:
第一个字节应该是STX,否则你有一个bug . 丢弃它 .
之后,如果一个字节是ESC,则丢弃它并接受下一个字节,无论它是什么 .
否则,如果下一个字节是ETX,则丢弃它并停止读取 .
在另一个答案中建议的长度字前缀的问题是,如果不首先进行压缩,则无法知道长度,这会花费时间和空间 .
2 回答
追加消息的开头长度 . 之后你只需要读取长度,然后获得你需要的完全字节数 .
它看起来像:
更确切地说
其中3和4是长度 .
你只需要一个逃避计划 .
开始时发送STX(传输开始) .
结束时发送ETX(传输结束) .
如果数据中出现STX或ETX,请在其前面加上ESC(转义) .
如果数据中出现ESC,请在ESC前面加上前缀 .
在接收方:
第一个字节应该是STX,否则你有一个bug . 丢弃它 .
之后,如果一个字节是ESC,则丢弃它并接受下一个字节,无论它是什么 .
否则,如果下一个字节是ETX,则丢弃它并停止读取 .
在另一个答案中建议的长度字前缀的问题是,如果不首先进行压缩,则无法知道长度,这会花费时间和空间 .