Java 套接字 - 如果没有客户端尝试连接,则跳过 SocketServer accept() 方法
Java Sockets - skip the SocketServer accept() method if no client is trying to connect
我有一个运行良好的小型客户端服务器程序。但是,我的服务器在这行代码处停止循环:
Socket client = server.accept()
我不希望发生这种情况,因为服务器还应该处理其他操作。
下面我就说说我的意思。
public class TimeServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(4000);
final List<Socket> clients = new ArrayList<>();
while (true) {
// Some code I need the server to keep on looping on it
System.out.println("Waiting for connection");
// accept connection
Socket client = server.accept();
System.out.println("Coneccted to: " + client.getPort());
// assign client to the handler
TimeHandler handler = new TimeHandler(client);
Thread t = new Thread(handler);
t.start();
clients.add(client);
System.out.println("Thread id: " + t.getId());
}
}
}
如何跳过 server.accept()
方法?因为程序停在那里,不断等待来自客户端的连接。此行下方的代码:
Socket client = server.accept()
不会 运行 除非,很明显,已经建立了联系。
如果这不可能发生或者它被认为是一种不好的做法,我可以使用什么更好的选择来实现我想要的上述目标?
与服务传入请求无关的服务器部分不属于该循环。
您应该明确区分此类功能 - 安装部分或服务器中不关心各个连接的其他活动:它们都位于代码的不同部分!
服务器的工作方式就是这种方式。接受之后发生的事情,应该处理一个特定的传入连接,例如解析响应,或为要响应的连接生成一个新线程,或将其委托给 ThreadPool worker 来执行响应,然后循环到等待另一个连接进来。
如果还有其他事情要做,您可能会考虑为其他事情打开不同的线程。
我有一个运行良好的小型客户端服务器程序。但是,我的服务器在这行代码处停止循环:
Socket client = server.accept()
我不希望发生这种情况,因为服务器还应该处理其他操作。
下面我就说说我的意思。
public class TimeServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(4000);
final List<Socket> clients = new ArrayList<>();
while (true) {
// Some code I need the server to keep on looping on it
System.out.println("Waiting for connection");
// accept connection
Socket client = server.accept();
System.out.println("Coneccted to: " + client.getPort());
// assign client to the handler
TimeHandler handler = new TimeHandler(client);
Thread t = new Thread(handler);
t.start();
clients.add(client);
System.out.println("Thread id: " + t.getId());
}
}
}
如何跳过 server.accept()
方法?因为程序停在那里,不断等待来自客户端的连接。此行下方的代码:
Socket client = server.accept()
不会 运行 除非,很明显,已经建立了联系。
如果这不可能发生或者它被认为是一种不好的做法,我可以使用什么更好的选择来实现我想要的上述目标?
与服务传入请求无关的服务器部分不属于该循环。
您应该明确区分此类功能 - 安装部分或服务器中不关心各个连接的其他活动:它们都位于代码的不同部分!
服务器的工作方式就是这种方式。接受之后发生的事情,应该处理一个特定的传入连接,例如解析响应,或为要响应的连接生成一个新线程,或将其委托给 ThreadPool worker 来执行响应,然后循环到等待另一个连接进来。
如果还有其他事情要做,您可能会考虑为其他事情打开不同的线程。