Мой опыт Java не состоит в том, что высоко также, таким образом, любой не стесняется исправлять меня. Но AFAIK, общее соглашение состоит в том, чтобы записать два метода как так:
public string getMyString() {
// return it here
}
public void setMyString(string myString) {
// set it here
}
Как документы говорят:
Вызов этого метода в конечном итоге приведет к закрытию связанного сокета, а также закройте связанный поток NetworkStream, который используется для отправки и получения данных, если он был создан.
Так что server.Close ();
будет достаточно.
Закрытие NetworkStream первым никогда не повредит.
Между прочим, если вы используете TcpClient только в одном методе, заключите его в оператор using ()
, чтобы быть уверенным, что Dispose ()
(эквивалент to Close ()
) вызывается на нем, даже если генерируются исключения и т. д.
Я свяжу 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
Вы правы, закрывая поток, а затем сервер. Это должно привести к успешному закрытию всех сокетов с течением времени, как указано в документации. Тем не менее, несколько ошибок, ломающих голову, со временем преподали мне важный урок:
Не забывайте промывать!
stream.Flush();
stream.Close();
server.Close();
Вы часто теряете некоторые данные, которые, как вы думали, могли бы отправить в противном случае. Это также помогает гарантировать, что поток будет пустым и неактивным при его закрытии.