есть отдельный поток класс который работает с Socket-ом.Когда я отключаю клиент он все равно продолжает работать. Метод socket.isClosed()
возвращает false
а socket.isConnected()
true
хотя клиент давно уже отрублен.Как можно закрыть этот Socket? Есть мысли отправить сигнальный текст из клиента чтобы закрыть соединение типа :
String line = bufferedReader.readLine();
if(line.equals("exit")){
socket.close();
}
но я не могу использовать readLine() так как из клиента я отправляю только тогда когда получаю данные от сервера.Как это можно реализовать?помогите пожалуйста.Вот код который есть сейчас.На самом деле кода тут очень много ,я написал самую главную логику.
@Override
public void run() {
try(PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream(),
Charset.forName("cp1251")))){
while(true) {
out.println("soobshenie s servera");
out.flush();
if((socket.isClosed())||(!socket.isConnected())){
socket.close();
System.out.println("поток завершен");
break;
}
}
}
}
Методы isConnected()
и isClosed()
в Java работают немного не так, как вы представляете.
Метод isConnected()
возвращает true
тогда, когда сокет хоть раз был connected.
Даже если сокет уже давно закрыт, isConnected()
будет true
.
Метод isClosed()
возвращает true
, когда сокет был хоть раз закрыт. Если сокет никогда не был подключен, isClosed()
вернет false
, даже не смотря на то, что по факту он не открыт.
Следовательно, вот так вот можно проверить, подключен ли сокет к серверу на текущий момент времени.
boolean connected = socket.isConnected() && !socket.isClosed();
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте, разрабатываю грубо говорю систему для автоматического проведения олимпиад и вот столкнулся с проблемой синхронизации, точне...
ЗдравствуйтеНикак не могу понять, почему при следующем коде фор по два прохода за раз делает, когда я ожидаю один проход?