Java BufferedInputStream和Blocking
我正在使用Java BufferedInputStream和Blocking,java,sockets,bufferedinputstream,Java,Sockets,Bufferedinputstream,我正在使用BufferedInputStream从套接字读取数据。BufferedInputStream的内容如下: socketInput.read(replyBuffer, 0, 7); 它由 socketInput = new BufferedInputStream(mySocket.getInputStream()); mySocket定义为私有套接字mySocket mySocket由mySocket=newsocket(ipAddress,port)实例化 我已验证mySocke
BufferedInputStream
从套接字读取数据。BufferedInputStream
的内容如下:
socketInput.read(replyBuffer, 0, 7);
它由
socketInput = new BufferedInputStream(mySocket.getInputStream());
mySocket
定义为私有套接字mySocket代码>
mySocket
由mySocket=newsocket(ipAddress,port)实例化代码>
我已验证mySocket
是否已连接到我的设备。我可以向我的设备发送数据;但是,由于未知的原因,我没有收到来自设备的信息,但这不是问题所在
我希望我的BufferedInputStream
在100毫秒后返回,如果它没有读取任何数据。是否可以设置BufferedInputStream
来执行此操作?现在,它会无限期地阻塞。使用缓冲流从套接字读取数据通常是个坏主意,正是因为这个原因:如果它看不到足够的数据来填充其内部缓冲区(将大于7个字符!),它将永远等待,无法使其超时。直接使用SocketInputStream
,问题就会消失。为套接字指定100毫秒超时 如果您想要任何类型的非阻塞或超时I/O,您应该使用NIO(java.NIO
)类,而不是java.io
中的内容。如果我使用的是BufferedInputStream,这仍然有效吗?将会发生的是,您将从read()
调用中获得SocketTimeoutException
,即使实际上有足够的字节来满足您的请求。这不好。@Code Monkey它对任何包装输入流仍然有效。@Ernest Friedman Hill SocketTimeoutException在没有可用数据时抛出。所以您建议改为socket.getInputStream.read(..)?是的,就是这样。然后,您可以按照另一张海报的建议,使用setSoTimeout()
,您将获得所需的行为。