C#:将数据发送到WebClient时正确完成连接
我需要在本地测试一些使用WebClient对象与HTTP服务器进行通信的代码。为此,我决定写一个令人难以置信的简单模拟服务器,它从二进制文件中读取一些字节并将它们发送给客户端。下面是相关服务器的代码:C#:将数据发送到WebClient时正确完成连接
public void Listen()
{
TcpClient client;
NetworkStream netStream;
listener.Start();
try
{
client = listener.AcceptTcpClient();
netStream = client.GetStream();
ReadData(netStream);
Console.WriteLine("Writing data, sequence 1");
WriteData(netStream, 1);
netStream.Close();
client.Close();
client = listener.AcceptTcpClient();
netStream = client.GetStream();
ReadData(netStream);
Console.WriteLine("Writing data, sequence 2");
WriteData(netStream, 2);
netStream.Close();
client.Close();
}
catch(Exception e)
{
}
}
private void WriteData(NetworkStream netStream, int sequence)
{
byte[] bytes = PrepareResponse(sequence); //get data from a file
netStream.Write(bytes, 0, bytes.Length);
}
随着Web客户端我用UploadString:
string response = client.UploadString(address + link, data);
那么,事情是,WebClient的显然是接收所有发送的数据,而是抛出一个System.IO.Exception (“无法从传输连接读取数据:连接已关闭。”)当我关闭流服务器端时。如果我不关闭流,WebClient会阻止并等待传输完成,尽管所有数据都已收到。我尝试用WebRequest替换WebClient,如果套接字关闭了服务器端或数据流阻塞,它也会引发异常。读取所有数据后读取。我感到奇怪的是,我发送给WebClient的第一个数据块是一个http 302“Moved”响应,它使WebClient立即发送一个GET请求。尽管我发送了两次相同的数据,WebClient仅在第二个响应中抛出异常。因此 - 我需要一种方法来正确发送数据并关闭连接,以便它可以与WebClient一起使用,并且我还想知道为什么WebClient正确处理302响应并在第二个响应中抛出异常。
谢谢。
答案其实很简单 - 第二个http响应在它的头文件中设置了“Transfer-Encoding:chunked”,并且在响应结束时我没有真正发送终止的零长度块,因此WebClient正在等待更多数据。
你应该尝试使用“使用”指令澄清:http://msdn.microsoft.com/fr-fr/library/yh598w02
基本上,像NetworkReader,MemeryStream等..类实现IDisposable接口。如果你使用它们来包装它,它会自动为你处理对象。
编辑: 此外,参照http://msdn.microsoft.com/fr-fr/library/system.net.sockets.networkstream_methods%28v=vs.80%29有一些方法来读取和写入流,你应该使用这个,而不是你的。
你发送的实际数据的一些转储会很好。尝试提琴手。 – CodeCaster 2012-08-10 08:15:31
你说得对,问题在于数据被发送。我在单独的答案中发布了问题的描述。 – sdds 2012-08-10 11:23:30