我遇到的问题是,当我使用InputStream读取字节时,它会阻塞,直到连接完成。例如:
InputStream is = socket.getInputStream();
byte[] buffer = new byte[20000];
while (is.read(buffer) != -1) {
System.out.println("reading");
}
System.out.println("socket read");直到实际收到FYN数据包,"socket read“才会打印出来,从而关闭连接。在不阻塞和等待连接断开的情况下接收所有字节的正确方法是什么?
发布于 2010-03-01 14:47:29
试试这个:
InputStream is = socket.getInputStream();
byte[] buffer = new byte[20000];
int bytesRead;
do {
System.out.println("reading");
bytesRead = is.read(buffer);
}
while (is.available() > 0 && bytesRead != -1);
System.out.println("socket read");更多信息:https://docs.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html#available()
发布于 2010-03-01 11:36:24
看看支持non-blocking IO的java.nio吧。
发布于 2010-03-01 12:51:03
使用传统套接字的要点是,通常您确实希望它们阻塞:当逻辑上不希望程序阻塞时,您所做的是将读/写代码放在另一个线程中,以便单独的读/写线程阻塞,而不是整个程序。
如果做不到这一点,您可以使用available()方法在读取之前查看是否确实有可用的输入。但是,您需要注意不要通过不断调用available()而陷入消耗CPU的循环。
编辑:如果问题是你很乐意阻塞,直到字节到达,但直到连接断开(这就是发生的情况),那么你需要让另一端的客户端在发送字节后对其输出流调用flush()。
https://stackoverflow.com/questions/2353743
复制相似问题