2014-11-06 36 views
0

我正在開發Android應用程序,手機在哪裏執行一些計算Wifi-Direct。 在我看來,效率至關重要。我的協議瓶頸是一個網絡。我使用SocketChannel來接收/傳輸數據。 這裏是我的僞代碼:通過SocketChannel高速傳輸期間數據丟失

byte[] array = new byte[]{20,20,20,20,20,20,20,20,20,20}; 
     for (int i=0; i<10; i++) 
     { 
      ByteBuffer sendBB = ByteBuffer.allocate(buffSize); 
      sendBB.put(array, 0, array.length); 
      sendBB.rewind(); 
      ByteBuffer receiveBB = ByteBuffer.allocate(buffSize); 

      try { 

       socketChannel.read(receiveBB); 
       socketChannel.write(sendBB); 

       byte[] received = new byte[10]; 
       receiveBB.rewind(); 
       receiveBB.get(received, 0, 10); 
       Log.i("Received", Arrays.toString(received));   


      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

相似的代碼爲另一方。 連接創建這樣的:

serverSocketChannel = ServerSocketChannel.open(); 
serverSocketChannel.socket().bind(socketAddress);   
socketChannel = serverSocketChannel.accept(); 

原來,一切都很好傳輸時buffSize小:100,200 當它是500和更高的我有一個數據丟失。我收到類似的東西:

[20,20,20,20,20,20,20,20,20,20] 
[0,0,0,0,0,0,0,0,0,0] 
[20,20,20,20,20,20,20,20,20,20] 
[20,20,20,20,20,20,20,20,20,20] 
[0,0,0,0,0,0,0,0,0,0] 
[0,0,0,0,0,0,0,0,0,0] 
[20,20,20,20,20,20,20,20,20,20] 
[20,20,20,20,20,20,20,20,20,20] 
[20,20,20,20,20,20,20,20,20,20] 
[20,20,20,20,20,20,20,20,20,20] 

更高的緩衝區提供了更高的速度。有沒有辦法,如何保持速度並防止數據丟失? 謝謝

回答

0

解決問題,通過循環讀寫:

int countWritten=0; 
while (countWritten < buffSize) 
{ 
    countWritten+=socketChannel.write(sendBB); 
} 
0

常見問題。

socketChannel.read(receiveBB); 
socketChannel.write(sendBB); 

你無視read()write()返回的長度。

byte[] received = new byte[10]; 
receiveBB.rewind(); 
receiveBB.get(received, 0, 10); 

這都是錯的。它應該是:

int count = socketChannel.read(receiveBB); 
byte[] received = new byte[count]; 
receiveBB.flip(); 
receiveBB.get(received); 
receiveBB.compact(); 

如果您正在等待固定長度的消息,則必須循環,直到獲取全部消息。 read()沒有義務填補緩衝區。

+0

在我的情況,我想傳遞小消息e.g.10字節。我把它們放入大字節緩衝區以加速傳輸。 – 2014-11-07 00:09:45

+0

@Sparrow_ua不管你的緩衝區大小如何,仍然不能保證read()會在第一次調用時填充它,write()也不會有效地將它全部寫入一次調用中。讀取[read()]的javadoc(http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html#read(java.nio.ByteBuffer))和[write ()](http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html#write(java.nio.ByteBuffer)),你可以看到字節數讀或寫可以從0直到緩衝區的「remaining()」大小 – Lolo 2014-11-07 20:32:40

+0

我循環讀寫方法(以確保所有內容都被讀取/寫入),但它會嚴重降低傳輸速度。有沒有其他方式可以快速傳輸? – 2014-11-11 02:46:56