Почему такое название? Громкое? Глупое? Давайте не будем спешить с суждениями, а разберем по порядку пример и сделаем выводы в конце.
Поехали...
Возьмем наш предыдущий пример из поста "Пакет java.net что ты такое?", у нас остался не решенный вопрос. После того как клиент, устанавливал соединение с сервером, присылал сообщение и сервер ему отвечал, последний завершал свою работу и больше не мог принимать соединения от клиента.
Как это изменить?
По сути сообщение !pong было для сервера кнопкой выключения. Программа просто завершалась. Что бы этого не происходило мы всего лишь сделали бесконечный цикл, оставив возможность безопасно завершить соединение, это команда !bb.
Давайте еще модернизируем клиента, что бы наш пример стал больше соответствовать заголовку.
Поменяем класс Connection, теперь мы не будем отправлять статичное сообщение !ping, а будем вводить ручками любую строку в консоли. Помним что сообщение !bb завершит соединение с сервером (Ухты, вот это уже интереснее, не правда ли?=)).
А как же нам подключить к серверу сразу несколько клиентов? Как мы знаем, для того чтобы создать соединение, нужно создать объект типа Socket на стороне клиента и воссоздать его с помощью ServerSocket на стороне сервера – это необходимый минимум для соединения. Ну да, и что? Думаем, думаем...
- Так при каждом новом клиенте нам нужно воссоздавать такое же объект клиента!
- Верно!
Но нужно это делать в отдельных потоках, что бы старый Клиент не терял соединения при подключении нового.
Помимо того, что каждое новое соединение запускаем в новом потоке, мы добавили коллекцию в которой храним все соединения, для того чтобы отправлять ответ всем клиентам кроме отправителя.
private final List<Socket> connections = new ArrayList<>();
- Хм.. И правда это похоже на чат.
Исходный код https://github.com/Bla2Code/MultiChat