【问题标题】:C#: Correctly finishing connection when sending data to WebClientC#:向 WebClient 发送数据时正确完成连接
【发布时间】:2012-08-10 08:13:46
【问题描述】:

我需要在本地测试一些使用 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,如果套接字在服务器端关闭或在流上阻塞,它也会引发异常。读取所有数据后读取。我觉得奇怪的是,我发送给 WebClient 的第一个数据块是一个 http 302“已移动”响应,这会导致 WebClient 立即发送一个 GET 请求。尽管我两次发送相同的数据,但 WebClient 仅在第二次响应时抛出异常。

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

谢谢。

【问题讨论】:

  • 您发送的实际数据的一些转储会很好。试试 Fiddler。
  • 你是对的,问题在于正在发送的数据。我在单独的答案中发布了问题的描述。

标签: c# sockets webclient tcpclient networkstream


【解决方案1】:

您应该尝试使用“使用”指令来澄清它:http://msdn.microsoft.com/fr-fr/library/yh598w02

基本上,NetworkReader、MemeryStream 等类实现 IDisposable 接口。如果你用 using 包装它们,它会自动为你处理对象。

编辑: 另外,参考http://msdn.microsoft.com/fr-fr/library/system.net.sockets.networkstream_methods%28v=vs.80%29 有一些读取和写入流的方法,你应该使用它而不是你的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-20
      • 1970-01-01
      • 2018-02-16
      • 2022-11-11
      • 2017-01-10
      • 1970-01-01
      • 2022-11-11
      • 2012-12-05
      • 2020-07-13
      相关资源
      最近更新 更多