我正在开发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