打开它后阻塞数据套接字的有效方法是什么。我使用的方法是调用输入流上的读取(这是一个阻塞调用,等待一些数据写入此套接字)。
//Socket creation
SocketForCommunication = new Socket();
InetSocketAddress sAddr = new InetSocketAddress("hostName", 8800);
SocketForCommunication.connect(sAddr,10000);
is = new DataInputStream(SocketForCommunication.getInputStream());
os = new DataOutputStream(SocketForCommunication.getOutputStream());
//Waiting on socket using read method for data
while(true)
{
int data = is.read();
if(data == HEADER_START)
{
processPackage(is);
}
}
这里的问题是读取可以超时。有没有办法注册一个回调,当数据可用于读取套接字时会被调用。?
答案 0 :(得分:1)
默认情况下,套接字会超时,但如果您愿意,可以更改此设置。请参阅Socket.setSoTimeout()调用(超时为零意味着“无限期”)。
N.B。即使您指定零超时,您的操作系统可能会或可能不会实际让您无限期地保持套接字打开。例如,空闲套接字可能会在一定时间后关闭。在环境中,例如在共享的Web托管环境中,每天一次运行(例如)并关闭空闲套接字的家务例程并不罕见。
当然,事情发生在网络上。无论哪种方式,你都不应该依赖无限期保持开放的插座......
答案 1 :(得分:0)
您想使用java.nio
(非阻塞IO)系统。虽然它不受回调驱动,但它可以让您更灵活地处理IO。