当没有形成新的套接字时,即没有建立新连接时,server.accept()
方法会返回什么?是否可以在sever.accept()
等待新连接时转到下一行代码?
服务器等待连接时执行某些操作,可以使用多个线程。在单线程应用程序中,您不能调用函数并继续工作而不等待它返回:要么在等待服务器接受连接,要么正在执行其他计算。
线程的可能替代方法是在服务器套接字上设置 SO_TIMEOUT
套接字选项。这使得在超时内未收到连接时对accept
的调用将引发异常,从而允许您转到下一行。
例如:
ServerSocket ss = new ServerSocket(8989);
ss.setSoTimeout(10000); // 10 seconds
Socket clientSocket;
try {
clientSocket = ss.accept();
// process connection from client
} catch (SocketTimeoutException ste) {
// connection was not received,
// do something else
}
另一种选择是使用非阻塞 IO 和 Selector
类。 下面是以这种方式编写的非阻塞套接字服务器的示例。
不,server.accept() 是一个阻塞方法,它会等待。
来自 javadoc
侦听要与此套接字建立的连接并接受它。这 方法块,直到建立连接。