Мой сокет Java остается открытым при использовании его в потоке? - PullRequest
0 голосов
/ 04 сентября 2018

Я пишу простой Java-сервер, который принимает несколько соединений с сокетами клиента. Я использую отдельный поток для обработки каждого клиента / сокета. Учитывая, что я настроил сеть, включающую BufferedReader, InputStreamReader, FileWriter и т. Д. Для этого клиента / сокета.

Мой код:

//run method of my Runnable everytime a new client connects  
public void run(){
    String message = null; 
    while((message = bufferedReader.readLine())!=null){
        System.out.println(message+"/n");
        //do some other things like writing this message
        //to another client or saving it in a file, etc
    }
}
  • Означает ли это, что клиентский сокет открыт? или сокет в конечном итоге приводит к тому, что поток останавливается, когда завершает чтение из потока
  • Будет ли он ожидать новых / новых сообщений / данных из клиентского сокета даже после первого чтения?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Поток завершится, когда вызов readLine вернет null. Это происходит, когда читатель достигает «конца потока». Если BufferedReader упаковывает входной поток, связанный с сокетом, то «конец потока» будет инициирован закрытием соединения с сокетом; например потому что удаленный клиент / сервер закрыл его.

Здесь нет кода для закрытия BufferedReader. Он будет закрыт, если что-то еще вызовет close, или если объект BufferedReader станет недоступным. В последнем случае считыватель и нижележащий сокетный поток и сокет будут в конечном итоге закрываться, когда GC завершит объекты.

У меня вопрос: это держит клиентский сокет открытым? Или сокет и, в конце концов, поток перестает работать, когда он завершил чтение из потока, или он будет продолжать ждать новых / новых сообщений / данных из клиентского сокета, даже после того, как он завершит чтение в первый раз?

Это зависит. Смотри выше.

Дело в том, что написанный код читает до тех пор, пока не останется больше читать. Нет, пока "это не сделано". Или, говоря иначе, «это сделано» ... тогда и только тогда, когда другой конец сообщает об этом, закрывая поток.

0 голосов
/ 04 сентября 2018

Как только сервер принимает запрос клиента, он может бесконечно обмениваться сообщениями с клиентом, пока сокет не будет закрыт его потоками. Чтобы обеспечить непрерывность связи, вы должны читать из потока внутри цикла while и выходить только тогда, когда клиент отправляет запрос на завершение. Таким образом, в вашем случае клиентский сокет открыт до тех пор, пока вы не прочитаете, после выхода из цикла ваше соединение будет разорвано.

Где вы создали bufferedReader?

...