【发布时间】:2020-04-03 15:45:27
【问题描述】:
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,将这个 Slave 的 IP/端口发送给客户端,然后客户端将与从站一起工作。
但是,如果客户端收到从机的地址,则什么都不做(或退出)(编辑:这意味着客户端和服务器已连接,但客户端什么也不做,因为例如用户选择午餐)slaveSocket.accept() 导致从属线程永远运行,这是浪费。
我希望从线程在等待slaveSocket.accept() 30 秒后退出。由于slaveSocket.accept() 被阻塞,我无法从void run() 内部执行此操作。
解决这个问题的正确、干净的方法是什么?谢谢。
编辑 1:将 ServerSocket 传递给从属服务器,因为客户端可以有多个进程连接到该从属服务器。所以它不只是执行一个功能。
【问题讨论】:
-
Read the Javadoc,特别是抛出 SocketTimeoutException 的原因。
-
每当客户端连接时,服务器都会创建一个新的 Slave...但是我可以看到您将
ServerSocket传递给Slave工作线程类。 ..你想达到什么目的?我问是因为工作线程(或Slave类)通常用于为客户端服务。因此,您应该(通常至少)将单个Socket实例传递给Slave类以服务单个(已接受)客户端。 -
另外,客户端在第一次连接时已经知道服务器的IP和端口。至少在这种情况下,您不需要将其发送给他。您已经可以在
Slave类中使用名为client的Socket。无需创建另一个套接字。也不需要向他发送 IP+端口,因为客户端已经知道它首先要连接。除非您向他发送另一台服务器的 IP+端口。这就是为什么(底线)我在问你想要实现什么。 -
“但是,如果客户端收到从站的地址,则什么也不做(或退出)......”我无法解析也无法理解这句话。也许重写?
-
@gthanop 客户端包含多个进程,每个进程都需要单独与从站一起工作。所以slave不能和Server使用同一个socket,因为server仍然需要接受新来的客户端(或者我可以用同一个socket吗?我没试过)
标签: java multithreading sockets runnable blocking