Это код для Сервера, который у меня есть:
public class XXServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(4545);
while (true) {
Thread newThread = new Thread(new XXServerRunner(serverSocket.accept()));
newThread.start();
}
}
}
И у меня будет отдельный поток для каждого приемного сокета:
public class XXServerRunner implements Runnable {
Socket socket;
public XXServerRunner(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String readLine = bufferedReader.readLine();
if(readLine!=null) {
System.out.println(readLine);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
И вот как я запускаю Клиент:
public class XXClient {
Socket socket;
PrintWriter printWriter;
public static void main(String[] args) throws IOException {
XXClient xxClient = new XXClient();
xxClient.setSocket(new Socket("localhost",4545));
XXClientDataSender xxClientDataSender = new XXClientDataSender(xxClient);
Thread xxClientDataSenderThread = new Thread(xxClientDataSender);
xxClientDataSenderThread.start();
}
public PrintWriter getPrintWriter() {
return printWriter;
}
public void setSocket(Socket socket) throws IOException {
this.socket = socket;
this.printWriter = new PrintWriter(socket.getOutputStream());
}
public void sendText(String stringToBeSent) {
printWriter.write(stringToBeSent);
printWriter.flush();
}
}
То, что я хочу достичь, также представляет собой отдельный поток для отправки текстов, поэтому у меня есть следующее:
public class XXClientDataSender implements Runnable {
XXClient xxClient;
Scanner scanner = new Scanner(System.in);
public XXClientDataSender(XXClient xxClient) {
this.xxClient = xxClient;
}
@Override
public void run() {
while (true) {
String stringToBeSent = scanner.nextLine();
xxClient.sendText(stringToBeSent);
}
}
}
Что происходит, когда я запускаю свой код, я набираю текст в консоли и нажимаю Enter несколько раз, и я не вижу ничего в консоли, где я запускаю ServerSocket. Однако, когда я прекращаю выполнение основного метода клиента ( этот процесс Java я имею в виду, когда я убиваю Java-процесс для Клиента), в консоли сервера я вижу, что теперь весь текст просматривается. Почему это так?
Если то, что я говорю, непонятно, это так: Start Server Start Client Введите текст, нажмите enter.. Nothing Введите текст, нажмите enter.. Nothing Процесс Kill для клиента. Теперь весь текст теперь считывается сервером.
Зачем?
И я также получаю это исключение после того, как я убил процесс для Клиента:
Exception in thread "Thread-0" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1585)
at XXClientDataSender.run(XXClientDataSender.java:20)
at java.lang.Thread.run(Thread.java:745)
Записывайте символ новой строки в код клиента каждый раз, когда вы отправляете.
Вы используете BufferedReader#readLine()
который ожидает новый символ строки или конец потока.