【问题标题】:TCPClient seems to not maintain a keep-alive connection, why?TCPClient 似乎没有保持保持连接,为什么?
【发布时间】:2011-03-12 00:38:53
【问题描述】:

我有以下使用 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()); line 将在几秒钟内打印出状态,而不是停止 + 不再在那里打断点,即使它仍然处于连接状态。

它应该做的是继续在控制台中写入状态,因为它是一个保持活动的连接,并且每隔几秒钟就会连续提到几次“Twitter”关键字。

任何想法可能导致此问题?

【问题讨论】:

  • 对 HTTP 协议使用 TcpClient 似乎有点过头了。你有没有考虑过使用WebClient
  • 好吧,当我使用带有 keepalive 连接的 webclient 或 httpwebrequest 时,流总是在一段时间后关闭,我必须关闭连接并重新打开。我认为 TcpClient 是唯一支持保持连接打开并无限期地从流中读取的。
  • 我正在使用 WebClient 成功阅读 Twitter 提要。我使用 WebClient.OpenReadAsync 并使用 StreamReader 进行阅读。到目前为止,我还没有注意到连接会自行关闭。
  • 当我使用 WebClient 时,尤其是使用 follow... 发生的情况是,在那个时间段内不会有任何项目,因此 responseStream.EndOfStream 将为真,从而关闭流。我必须重新连接才能获得新的 responseStream。
  • @rksprst, WebClient 支持流式传输。请参阅我的回复以获取示例。

标签: c# asp.net twitter tcp tcpclient


【解决方案1】:

看看这个:

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

应该让事情变得更容易。

【讨论】:

  • 谢谢,你的代码实际上也有同样的问题——这就是我找出问题所在的方法。原来这是一个帐户的流媒体权限问题。我尝试了另一个帐户,它很好。
  • 您能否详细说明您所说的流媒体权限是什么意思?
猜你喜欢
  • 1970-01-01
  • 2011-11-14
  • 2015-04-18
  • 2021-10-23
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多