0

我正在尝试用 Java 向已经可用的现有 TCP 服务器发出 tcp 请求。接口规范为:

Field           Length      Type
Length          2 bytes     16-bits binary
Message ID      1 byte      8-bits binary
MSGTYPE         1 byte      8-bits binary
Variable1       4 bytes     32-bits binary
Variable2       30 bytes    ASCII
Variable3       1 byte      8-bits binary

我了解如何使用 BigInteger 将字符串转换为二进制。

String testing = "Test Binary";
byte[] bytes = testing.getBytes();
BigInteger bi = new BigInteger(bytes);
System.out.println(bi.toString(2));

我的理解是,如果我想发出 TCP 请求,我会先

  1. 需要将每个二进制文件转换为字符串
  2. 将值附加到 StringBuffer。

不幸的是,我的理解有限,所以我想要一些关于正确创建 TCP 请求的建议。

4

2 回答 2

3

我不会使用 String(因为你有二进制数据)、StringBuffer(曾经)或 BigInteger(因为它不是它的设计用途)。

假设您有一个 Big Endian 数据流,我将使用 DataOutputStream

DataOutptuStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));

out.writeShort(length);
out.write(messageId);
out.write(msgtype);
out.write((var1+"\0\0\0\0").substring(0, 4).getBytes("ISO-8859-1"));
out.write(var2.getBytes("ISO-8859-1"));
out.write(var2);

out.flush(); // optionally.

如果你有一个小端协议,你需要使用 ByteBuffer 在这种情况下我会使用阻塞 NIO SocketChannel。

顺便说一句,我会使用ISO-8859-1(8 位字节)而不是US-ASCII(7 位字节)

于 2012-10-03T12:27:47.090 回答
0

你走错了方向。消息规范声明例如第一个字段是 16 位二进制的事实并不意味着您将发送二进制字符串。您将只发送一个(无符号?)16 位数字,事实上,它将被编码为二进制,因为它的内部表示可能就是那个数字。

DataOutputStream通过类似 in写入套接字时

int value = 123456;
out.writeInt(value);

你已经用二进制写了。

于 2012-10-03T12:28:30.190 回答