簡體   English   中英

Java Socket OutputStream將一個byte []作為兩個單獨的消息寫入

[英]Java Socket OutputStream write one byte[] as two separate messages

嘗試通過Java中的TCP套接字發送byte []時,它將特定的數組作為兩個單獨的消息發送,而其他數組作為一個消息發送。 更詳細地講,我使用以下函數將十六進制字符串轉換為byte []:

public static byte[] hexStringToByteArray(String s) {
        byte[] b = new byte[s.length() / 2];
        for (int i = 0; i < b.length; i++) {
            int index = i * 2;
            int v = Integer.parseInt(s.substring(index, index + 2), 16);
            b[i] = (byte) v;
        }
        return b;
    }

然后通過Java TCP套接字發送它:

ServerSocket server = new ServerSocket(3030);
Socket socket = server.accept();
OutputStream out = socket.getOutputStream();
// sample hex string
String msg = "F0700F8000F42400001544952414E00000000000000000000000662000E00060000";
out.write(HexUtiles.hexStringToByteArray(msg));

在調試代碼時,我發現它將字節號為1024的數組分開。此外,增加和減小套接字緩沖區的大小也沒有區別。

此外,消息中沒有0A( \\n十六進制字符串)! 我猜想在write方法中有一些奇怪的行為,它以兩個消息的形式發送byte []數組! 我如何只將byte []作為一條消息發送?

TCP中沒有“消息”。 一切都作為流發送,並且在另一端如何分塊尚不確定。 塊可能會拆分或合並在一起。

使用DataOutputStream在每個數組之前發送字節大小。 使用DataInputStream讀取另一端的大小,然后讀取那么多字節。 這樣,您將可以在另一端重新創建陣列。

另一種選擇是使用ObjectOutputStreamObjectInputStream並將數組作為對象發送。

暫無
暫無

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

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