Проблема в 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(); то все вполне работает.

21 Авг 2019 в 06:27
265 +1
1
Ответы
1

Проблема скорее всего заключается в том, что метод 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();
}
}

Этот код создает новый поток для каждого подключения, что позволяет серверу продолжать работу даже если один из клиентов не отправляет сообщения. Надеюсь, это поможет вам решить проблему.

20 Апр 2024 в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир