2012-07-20 241 views
0

我正在開發一個在服務器和客戶端應用程序之間使用java套接字的應用程序。我需要通過這些套接字將大小爲64k的文件從客戶端發送到服務器。當我在本地運行所有系統(包括服務器和客戶端)時,一切正常,但是當我在不同的計算機上運行服務器和客戶端時,它會失敗。通過套接字傳輸64k大小的文件失敗

我正在使用JSON處理文件內容,所以在服務器中拋出的異常是:「net.sf.json.util.JSONTokener.syntaxError」。但問題不在於JSON,而在於文件的大小。當我發送大小小於8k的文件時,一切正常,但更大的大小會截斷髮送的信息,因此當服務器嘗試解釋截斷的收到信息時,會引發JSONTokener.syntaxError。

我定義的64K套接字緩衝區如下(我使用NIO API):

SocketChannel sc; 
private static final int BUFFER _SIZE = (int)Math.pow(2, 16); 
..... 
sc.socket().setReceiveBufferSize( BUFFER_SIZE); 
sc.socket().setSendBufferSize(BUFFER_SIZE); 

什麼我需要做的,當我在一個偏僻的模式下運行我的系統,以擴大網絡的封裝尺寸?你有什麼想法是哪個問題? 非常感謝您提前。

奧斯卡

+3

聽起來像您的閱讀代碼可能已損壞。不要試圖依賴單個數據包中的所有內容,這可能是目前你所希望的......如果這是TCP,它就是一個* stream *協議。 – 2012-07-20 17:59:31

回答

0

緩衝區大小通常超過64K,所以你可能會真正縮小它們。

TCP數據包的MTU通常爲1.5 KB,並且改變這種情況極不可能對您有所幫助。無論如何,9000字節是我見過的最多的。

您可能遇到的問題可能與您正在編寫數據的方式有關,但我懷疑它的讀取方式與您的數據相同。假設您會收到您發送的相同大小的數據,或者您會一次收到全部數據,這是一個常見的錯誤。

流不會「知道」你寫的數據的大小,你不知道何時收到所有發送的數據,除非你有一個包含長度的協議。