我想知道在Java NIO套接字中是否有可读字节.在C/C++中,可以使用以下内容完成:
int available(int fd){
long readable = 0;
if (ioctl(fd, FIONREAD, &readable) < 0){
// error
}
return (int) readable;
}
Run Code Online (Sandbox Code Playgroud)
可以使用Java NIO(使用SocketChannel,Selector,Socket等)执行相同的操作吗?
无法做到.正式地说,API存在于通过SocketChannel.socket().getInputStream().available(),但getInputStream()操作将在非阻塞通道上失败,因此它不能在您的环境中使用.
编辑:既然你已经照亮了我们一点点,你所需要的东西在Java中仍然不存在,但是当你处于非阻塞模式时,它无关紧要.只需读入一个至少与套接字接收缓冲区一样大的缓冲区:读取的字节数是可以在不阻塞的情况下读取的字节数,这正是您刚才所做的.
NIO 背后的想法是提供一种方法来同时等待来自多个连接中的任何一个的事件(例如“连接已准备好可读数据”),这听起来正是您正在寻找的。看看java.nio.channels.Selector。您基本上使用此选择器对象注册您拥有的所有连接的“可读”事件,然后调用select将等待您的连接之一上的事件的三个方法之一:
select() - 阻塞直到事件可用(如果您的程序无事可做,则使用)select(long timeout) - 阻塞直到有事件可用或发生超时(如果您想节省 CPU 负载并提高网络响应能力,如果您的程序有点慢,则可以使用)selectNow() - 立即返回(如果您的程序需要继续运行,请使用)然后使用该selectedKeys方法获取所有具有事件等待(例如,准备好读取数据)的连接的列表。然后只需遍历此列表并仅从连接中读取数据,并忽略不在列表中的其他连接,因为它们没有可用数据。
这将允许您在不阻塞的情况下检查数据是否可用(列表中是否有连接),但不检查有多少数据可用。但是,如果您随后使用可用数据读取连接,它将立即返回而不会阻塞并返回尽可能多的可用数据,如果您已为其提供足够大的缓冲区。然后,您可以选择在某处缓冲此数据并使缓冲区中的数据量可用,但有些事情告诉我您无论如何都不需要它,只想继续处理数据。
| 归档时间: |
|
| 查看次数: |
3940 次 |
| 最近记录: |