阻塞数据套接字的最佳方法

时间:2010-06-25 06:52:25

标签: java android

打开它后阻塞数据套接字的有效方法是什么。我使用的方法是调用输入流上的读取(这是一个阻塞调用,等待一些数据写入此套接字)。

//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);
    }
}

这里的问题是读取可以超时。有没有办法注册一个回调,当数据可用于读取套接字时会被调用。?

2 个答案:

答案 0 :(得分:1)

默认情况下,套接字会超时,但如果您愿意,可以更改此设置。请参阅Socket.setSoTimeout()调用(超时为零意味着“无限期”)。

N.B。即使您指定零超时,您的操作系统可能会或可能不会实际让您无限期地保持套接字打开。例如,空闲套接字可能会在一定时间后关闭。在环境中,例如在共享的Web托管环境中,每天一次运行(例如)并关闭空闲套接字的家务例程并不罕见。

当然,事情发生在网络上。无论哪种方式,你都不应该依赖无限期保持开放的插座......

答案 1 :(得分:0)

您想使用java.nio(非阻塞IO)系统。虽然它不受回调驱动,但它可以让您更灵活地处理IO。

http://rox-xmlrpc.sourceforge.net/niotut/index.html