C#:在向WebClient发送数据时正确完成连接

时间:2012-08-10 08:13:46

标签: c# sockets webclient tcpclient networkstream

我需要在本地测试一些使用WebClient对象与http服务器通信的代码。为此,我决定编写一个非常简单的模拟服务器,它从二进制文件中读取一些字节并将它们发送到客户端。以下是相关服务器的代码:

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);
}

使用WebClient我使用UploadString:

string response = client.UploadString(address + link, data);

所以,问题是,WebClient显然接收到所有已发送的数据,但抛出System.IO.Exception("无法从传输连接读取数据:连接已关闭。")当我关闭流服务器端。如果我不关闭流,WebClient会阻止并等待传输完成,尽管收到了所有数据。我试图用WebRequest替换WebClient,如果套接字在服务器端关闭,或者在读取所有数据后在stream.Read上,它也会抛出异常。我发现奇怪的是,我发送给WebClient的第一个数据块是一个http 302" Moved"响应,这会导致WebClient立即发送GET请求。尽管我发送数据的次数相同,但WebClient仅在第二次响应时抛出异常。

所以 - 我需要一种方法来正确发送数据并关闭连接,以便它可以与WebClient一起使用,我还想知道为什么WebClient正确处理302响应并在第二个响应上抛出异常。

谢谢。

2 个答案:

答案 0 :(得分:2)

您应该尝试使用“使用”说明来澄清它: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有一些读取和写入流的方法,你应该使用它而不是你的。

答案 1 :(得分:0)

答案实际上非常简单 - 第二个http响应在其标题中设置了“Transfer-Encoding:chunked”,我实际上并没有在响应结束时发送终止的零长度块,因此WebClient是等待更多数据。