Проблема в 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
216 +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 Апр в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир