Что корректный путь состоит в том, чтобы закрыть соединение TCP

Мой опыт Java не состоит в том, что высоко также, таким образом, любой не стесняется исправлять меня. Но AFAIK, общее соглашение состоит в том, чтобы записать два метода как так:

public string getMyString() {
    // return it here
}

public void setMyString(string myString) {
    // set it here
}
8
задан bjb568 15 May 2014 в 03:17
поделиться

3 ответа

Как документы говорят:

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

Так что server.Close (); будет достаточно.

Закрытие NetworkStream первым никогда не повредит.

Между прочим, если вы используете TcpClient только в одном методе, заключите его в оператор using () , чтобы быть уверенным, что Dispose () (эквивалент to Close () ) вызывается на нем, даже если генерируются исключения и т. д.

6
ответ дан 5 December 2019 в 19:00
поделиться

Я свяжу TCP-соединение с сокетом.

Обычно процедура выглядит так: 1. Завершите отправку данных. 2. Вызовите Socket.Shutdown с параметром SocketShutdown.Send. 3. Цикл при получении, пока он не вернет 0 или не завершится с исключением 4. Вызов Close ()

Вот небольшой пример псевдокода, который очень похож на C #:)

void CloseConnection(Socket socket)
{
   socket.Send(/*last data of the connection*/);
   socket.Shutdown(SocketShutdown.Send);

   try
   {
      int read = 0;
      while( (read = socket.Receive(/*application data buffers*/)) > 0 )
      {}
   }
   catch
   {
      //ignore
   }
   socket.Close();
}

Если пропустить первый и третий шаги - может произойти потеря данных.

Взято из How to закрыть сокет TCP

3
ответ дан 5 December 2019 в 19:00
поделиться

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

Не забывайте промывать!

stream.Flush();
stream.Close();
server.Close();

Вы часто теряете некоторые данные, которые, как вы думали, могли бы отправить в противном случае. Это также помогает гарантировать, что поток будет пустым и неактивным при его закрытии.

0
ответ дан 5 December 2019 в 19:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: