2010-07-05 66 views
3

我使用的TcpClient下面的代码TCPClient似乎不维持保持连接状态,为什么?

byte[] encbuff = System.Text.Encoding.UTF8.GetBytes("username" + ":" + "password"); 
     string follow = "track=soccer,twitter"; 
     byte[] encode_follow = System.Text.Encoding.UTF8.GetBytes(follow); 

     using (TcpClient client = new TcpClient()) 
     { 
      string requestString = "POST /1/statuses/filter.json HTTP/1.1\r\n"; 
      requestString += "Host: stream.twitter.com\r\n"; 
      requestString += "User-Agent: www.site.com\r\n"; 
      requestString += "Referer: http://www.site.com\r\n"; 
      requestString += "Content-Type: application/x-www-form-urlencoded\r\n"; 
      requestString += "Authorization: " + "Basic " + Convert.ToBase64String(encbuff) + "\r\n"; 
      requestString += "Content-length: " + follow.Length + "\r\n"; 
      requestString += "Connection: keep-alive\r\n"; 
      requestString += "\r\n"; 
      requestString += follow; 
      requestString += "\r\n\r\n"; 

      client.Connect("stream.twitter.com", 80); 
      //client.ReceiveTimeout = 100; 
      using (NetworkStream stream = client.GetStream()) 
      { 
       // Send the request. 
       StreamWriter writer = new StreamWriter(stream); 
       writer.Write(requestString); 
       writer.Flush(); 

       // Process the response. 

        StreamReader rdr = new StreamReader(stream); 

        while (!rdr.EndOfStream) 
        { 
         Console.WriteLine(rdr.ReadLine()); 
         Console.WriteLine("IS end: " + rdr.EndOfStream.ToString()); 
        } 
       } 

     } 

会发生什么事是,虽然Console.WriteLine命令(rdr.ReadLine());行会打印出几秒钟的状态,而不是停止+不再触及断点,即使它仍然连接。

什么应该做的是继续写状态的控制台,因为它是一个保持活动连接和“推特”关键字获取每隔几秒钟不断提过几次。

任何想法可能会造成这个问题?

+0

对于HTTP协议使用'TcpClient'似乎是一种矫枉过正。你有没有考虑过使用“WebClient”? – 2010-07-05 18:44:23

+0

那么,当我使用带keepalive连接的webclient或httpwebrequest时,流会在一段时间后关闭,我必须关闭连接并重新打开。我认为TcpClient是唯一支持保持连接打开并无限期地从流中读取数据的程序。 – rksprst 2010-07-05 18:48:57

+0

我使用WebClient成功阅读Twitter提要。我使用WebClient.OpenReadAsync并使用StreamReader读取。到目前为止,我还没有注意到自己的连接已经关闭。 – dtb 2010-07-05 18:54:26

回答

0

检查了这一点:

public class Program 
{ 
    public static void Main() 
    { 
     using (var client = new WebClient()) 
     { 
      client.Credentials = new NetworkCredential("username", "password"); 
      client.OpenReadCompleted += (sender, e) => 
      { 
       using (var reader = new StreamReader(e.Result)) 
       { 
        while (!reader.EndOfStream) 
        { 
         // TODO: feed this to your favorite JSON parser 
         Console.WriteLine(reader.ReadLine()); 
        } 
       } 
      }; 
      client.OpenReadAsync(new Uri("http://stream.twitter.com/1/statuses/filter.json?track=soccer,twitter")); 
     } 
     Console.ReadLine(); 
    } 
} 

应该让事情变得更容易。

+0

谢谢,你的代码实际上有同样的问题 - 这是我怎么弄清楚什么是错的。原来,这是一个帐户的流权限问题。我尝试了另一个帐户,它很好。 – rksprst 2010-07-06 03:06:01

+0

你能详细说明你的流媒体权限是什么意思吗? – jpierson 2013-01-10 19:27:57

相关问题