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

Java 在套接字上阻塞数据的最佳方法,java,android,Java,Android,打开套接字后,在套接字上阻塞数据的有效方法是什么。我使用的方法是调用输入流上的read(这是一个阻塞调用,等待一些数据写入该套接字) 这里的问题是读can超时。有没有办法注册一个回调,当数据可在套接字上读取时调用该回调?默认情况下,套接字将超时,但如果确实需要,您可以更改它。请参阅Socket.setSoTimeout()调用(超时为零表示“不确定”) 注意:即使您指定了零超时,您的O/S也可能允许或不允许您无限期地保持套接字打开。例如,空闲套接字可能在一定时间后关闭。在环境中,例如共享web托

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


这里的问题是读can超时。有没有办法注册一个回调,当数据可在套接字上读取时调用该回调?

默认情况下,套接字将超时,但如果确实需要,您可以更改它。请参阅Socket.setSoTimeout()调用(超时为零表示“不确定”)

注意:即使您指定了零超时,您的O/S也可能允许或不允许您无限期地保持套接字打开。例如,空闲套接字可能在一定时间后关闭。在环境中,例如共享web托管环境中,每天运行(比如)一次并关闭空闲套接字的内务管理例程并不少见


当然,事情发生在网络上。无论如何,您都不应该依赖套接字无限期地保持打开状态…

您想要使用
java.nio
(非阻塞IO)系统。虽然它不是回调驱动的,但它允许您在处理IO时具有更大的灵活性

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