簡體   English   中英

Java-如何通過套接字在字符串之間有效地發送二進制數據?

[英]Java - How to send efficiently binary data between string over socket?

我正在制作一個聊天程序,其中我必須將文件分成1024字節的塊,並以以下格式通過Socket發送:

<DataPacket>Binary_data<DataPacket\>

目前,我唯一的想法是發送一個字符串

"<Packet>"

然后是字節[1024],然后是字符串

"<Packet\>".

所以我的問題是:

  • 有更方便的方法嗎?

  • 哪種Java輸入/輸出類(DataInputStream,BufferedOutputStream等)最合適,並且是執行此操作的小示例代碼?

附加信息:

  • 我必須使用Java庫(JRE8),不能使用Apache,...

  • 我知道我不必在TCP中分離數據,這只是必須的。

  • 如果所有代碼都可以從如下函數運行,那將是非常好的:

     void SendFile(Socket sendingSocket, File fileToSend); void ReceiveFile(Socket receivingSocket); 

要對二進制數據進行分塊,通常最好先發送字節數,然后再將原始數據作為字節發送。 因此,您的聊天客戶端應首先發送字符串"Packet 711\\n" ,然后發送文件的711字節(大多數文件大小不是1024的倍數!)。

這樣,您可以分塊發送數據,並使最后一個塊盡可能小,以免損壞文件。 大小后的換行符使收件人可以更輕松地確定數字的結尾和實際原始數據的起點。

[編輯]如果不能太多更改協議,則可能<DataPacket>711\\n<DataPacket>711\\n ... 711字節二進制數據... </DataPacket>

因此,發送數據的代碼如下所示:

void SendFile(Socket sendingSocket, File fileToSend) {
    OutputStream stream = sendingSocket.getOutputStream();
    InputStream input = new FileInputStream(fileToSend);

    byte[] buffer = new byte[1024];
    int len;
    while(true) {
        len = input.read(buffer);
        if(len < 0) break;

        String header = "<DataPacket>" + len + "\n";
        stream.write(header.getBytes('ASCII'));
        stream.write(buffer, 0, len);
        String footer = "<DataPacket\>";
        stream.write(footer.getBytes('ASCII'));
    }

    input.close();
    stream.close();
}

在接收端,您需要解析標頭(包括期望的字節數)。 然后,您可以分配一個緩沖區並讀取字節。

暫無
暫無

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

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