Я написал простую программу, в которой сервер должен печатать данные, отправленные несколькими клиентами. Но сервер получает только частичные данные. Ниже приведены соответствующие фрагменты кода.сервер не получает данные от нескольких клиентов (java сокеты)
Сервер:
try {
serverSocket = new ServerSocket(8888);
} catch (IOException e) {
System.err.println("Could not listen on port: 8888");
System.exit(-1);
}
while (listening) {
Socket clientSocket = serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
System.out.println(reader.readLine());
reader.close();
clientSocket.close();
}
serverSocket.close();
Клиент:
try {
socket = new Socket("nimbus", 8888);
writer = new PrintWriter(socket.getOutputStream(), true);
localHost = InetAddress.getLocalHost();
}
catch (UnknownHostException e) {}
catch (IOException e) {}
StringBuilder msg1 = new StringBuilder("A: ");
for(int i=1; i<=3; i++)
msg1.append(i).append(' ');
writer.println(localHost.getHostName() + " - " + msg1);
StringBuilder msg2 = new StringBuilder("B: ");
for(int i=4; i<=6; i++)
msg2.append(i).append(' ');
writer.println(localHost.getHostName() + " - " + msg2);
StringBuilder msg3 = new StringBuilder("C: ");
for(int i=7; i<=9; i++)
msg3.append(i).append(' ');
writer.println(localHost.getHostName() + " - " + msg3);
writer.close();
socket.close();
я получаю следующий результат (при запуске на 3-х клиентов)
nimbus2 - A: 1 2 3
nimbus3 - A: 1 2 3
nimbus4 - A: 1 2 3
Я не получаю второе и третье Сообщения. Сервер продолжает ждать. Где я иду не так?
Редактировать: В код сервера я попытался удалить reader.close()
и clientSocket.close()
. Это тоже не сработало. Другой вопрос - если 3 клиента отправляют 3 сообщения, требуется ли 9 подключений? (по этой причине я закрыл соединение в код сервера)
Спасибо. Глядя на ваш код, я понял, что проблема с кодом сервера - это недостающий цикл (для чтения данных). Он отлично работает после добавления цикла (и я использую BufferedReader) – Raghava
Я рад, что смогу помочь. Если вы просто используете цикл, сервер сможет обрабатывать только данные от одного клиента за раз. Если второй клиент подключается, а первый по-прежнему отправляет данные, второй клиент будет вынужден ждать и может истечь. – patheros
ОК, спасибо за ваши входы :). Я бы использовал потоки, как вы предлагали. – Raghava