2013-04-13 3 views
0

После того, как я создал сокет и установил соединение, я использую BufferedReader и PrintWriter для записи/чтения из сокета.Java socket TCP teardown

Socket s = new Socket(ip, port); 
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
PrintWriter out = new PrintWriter(s.getOutputStream()); 

Когда я закончил использовать гнездо, я закрою его.

s.close(); 

Это приведет к отправке плагина TCP и оставлению полуоткрытого TCP-соединения. Есть ли способ определить, закрыл ли клиент/сервер его конец соединения?

+0

Посмотрите на это [вопрос] (http://stackoverflow.com/questions/155243/why-is-it-impossible-without-attempting-io-to-detect-that-tcp-socket-was- grac), он должен ответить на ваш вопрос с довольно большой информацией. – Carlo

ответ

1

Это приведет к отправке плагина TCP и оставлению полуоткрытого TCP-соединения.

Не совсем. Он оставит полуоткрытое TCP-соединение, которое выдаст сброс, если получит больше данных.

Есть ли способ определить, закрыл ли клиент/сервер его конец соединения?

Нет, если вы уже закрыли свой. Если вы только что выпустили перезагрузку записи, вы можете прочитать ее до тех пор, пока EOS, которая не сообщит вам об этом, а затем закройте сокет. Не очень важно, если вам действительно нужно добиться одновременных закрытий.

+0

Каков наилучший способ определить, была ли закрыта одна из сторон соединения? Это что-то реализовать в приложении, которое уведомляет другого клиента? – Carlj901

+0

Чтение EOS говорит вам об этом. – EJP