我必须实现一个客户端,以便通过基于 XML
格式的自定义协议(protocol)与服务器进行通信。这是一个应用层协议(protocol),基于TCP
。因此,我的客户端发送请求 XML
消息并接收响应,也是 XML 消息。现在,我考虑如何确保在开始解析之前收到完整的消息。
我看到两个方法:
接收到一些表示消息结束的魔数(Magic Number)的字节。 这是最好的方法(对我来说),是吗?
但是,可能没有魔数(Magic Number),消息的大小也未知。那个案子呢?我看到了一些其他协议(protocol)的客户端,我看到了类似的东西。
while(true){ r = socket.read(buffer, offset, 1024); if(r < 1024) break; offset += r; } // parse buffer
我不确定是否可以。它假定如果我们读取少于 1024 个字节,则消息已完成。可以吗?
推荐的解决方法是什么?
最佳答案
在您的自定义协议(protocol)中,您需要包括以下步骤:
客户端
- 计算 XML 内容的 1024 字节 block 的数量,即 ceiling(XML content bytes/1024)
- 通过socket将第1步的数字发送给服务器
- 以定义缓冲区大小的 block 的形式传输内容,例如 1024 字节
服务器
读取要从客户端接收的 block 数
在大小等于第 1 步读取的数字的 for 循环内,开始接收预定义缓冲区大小的内容。
这样服务器在开始接收 XML 内容之前就知道实际内容有多少字节。
关于java - 为自定义 TCP 协议(protocol)实现客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48192158/