Быстро, но безболезненно ваш сервер пишет прямо в выходной поток, вызывая OutputStream#write(byte[] data)
, но ваши клиенты читают с BufferedReader
, а BufferedReader#readLine()
- это блокирующая операция ввода / вывода, которая приостановит его потокпока символ \n
или \r
не прибудет на InputStream
(или поток не будет закрыт, в этом случае метод будет прерван, а null
будет возвращен).
Строка, которую отправляет ваш сервер, делаетне заканчивается \n
или \r
, поэтому данные могут быть уже отправлены и задерживаться в буфере клиентского BufferedReader
, но без этих завершающих символов readLine()
никогда не вернется.
Просто измените
out.write("sampleSendToClient".getBytes());
до
out.write("sampleSendToClient\n".getBytes());
должны сделать трюк.
Обновление:
while ( (data = in.readLine()) != null ) {
System.out.println(data);
}
Этот цикл while
завершится только еслиreadLine()
возвращает null
это будет иметь место, только если поток закрыт.Однако, поскольку вы не можете закрыть потоки без потери соединения, вам придется найти другой способ завершить цикл, потому что теперь он будет работать вечно.
Даже после добавления \n
ваш сервер не будет отвечатьпотому что он будет бесконечно зацикливаться в этой точке.
С другой стороны: для каждого нового соединения вы перезаписываете предыдущий сокет, не закрывая его ресурсы (в первую очередь ориентированные на поток данных и сами сокеты)и, следовательно, создание утечек ресурсов.Попробуйте закрыть каждый объект, когда он больше не нужен.