public class Slave implements Runnable {
public ServerSocket slaveSocket;
public Slave(ServerSocket sk) {socket = sk;}
@Override
public void run() {
Socket client = slaveSocket.accept(); // slave will wait to serve a client
// more code...
Socket clientPart2 = slaveSocket.accept();
// more code...
}
}
public class Server {
public static void main(String[] args) {
// for example only, incomplete code
ServerSocket serverSocket = new ServerSocket(0); // a client connect to 8088
Slave slave = new Slave(serverSocket);
new Thread(slave).start(); // slave serve the current client, the server wait for new client
// send new slave's port to client ...
}
}
因此,我有一台服务器,可同时为多个客户端提供服务。每当客户端连接时,服务器都会创建一个新的Slave,将该从服务器的IP /端口发送给客户端,然后客户端将与从服务器一起工作。
但是,如果客户端收到从站的地址,则什么也不做(或退出),slaveSocket.accept()
导致该从站线程永远运行,这很浪费。
我希望从属线程在等待slaveSocket.accept()
30秒后退出。由于slaveSocket.accept()
正在阻止,因此我无法从void run()
内部执行此操作。
解决此问题的正确,干净的方法是什么?谢谢。
[看一下返回AsynchronousServerSocketChannel's accept的Future
方法。然后,Future
有一个getter with timeout,可以完成您要问的事情。
注意:您可能会读到related tutorial。
然后,吸气剂将通过与工作线程中的阻塞方法一起使用的相应AsynchronousSocketChannel
和Channels.newInputStream
方法返回一个Channels.newInputStream
,该Channels.newOutputStream
可以转换返回阻塞。