簡體   English   中英

使用協議緩沖區將二進制文件從Java Server發送到C#Unity3d客戶端

[英]Send binary file from Java Server to C# Unity3d Client with Protocol Buffer

我問了這個問題https://stackoverflow.com/questions/32735189/sending-files-from-java-server-to-unity3d-c-sharp-client但我發現這不是發送文件的最佳解決方案通過內置操作在Java和C#之間切換,因為我還需要其他消息,不僅是文件內容。

因此,我嘗試使用Protobuf,因為它速度快並且可以獨立於平台對對象進行序列化/反序列化。 我的.proto文件如下:

message File{
  optional int32 fileSize = 1;
  optional string fileName = 2;
  optional bytes fileContent = 3;
}

因此,我在生成的.java文件中為每個變量設置值:

file.setFileSize(fileSize);
file.setFileName(fileName);
file.setFileContent(ByteString.copyFrom(fileContent, 0, fileContent.length);

我看到了許多有關如何將對象寫入文件和從文件讀取的教程。 但是,我找不到任何有關如何從服務器套接字向客戶端套接字發送文件的示例。

我的意圖是在Java服務器上序列化對象(文件大小,文件名和文件內容),並將這些信息發送到C#客戶端。 因此,可以反序列化文件並將其存儲在客戶端。

在上面的示例代碼中,服務器讀取文件(圖像文件)的字節並將其寫入輸出流,以便客戶端可以通過輸入流將字節讀取和寫入磁盤。 我想通過對生成的.proto文件進行序列化來實現相同的目的。

誰能給我一個例子或給我一個提示,怎么做?

文檔中所述,protobuf不會處理消息的開始和停止位置,因此在使用像TCP這樣的流套接字時,您必須自己做。

從文檔中:

[...]如果要將多個消息寫入單個文件或流,則由您決定一條消息的結束位置和下一條消息的開始位置。 協議緩沖區連線格式不是自定界的,因此協議緩沖區解析器無法確定消息在何處結束。 解決此問題的最簡單方法是在編寫消息本身之前先編寫每個消息的大小。 當您讀回消息時,您將讀取大小,然后將字節讀取到單獨的緩沖區中,然后從該緩沖區進行解析。 [...]

長度前綴是一個不錯的選擇。 根據您正在編寫的語言,有些庫可以為例如TCP使用長度前綴,也可以自己定義。

線路上緩沖區的示例表示形式可能是(格式從左邊開始):

[buf_length|serialized_buffer2]

因此,您在發送之前將代碼打包以包裝緩沖區可能看起來像(這在帶有node.js的javascript中):

function pack(message) {
  var packet = new Buffer(message.length + 2);

  packet.writeIntBE(message.length, 0, 2);
  message.copy(packet, 2);

  return packet;
}

要閱讀,您必須做相反的事情:

client.on('data', function (data) {
  dataBuffer = Buffer.concat([dataBuffer, data]);

  var dataLen = dataBuffer.readIntBE(0, 2);

  while(dataBuffer.length >= dataLen) {
    // Message length excluding length prefix of 2 bytes
    var msgLen = dataBuffer.readIntBE(0, 2);

    var thisMsg = new Buffer(dataBuffer.slice(2, msgLen + 2));

    //do something with the msg here

    // Remove processed message from buffer
    dataBuffer = dataBuffer.slice(msgLen + 2);
  }
});

您還應該知道,在TCP套接字上發送多個協議緩沖區時,它們可能會被緩沖以進行網絡優化(連接)並一起發送。 意味着無論如何都需要某種分隔符。

暫無
暫無

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

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