2011-06-15 65 views
0

我试图建立一个开放的连接,然后在每次迭代时只写出流内容。如果有人将URL输入浏览器并刷新页面,则每次都会显示新的数据。我只希望显示来自数据流的每个时间实例的数据(例如,不是1 1,2 1,2,3 1,2,3,4 1,2,3,4,5等)帮助HTTPWebRequest流

This就是我得流过一次,但问题是之后的第一次迭代只打印新行:

HttpWebRequest myHttpWebRequest1 = (HttpWebRequest)WebRequest.Create("http://www.google.com/finance/getprices?q=GOOG&x=NASD&i=120&p=25m&f=d,c,v,o,h,l&df=cpct&auto=1&ts=1308075761332"); 

myHttpWebRequest1.KeepAlive = true; 
HttpWebResponse myHttpWebResponse1 = (HttpWebResponse)myHttpWebRequest1.GetResponse(); 


    Stream streamResponse = myHttpWebResponse1.GetResponseStream(); 
    StreamReader streamRead = new StreamReader(streamResponse); 


    while (true) 
    { 
     Char[] readBuff = new Char[1000000]; 
     int datalength = streamRead.Read(readBuff, 0, readBuff.Length); 
     String outputData = new String(readBuff, 0, datalength); 
     Console.Write(outputData + "\r\n"); 
     Thread.Sleep(2000); 
    } 

回答

0

当你说“第一次迭代”,你指的是第一次通过while循环?

如果是这样,那么您的缓冲区是1,000,000个字符,但Google页面只有约667个字符作为查询的结果。我怀疑你打印的是所有字符,然后通过同一个循环的后续过程将导致为空的outputData和CRLF(\ r \ n)(即一堆新行)。从本质上讲,响应流是空的,因为你已经在while循环的第一个迭代读了这一切,所以你需要停止阅读:

while (!streamRead.EndOfStream) 
{ 
    Char[] readBuff = new Char[1000000]; 
    int datalength = streamRead.Read(readBuff, 0, readBuff.Length); 
    String outputData = new String(readBuff, 0, datalength); 
    Console.Write(outputData + "\r\n"); 
    Thread.Sleep(2000); 
} 

更新:
我不看看keep-alive甚至可以如何使用HttpWebRequest,但是,您可以直接使用套接字连接并构建get请求。我有written an asynchronous socket client这样做,所以虽然它可能不是你正在寻找的,我仍然会建议你看看如何构建和发送请求。

private void BeginSend() 
{ 
    _clientState = EClientState.Sending; 
    Encoding ASCII = Encoding.ASCII; 
    string Get = "GET /" + _asyncTask.Path + " HTTP/1.1\r\nHost: " + _asyncTask.Host + "\r\nConnection: Keep-Alive\r\n\r\n"; 
    byte[] buffer = ASCII.GetBytes(Get); 

    SocketAsyncEventArgs e = new SocketAsyncEventArgs(); 
    e.SetBuffer(buffer, 0, buffer.Length); 
    e.Completed += new EventHandler<SocketAsyncEventArgs>(SendCallback); 

    bool completedAsync = false; 

    try 
    { 
     completedAsync = _socket.SendAsync(e); 
    } 
    catch (SocketException se) 
    { 
     Console.WriteLine("Socket Exception: " + se.ErrorCode + " Message: " + se.Message); 
    } 

    if (!completedAsync) 
    { 
     // The call completed synchronously so invoke the callback ourselves 
     SendCallback(this, e); 
    } 

} 

该类有很多东西,你可能不需要,但它非常强大。就你而言,当然,一旦数据被读取,你将不会断开连接。

+0

相同的谷歌网址显示不同的数据。对于每次迭代,我都想显示该URL的当前内容,而不是流的累积历史记录?当然,我不需要继续建立连接,这就是keepalie = true的意思? – Jean 2011-06-15 20:04:08

+0

您需要在每次迭代之后再次运行请求。 – Kiril 2011-06-15 20:05:54

+0

请求的哪个部分?当然没有/包括保持活力线?我已经尝试在keepalive = true之前包含所有内容,但它仍然不起作用。 – Jean 2011-06-15 20:31:34