Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets java.io OutputStreamWriter.writer在不频繁刷新时阻塞_Sockets_Tcp_Socket.io_Tcpclient_Serversocket - Fatal编程技术网

Sockets java.io OutputStreamWriter.writer在不频繁刷新时阻塞

Sockets java.io OutputStreamWriter.writer在不频繁刷新时阻塞,sockets,tcp,socket.io,tcpclient,serversocket,Sockets,Tcp,Socket.io,Tcpclient,Serversocket,我正在将数据写入socket.writer,我看到的是,如果我不经常刷新,writer就会被阻塞,永远也不会刷新。如果我每次写的时候都把它冲洗一下,就可以了。我不知道如何确定显式刷新的正确频率 while ((subQueue.readableElements()) > 0) { int batchSize = subQueue.getReadableElements(buf, 0, buf.length); for (int i = 0; i

我正在将数据写入socket.writer,我看到的是,如果我不经常刷新,writer就会被阻塞,永远也不会刷新。如果我每次写的时候都把它冲洗一下,就可以了。我不知道如何确定显式刷新的正确频率

      while ((subQueue.readableElements()) > 0) {
        int batchSize = subQueue.getReadableElements(buf, 0, buf.length);
        for (int i = 0; i < batchSize; i++) {
            TcpStringClient.this.outwriter.write(buf[i].getValue().toString());
            TcpStringClient.this.outwriter.write(RECORD_DELIMITOR);

        }
      }

     this.outwriter.flush();

非常感谢您提供的任何帮助

如果您正在向套接字写入数据,那么如果读取端比写入端慢,则会被阻止


刷新与此无关。

您使用的是哪种类型的outputStream?它是java.io.OutputStreamWriter OutWriter。如果StreamWriter认为没有足够的数据,则不会发送写入的值,这一点我并不感到惊讶。您的数据正在被缓冲,而flush所做的只是发送缓冲数据。我不知道具体的实现细节…我想还有别的事情在发生。如果其内部缓冲区已满,写入程序将自动尝试刷新。这是真的,您在另一个问题上帮助我解决了阻塞问题。在这种情况下,当我为每100次写入更改batchsize和flush时,就可以了。如果批处理大小类似于200,则写入将被阻止。服务器端的速度快于此客户端大小。