Warning: file_put_contents(/datas/wwwroot/jiajiahui/core/caches/caches_template/2/default/show.php): failed to open stream: Permission denied in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 55

Warning: chmod(): Operation not permitted in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 56
C#:将数据发送到WebClient时正确完成连接 - 源码之家

C#:将数据发送到WebClient时正确完成连接

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响应并在第二个响应中抛出异常。

谢谢。

+3

你发送的实际数据的一些转储会很好。尝试提琴手。 – CodeCaster 2012-08-10 08:15:31

+0

你说得对,问题在于数据被发送。我在单独的答案中发布了问题的描述。 – sdds 2012-08-10 11:23:30

答案其实很简单 - 第二个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有一些方法来读取和写入流,你应该使用这个,而不是你的。