gpt4 book ai didi

java - 如何终止由于Socket.accept()而被阻塞太长时间的线程?

转载 作者:行者123 更新时间:2023-12-03 11:56:44 30 4
gpt4 key购买 nike

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()内部进行操作。

解决此问题的正确,干净的方法是什么?谢谢你。

编辑1:将ServerSocket传递给从属服务器,因为客户端可以有多个将连接到该从属服务器的进程。因此,它不仅执行一项功能。

最佳答案

如果使用setSoTimeout设置超时,并且没有客户端连接,则ServerSocket.accept将引发异常。您可以捕获此异常。

要设置30秒的超时时间,请使用:

serverSocket.setSoTimeout(30000)

关于java - 如何终止由于Socket.accept()而被阻塞太长时间的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61015564/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com