Проблема в java.net или в нечто другом? Занимаюсь написанием простейшего чата. Есть клиент и сервер каждый из них принимает и пишет в сокет. Но по каким то неведомым причинам сервер не отрабатывает как нужно. По условие выше msg = null.public void setNet(){ try { ServerSocket serverSocket = new ServerSocket(5000); while (true){ System.out.println("while working"); Socket socket = serverSocket.accept(); InputStreamReader streamReader = new InputStreamReader(socket.getInputStream()); BufferedReader reader = new BufferedReader(streamReader); msg = reader.readLine(); System.out.println(msg); System.out.println("reader working"); if(msg != null){ writer = new PrintWriter(socket.getOutputStream()); writer.println(msg); System.out.println("writer working"); writer.flush(); writer.close(); } else { System.out.println("msg = null"); } } } catch (Exception e) { e.printStackTrace(); } } Если закомментировать строчку msg = reader.readLine(); то все вполне работает.
Проблема скорее всего заключается в том, что метод readLine() блокирует поток выполнения до тех пор, пока он не прочитает новую строку из сокета. Таким образом, если клиент не отправит новую строку, метод будет ждать вечно и ваш сервер "зависнет".
Один из способов решения этой проблемы - использовать механизмы многопоточности. Вы можете запустить чтение сообщений из сокета в отдельном потоке, чтобы ваш сервер мог продолжать принимать новые подключения и обрабатывать другие задачи. Вот пример, как это можно сделать:
public void setNet() { try { ServerSocket serverSocket = new ServerSocket(5000); while (true) { System.out.println("while working"); Socket socket = serverSocket.accept(); new Thread(() -> { try { InputStreamReader streamReader = new InputStreamReader(socket.getInputStream()); BufferedReader reader = new BufferedReader(streamReader); String msg; while ((msg = reader.readLine()) != null) { System.out.println(msg); System.out.println("reader working"); writer = new PrintWriter(socket.getOutputStream()); writer.println(msg); System.out.println("writer working"); writer.flush(); } writer.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } }).start(); } } catch (IOException e) { e.printStackTrace(); } }
Этот код создает новый поток для каждого подключения, что позволяет серверу продолжать работу даже если один из клиентов не отправляет сообщения. Надеюсь, это поможет вам решить проблему.
Проблема скорее всего заключается в том, что метод readLine() блокирует поток выполнения до тех пор, пока он не прочитает новую строку из сокета. Таким образом, если клиент не отправит новую строку, метод будет ждать вечно и ваш сервер "зависнет".
Один из способов решения этой проблемы - использовать механизмы многопоточности. Вы можете запустить чтение сообщений из сокета в отдельном потоке, чтобы ваш сервер мог продолжать принимать новые подключения и обрабатывать другие задачи. Вот пример, как это можно сделать:
public void setNet() {try {
ServerSocket serverSocket = new ServerSocket(5000);
while (true) {
System.out.println("while working");
Socket socket = serverSocket.accept();
new Thread(() -> {
try {
InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(streamReader);
String msg;
while ((msg = reader.readLine()) != null) {
System.out.println(msg);
System.out.println("reader working");
writer = new PrintWriter(socket.getOutputStream());
writer.println(msg);
System.out.println("writer working");
writer.flush();
}
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Этот код создает новый поток для каждого подключения, что позволяет серверу продолжать работу даже если один из клиентов не отправляет сообщения. Надеюсь, это поможет вам решить проблему.