Проблема в том, что в данный момент вы принимаете соединение, но затем сразу же выполняете блокировку чтения на нем, пока оно не закроется:
// After a few changes...
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
String nextLine;
while ((nextLine = in.readLine()) != null) {
System.out.println(nextline);
}
Это означает, что тот же поток, который принимает соединение, пытается ручка соединение.Это не позволит вам использовать несколько соединений одновременно.
Вместо этого создайте класс (например, ConnectionHandler
), который реализует Runnable
и имеет конструктор, принимающий Socket
.Его метод run
должен обрабатывать соединение.Затем измените свой код на:
Socket clientSocket = serverSocket.accept();
Runnable connectionHandler = new ConnectionHandler(clientSocket);
new Thread(connectionHandler).start();
Это оставит ваш «основной» поток свободным для ожидания следующего соединения.
(Кстати, класс KnockKnockProtocol
недействительно "внешний" - это часть примера. Они просто не очень ясно дали понять, что источник здесь ...)