2014-11-06 34 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