通过Socket传输大数据

时间:2013-12-17 15:37:20

标签: java sockets nio

我目前尝试通过Socket-Connection发送大消息。我的消息有大约1.3 MB的东西。这是我的代码:

public void send(String message) throws IOException {
  byte[] bytes = message.getBytes(encoding);

  ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

  while (socketChannel.write(byteBuffer) > 0) {
  }
}

在客户端的另一端是一个Sever,它只打印出读取的数据。在大约260 kB之后,它总是停止读取。在我看来,一些缓冲区已满? 我该怎么做才能使这个Socket-Connection正常工作?

2 个答案:

答案 0 :(得分:1)

while (socketChannel.write(byteBuffer) > 0) {
}

如果您不处于阻塞模式,则只要本地套接字发送缓冲区填满,此循环就会终止,这会导致write()返回零。

简单但质量较差的修复方法是将循环条件从>更改为>=。但是,如果write()返回零,您应该使用SelectorOP_WRITE来检测通道何时再次可写。

答案 1 :(得分:0)

我认为最好为你的ByteBuffer分配足够的空间并在发送之前将其翻转,因为你想从现在开始读取它。也许这适合你。

final byte[] bytesToSend = message.getBytes(encoding);
ByteBuffer buffer = ByteBuffer.allocate(bytesToSend.length);  
buffer.clear();  
buffer.put(bytesToSend);  
buffer.flip();  
while (buffer.hasRemaining()) {  
  try {  
    socketChannel.write(buf);  
  } catch (IOException e) {  
    e.printStackTrace();  
  }
}