簡體   English   中英

Java中的多位TCP請求

[英]Multi Bit TCP Request in Java

我正在嘗試以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轉換為Binary。

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

我的理解是,如果我想發出TCP請求,我會先

  1. 需要將每個二進制轉換為字符串
  2. 將值附加到StringBuffer。

不幸的是,我的理解是有限的,所以我想要一些有關正確創建TCP請求的建議。

我不會使用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位字節)

您走錯了方向。 消息規范指出例如第一個字段是16位二進制文​​件這一事實並不意味着您將發送二進制字符串。 您將只發送一個(無符號?)16位數字,實際上,該數字將被編碼為二進制,因為它的內部表示形式可能就是那個。

當通過DataOutputStream寫入套接字時,例如

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

您已經用二進制文件編寫了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM