我正在開發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]
更高的緩衝區提供了更高的速度。有沒有辦法,如何保持速度並防止數據丟失? 謝謝
在我的情況,我想傳遞小消息e.g.10字節。我把它們放入大字節緩衝區以加速傳輸。 – 2014-11-07 00:09:45
@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
我循環讀寫方法(以確保所有內容都被讀取/寫入),但它會嚴重降低傳輸速度。有沒有其他方式可以快速傳輸? – 2014-11-11 02:46:56