3

我有一个通过 gprs 向我的服务器发送数据的设备。问题是它发送原始数据,我不知道在哪里可以停止读取

目前我正在使用 TIdHttpServer 之类的东西来读取字符串:

var
    s : string;
    repeat
       s:=s+acontext.Connection.Socket.ReadChar;
    until acontext.Connection.Socket.InputBufferIsEmpty;

我的问题有更好的解决方案吗?

4

2 回答 2

3

TCP是面向流的。如果协议未知,服务器只能尝试读入字节数组(如果内存没有问题)或文件流。如果客户端正常断开连接,则数据“完整”。不幸的是,如果协议未知,服务器无法判断客户端是否正常死亡或断开连接。

InputBufferIsEmpty 没有帮助,因为它只说明(TCP)缓冲区中是否有数据 - 并且根据延迟,这可能会经常发生,但这并不意味着没有更多的飞行字节。

您可以尝试通过在客户端设备上发送已知字符串来对协议进行“逆向工程”。但是如果发件人是一个黑盒子,可能会有很多特殊情况——想想编码或“转义”字符等。

于 2012-04-11T14:24:11.683 回答
0

您可以制定自己的协议。

一些想法是:

  1. 使用特殊字符或字符组合来定义消息的结尾。
  2. 在消息的开头附加一些带有消息大小的固定大小字段
于 2012-04-11T15:24:30.023 回答