Поскольку вы используете
TcpClient client = tcpListener.AcceptTcpClient();
, вы можете написать клиенту напрямую, без необходимости его самоидентификации. Код, который у вас есть, на самом деле будет работать , если вы будете использовать Stream.Read()
или .ReadLine()
вместо .ReadToEnd()
.ReadToEnd()
будет блокироваться навсегда в сетевом потоке, пока поток не будет закрыт.См. этот ответ на аналогичный вопрос или MSDN ,
ReadToEnd предполагает, что поток знает, когда он достиг конца.Для интерактивных протоколов, в которых сервер отправляет данные только тогда, когда вы запрашиваете их, и не закрывает соединение, ReadToEnd может блокироваться на неопределенный срок, потому что он не достигает конца, и его следует избегать.
Если выиспользуйте ReadLine () с одной стороны, вам нужно использовать WriteLine (), а не Write () - с другой.Альтернативой является использование цикла, который вызывает Stream.Read (), пока не останется ничего для чтения.Вы можете увидеть полный пример этого для серверной части в документации AcceptTcpClient () на MSDN .Соответствующий пример клиента находится в документации TcpClient .