java - 为自定义 TCP 协议(protocol)实现客户端

标签 java sockets tcp protocols

我必须实现一个客户端,以便通过基于 XML 格式的自定义协议(protocol)与服务器进行通信。这是一个应用层协议(protocol),基于TCP。因此,我的客户端发送请求 XML 消息并接收响应,也是 XML 消息。现在,我考虑如何确保在开始解析之前收到完整的消息。

我看到两个方法:

  1. 接收到一些表示消息结束的魔数(Magic Number)的字节。 这是最好的方法(对我来说),是吗?

  2. 但是,可能没有魔数(Magic Number),消息的大小也未知。那个案子呢?我看到了一些其他协议(protocol)的客户端,我看到了类似的东西。

    while(true){
        r = socket.read(buffer, offset, 1024);
        if(r < 1024) break;
        offset += r;
    }
    // parse buffer
    

我不确定是否可以。它假定如果我们读取少于 1024 个字节,则消息已完成。可以吗?

推荐的解决方法是什么?

最佳答案

在您的自定义协议(protocol)中,您需要包括以下步骤:

客户端

  1. 计算 XML 内容的 1024 字节 block 的数量,即 ceiling(XML content bytes/1024)
  2. 通过socket将第1步的数字发送给服务器
  3. 以定义缓冲区大小的 block 的形式传输内容,例如 1024 字节

服务器

  1. 读取要从客户端接收的 block 数

  2. 在大小等于第 1 步读取的数字的 for 循环内,开始接收预定义缓冲区大小的内容。

这样服务器在开始接收 XML 内容之前就知道实际内容有多少字节。

关于java - 为自定义 TCP 协议(protocol)实现客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48192158/

相关文章:

java - 在 Azure Web 应用上运行 Solr

java - aws api 网关速度中的转义字符

sockets - 为什么我的TCP套接字显示已连接但没有响应?

java - 如何使 2 个服务器线程与 2 个客户端线程通信?

Android 套接字不能很好地播放

go - HTTP重用连接条件

java - 我该如何应对 "IllegalStateException: BeanFactory not initialized or already closed"?

java - BorderLayout setSize问题

tcp - 关于结构 tcp_info 的良好文档

node.js - 我应该使用 WebRTC 还是 Websockets(和 Socket.io)进行 OSC 通信