我正在编写一个服务器程序,需要在通过java.util.Scanner
类请求用户输入时将信息(例如客户端连接或断开连接)打印到控制台。用户输入将是诸如“退出”之类的命令。
有没有办法在使用System.out.println()
打印信息的同时等待用户输入?如果我无法使用Scanner
执行此操作,System.out.println()
还有其他选择吗?
答案 0 :(得分:0)
您需要将处理与接受新连接分开。
这是一个微不足道(并且有点人为)的例子
private static final class Handler implements Runnable {
private final Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
//do stuff.
}
}
public static void main(String[] args) throws IOException {
final ServerSocket serverSocket = new ServerSocket();
final ExecutorService handlerExecutor = Executors.newFixedThreadPool(4);
while (true) {
final Socket socket = serverSocket.accept();
System.out.println("Got new connection, passing off to handler");
handlerExecutor.execute(new Handler(socket));
}
}
因此,主Thread
仅处理接受连接并将其传递给调用handlerExecutor
的{{1}}方法的run
。这意味着服务器可以继续等待新连接并在其分配的Handler
中的各个连接中继续工作时记录它们。