2016-08-24 50 views
-1

我有一個2D動態數組包含整數和字符串,我需要發送到服務器。該陣列包含100,000列。一種可能性是將數組複製到文件中並將其發送到服務器,服務器可以解析它。而另一種可能性是做序列化。我正在做socket編程,我正在尋找的解決方案應該是最佳的。考慮到數組的大小,我不認爲將每個元素轉換爲字節會很好。請你能給我一些提示或指導我如何着手。如何通過套接字發送一個2D陣列到Java服務器

+2

「應該是最優的」以什麼方式優化?速度?安全?可靠性?你嘗試過什麼嗎?就目前而言,問題太廣泛了! – Burkhard

+0

在速度方面 – Shahzaib

+0

根據網絡的速度和質量,壓縮流可能會有用。再次請添加一些細節! – Burkhard

回答

0

將數據序列化爲字節以通過套接字進行流式傳輸,或將數據序列化爲文件以及發送文件基本上是一回事。如果您序列化到一個文件,您可以使用FTP等已建立的協議,這對於一個剛接觸套接字的開發人員來說更容易。

然而,再次意識到它們本質上是同一個問題。將編程對象分解爲字節以寫入輸出流。

編輯:

根據您的字符串的內容,使用zip壓縮算法是一個不錯的選擇。字符串中的重複內容越多,您獲得的壓縮比就越高。以下僅是一個示例文件格式:

  • 要輸入的整數數量。 (因爲你沒有在你的二維數組中給出最大的ROWS,所以我不能說這需要多少字節,我們假定它的8個字節。)
  • 所有整數。這將需要3 * NUM_INTS個字節。
  • 拉鍊壓縮的字符串,用空格分隔。

我在這裏做了很多假設,因爲您的問題還沒有足夠具體,或者您給出的任何答覆。

+0

現在,問題是,我們在談論什麼類型的文件? – Shahzaib

+0

這取決於你有什麼類型的數據。你的整數的範圍是什麼?這個文件是否需要被人類消費?你的琴絃有多久了? @Shahzaib –

+0

整數由6位數字組成,字符串由10個字符組成 – Shahzaib

0

我會將它轉換爲json或xml併發送它。在速度方面不是最有效的解決方案,而是最便攜的解決方案。

+1

CSV也不錯。 –

+0

這似乎是一個很好的建議......讓我考慮一下 – Shahzaib

0

一個簡單的方法是使用一個DataOutputStream並將它環繞您使用的插座:DataOutputStream dOut = new DataOutputStream(socket.getOuputStream())

然後,您可以只建立自己的簡單的二進制協議這樣的(它是一個一維數組,但它可以很容易地擴展爲二維數組工作以及):如果你想優化

//first write the amount of elements in the array 
dOut.write(array.length()); 

//now write every element  
for (Object obj : array) { 
    if (obj instanceof Integer) { 
     dOut.writeByte(0); //0 = Integer 
     dOut.writeInt((Integer) obj); 
    } else 
     if (obj instanceof String) { 
      dOut.writeByte(1); //1 = String 
      dOut.writeUTF((String) obj); //UTF-8 encoded String 
     } 
     // ... 
} 

對於數據大小,則還可以在套接字的OutputStreamDataOutputStream之間使用GZIPOutputStream,如下所示:new DataOutputStream(new GZIPOutputStream(socket.getOutputStream()))。當然,你必須在服務器端解壓它才能工作。

+0

所以基本上,我們將解析數組中的每個元素並將其寫入服務器。這不會帶來太多的網絡流量?換句話說,速度會降低。 – Shahzaib

+0

這基本上是一個序列化協議。除了解析它是什麼類型的對象並且爲每個元素浪費了一個字節以便稍後將它們分開之外,這是最佳的。如果你想要更多的速度和更少的數據,那麼我建議分離這些對象並將它們分別放入不同的數組中 - 所以整數進入一個int數組,而Strings進入一個String數組。 – Entrusc

+0

此外,GZIP壓縮會塑造掉一些流量(當然是換取性能)。特別是如果你的陣列中有很多相近的物體靠近。 – Entrusc

相關問題