У меня есть простой сервер, который выглядит следующим образом
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(4999);
Socket s = ss.accept();
InputStream is = s.getInputStream();
while (true) {
System.out.println(is.read());
}
}
Он принимает один клиентский сокет, читает из него вечно и распечатывает номер, который был отправлен из клиентского сокета.
У меня есть такой клиент
public static void main(String[] args) throws IOException, InterruptedException {
int id = Integer.valueOf(args[0]);
Socket s = new Socket("localhost", 4999);
OutputStream os = s.getOutputStream();
while (true) {
os.write(id);
Thread.sleep(1000L);
System.out.println("Sent");
}
}
Он подключается к серверу и отправляет полученный номер в качестве аргумента командной строки навсегда.
- Я запускаю сервер.
- Я запускаю клиента, например
java -jar client.jar 123
. - Затем запускаю другого клиента, например
java -jar client.jar 234
. - Никаких ошибок не происходит ни на стороне сервера, ни на стороне клиента.
- Каждый клиент печатает сообщение
Sent
каждую 1 секунду, при этом ни один из них не блокируется.
Сервер печатает 123
только до конца времени.
Мои вопросы:
- Что происходит с байтами, записанными вторым клиентом?
- Я ожидаю, что второй клиент получит ошибку или будет заблокирован или что-то еще, но ничего не происходит.Почему?
Примечание: я знаю, что этот код плох, и я должен обрабатывать клиентов в потоках и вызывать ServerSocket.accept()
и все такое прочее.
Обновление :
Исходя из принятого ответа, решение состоит в том, чтобы создать сервер наподобие new ServerSocket(4999, 1);
, где 1
- размер отставания.0
будет означать использование любой настройки по умолчанию, настроенной в Java.
При использовании 1
в состоянии «не принято» может быть только одно соединение.Больше клиент, пытающийся подключиться, получает отказ в соединении!