2015-08-11 5 views
6

Я строю Mock-сервер с использованием TCPListener.C# - установленное соединение было прервано программным обеспечением вашего хост-компьютера Ошибка

Когда я попытался отладить мой код, запустив клиент, я смог прочитать запрос на сервере. Но на стороне клиента возникает исключение. Вот исключение, которое я получил из трассы:

System.ServiceModel.CommunicationException: Соединение сокета было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением времени приема удаленным хостом или проблемой сетевого ресурса. Локальный тайм-аут гнезда был «00: 05: 00». --- & gt; System.IO.IOException: невозможно прочитать данные из транспортного соединения: установленное соединение было прервано программным обеспечением вашего хост-компьютера. --- & gt; System.Net.Sockets.SocketException: установленное соединение было прервано с помощью программного обеспечения в хост-машине

Вот код I реализован на сервере:

TcpClient client = listener.AcceptTcpClient(); 
NetworkStream nwStream = client.GetStream(); 
byte[] buffer = new byte[client.ReceiveBufferSize]; 
int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize); 
var dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead); 

byte[] sendBytes = null; 
try 
{ 
    var output = "POST HTTP/1.1 200 OK\r\n"; 
    output += "Server: Apache-Coyote/1.1\r\n"; 
    output += "Content-Type: application/soap+xml\r\n"; 
    output += "Content-Length: 632\r\n"; 
    output += "Date: Thu, 06 Aug 2015 02:06:39 GMT\r\n\r\n"; 
    output += 
     "<S:Envelope xmlns:S=\"http://www.w3.org/2003/05/soap-envelope\"><S:Header></S:Header><S:Body></S:Body></S:Envelope>"; 
    sendBytes = Encoding.ASCII.GetBytes(output); 
    nwStream.Write(sendBytes, 0, sendBytes.Length); 
    nwStream.Flush(); 
} 
catch (SocketException se) 
{ 
    throw; 
} 

client.Close(); 

Edit

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

+0

Вы закрываете соединение, прежде чем клиент имеет возможность считывать данные. НИКОГДА не закрывайте соединение на сервере. Клиент должен всегда открывать соединение и закрывать соединение. Чтобы закрыть приложение на сервере, запишите событие закрытия, которое произойдет, когда клиент закроет соединение. – jdweng

ответ

2

Правильная настройка длины содержимого.

Если Content-Length больше фактической длины, клиентская сторона будет продолжать ждать оставшихся частей ответа. Но поскольку сервер уже выполнен с отправкой ответа, он завершит процесс.

Смежные вопросы

 Смежные вопросы