实现前缀模式

时间:2013-01-11 22:20:05

标签: java tcp

我正在开发一个服务器客户端应用程序。 服务器在Java(PC)中完成,客户端在Java中完成。 (机器人)

我遇到以下实施问题:

  

服务器抓取位图 - >原始字节 - > TCP - >客户端(Async Streams

现在,字节数组在客户端中以不同长度的多个数据包传递。所以为了正确处理这个问题,我应该使用前缀方法。

  

要使用前缀模式,您需要以字节为单位发送消息的长度   作为四个字节,然后是消息

我的代码

public void sendScreenshot(byte[] buffer) throws IOException {
    OutputStream os = socket.getOutputStream();
    os.write(buffer.length + 1);
    os.write((byte) 0);
    os.write(buffer, 0, buffer.length);
    os.flush();
}

在VB.net中,这可以通过以下代码实现:

Private Sub dat(ByVal dat As String)
    Dim nstream As NetworkStream = sock.GetStream()
    Dim bit As Byte() = System.Text.Encoding.UTF8.GetBytes(dat)
    Dim bw As New BinaryWriter(sock.GetStream())
    bw.Write(bit.Length + 1)
    bw.Write((byte)command)
    bw.Write(bit, 0, bit.length)

End Sub

欢迎使用Java实现它的任何帮助吗?

1 个答案:

答案 0 :(得分:3)

使用DataOutputStream

DataOutputStream out = new DataOutputStream(os);
out.writeInt(buffer.length + 1);
// This writes a single byte
out.write(0);
out.write(buffer);
out.flush();

.writeInt()来自您引用文本的这一部分:

  

您需要以字节为单位发送消息的长度为四个字节

表示int。请注意,这将按网络顺序写入int。虽然这在您的摘录中未指定,但我认为这是预期的。

同样,在接收端,您可以使用DataInputStream,将长度读作int,然后读取有效负载。