我有一个通过 gprs 向我的服务器发送数据的设备。问题是它发送原始数据,我不知道在哪里可以停止读取
目前我正在使用 TIdHttpServer 之类的东西来读取字符串:
var
s : string;
repeat
s:=s+acontext.Connection.Socket.ReadChar;
until acontext.Connection.Socket.InputBufferIsEmpty;
我的问题有更好的解决方案吗?
TCP是面向流的。如果协议未知,服务器只能尝试读入字节数组(如果内存没有问题)或文件流。如果客户端正常断开连接,则数据“完整”。不幸的是,如果协议未知,服务器无法判断客户端是否正常死亡或断开连接。
InputBufferIsEmpty 没有帮助,因为它只说明(TCP)缓冲区中是否有数据 - 并且根据延迟,这可能会经常发生,但这并不意味着没有更多的飞行字节。
您可以尝试通过在客户端设备上发送已知字符串来对协议进行“逆向工程”。但是如果发件人是一个黑盒子,可能会有很多特殊情况——想想编码或“转义”字符等。
您可以制定自己的协议。
一些想法是: