Java SocketChannel在读取时写入被阻止

时间:2017-05-14 08:05:54

标签: java sockets socketchannel

我尝试在两个不同的主题(Android API Level 25)中同时使用SocketChannel.writeSocketChannel.read

我将SocketChannel配置为阻止模式

为了阅读,我创建了一个无限循环来从服务器读取所有内容:

// Make socketChannel.read() return after 500ms at most
socketChannel.socket().setSoTimeout(500);
while(!SHUTDOWN) {
    int read = socketChannel.read(buffer);
    if(read > 0 ){
      // Do something nice
      break;
    }
}

写作时,我每隔10秒写一次数据。

问题是,我发现有时写作操作在阅读时被阻止了。

但是如果我让阅读线程在每个循环中短时间内休眠,例如100毫秒,这个问题将不再出现。

看起来像阅读线程阻止写线程

AFAIK,TCP连接可以同时提供双向操作。任何人都可以帮忙解释一下吗?

1 个答案:

答案 0 :(得分:1)

TCP Wikipedia - Flow Control中所述:

  

TCP使用端到端流量控制协议来避免使用   发送方发送数据的速度太快,TCP接收方无法接收和处理   它可靠。拥有流量控制机制是必不可少的   不同网络速度的机器进行通信的环境。对于   例如,如果PC将数据发送到正在缓慢处理的智能手机   收到数据,智能手机必须调节数据流,以免   不知所措。