Advertisement
Track33r

Simple Twitter stream api client C# source code

May 4th, 2012
1,197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.06 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Text;
  4. using System.Net;
  5. using System.Threading;
  6. using System.Runtime.Serialization.Json;
  7.  
  8. namespace TwitterLib
  9. {
  10.     public sealed class StreamClient :IDisposable
  11.     {
  12.        
  13.         System.Threading.ManualResetEventSlim _stopEvent = new ManualResetEventSlim(false);
  14.         System.Threading.ManualResetEventSlim _stopedEvent = new ManualResetEventSlim(true);
  15.        
  16.         public void Stop()
  17.         {
  18.             _stopEvent.Set();
  19.         }
  20.  
  21.         public void Connect(string terms, string user, string password, Action<status> OnStatus)
  22.         {
  23.             _stopEvent.Reset();
  24.             _stopedEvent.Reset();
  25.  
  26.             int wait = 0;
  27.  
  28.             while (!_stopEvent.IsSet)
  29.             {
  30.                 System.Threading.Thread.Sleep(wait);
  31.  
  32.                 try
  33.                 {
  34.                     //Connect
  35.                    
  36.                     var request = (HttpWebRequest)WebRequest.Create("https://stream.twitter.com/1/statuses/filter.json");
  37.                    
  38.                     request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
  39.                     request.Credentials = new NetworkCredential(user, password);
  40.  
  41.                     //stream api specs
  42.                     request.Timeout = -1;
  43.                     request.Method = "POST";
  44.  
  45.                     string parameters = string.Format(@"track={0}&delimited=length", terms);
  46.                     byte[] byteArray = Encoding.Default.GetBytes(parameters);
  47.                     request.ContentType = @"application/x-www-form-urlencoded";
  48.                     request.ContentLength = byteArray.Length;
  49.                     using(var streamOut = request.GetRequestStream())
  50.                     {
  51.                         streamOut.Write(byteArray, 0, byteArray.Length);
  52.                     }                  
  53.  
  54.                     using(var webResponse = (HttpWebResponse)request.GetResponse())
  55.                     {
  56.                         System.Console.WriteLine("Response content encoding :" + webResponse.ContentEncoding);
  57.                         Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
  58.                         using(var responseStream = new StreamReader(webResponse.GetResponseStream(), encode))
  59.                         {
  60.                             while (!_stopEvent.IsSet)
  61.                             {
  62.                                 ParseStream(responseStream, OnStatus);
  63.                                 wait = 250;
  64.                             }
  65.                         }                  
  66.                     }              
  67.  
  68.                 }
  69.                 catch (WebException ex)
  70.                 {
  71.                     Console.WriteLine(ex.Message);
  72.            
  73.                     if (ex.Status == WebExceptionStatus.ProtocolError)
  74.                     {
  75.                         //-- From Twitter Docs --
  76.                         //When a HTTP error (> 200) is returned, back off exponentially.
  77.                         //Perhaps start with a 10 second wait, double on each subsequent failure,
  78.                         //and finally cap the wait at 240 seconds.
  79.                         //Exponential Backoff
  80.                         if (wait < 10000)
  81.                         {
  82.                             wait = 10000;
  83.                         }
  84.                         else
  85.                         {
  86.                             if (wait < 240000)
  87.                             {
  88.                                 wait = wait * 2;
  89.                             }
  90.                         }
  91.                     }
  92.                     else
  93.                     {
  94.                         //-- From Twitter Docs --
  95.                         //When a network error (TCP/IP level) is encountered, back off linearly.
  96.                         //Perhaps start at 250 milliseconds and cap at 16 seconds.
  97.                         //Linear Backoff
  98.                         if (wait < 16000)
  99.                         {
  100.                             wait += 250;
  101.                         }
  102.  
  103.                     }
  104.                 }
  105.                 catch (Exception ex)
  106.                 {
  107.                     Console.WriteLine(DateTime.Now.ToString() + " " + ex.Message);
  108.                 }
  109.                
  110.             }
  111.  
  112.             _stopedEvent.Set();
  113.         }
  114.  
  115.         DataContractJsonSerializer _statusJson = new DataContractJsonSerializer(typeof(status));       
  116.  
  117.         private void ParseStream(StreamReader responseStream, Action<status> OnStatus)
  118.         {
  119.             status status = new status();          
  120.  
  121.             var lenghtString = responseStream.ReadLine();
  122.             if (lenghtString.Trim().Length == 0)
  123.             {
  124.                 //skip keep alive newline
  125.                 return;
  126.             }
  127.             var lenght = int.Parse(lenghtString);
  128.             var buffer = new char[lenght];
  129.             responseStream.Read(buffer, 0, lenght);
  130.             string str = new string(buffer);
  131.            
  132.             var bytes = Encoding.UTF8.GetBytes(buffer);
  133.             using (var memStream = new MemoryStream(bytes))
  134.             {
  135.                 status = (status)_statusJson.ReadObject(memStream);
  136.             }          
  137.  
  138.             if (status.user == null)
  139.             {
  140.                 Console.Write("Unknown object: " + str);
  141.                 return;
  142.             }
  143.            
  144.             try
  145.             {
  146.                 OnStatus(status);
  147.             }
  148.             catch (System.Exception ex)
  149.             {
  150.                 Console.WriteLine(DateTime.Now.ToString() + " " + ex.ToString());
  151.             }
  152.            
  153.         }
  154.  
  155.         public void Dispose()
  156.         {
  157.             Stop();
  158.             _stopedEvent.Wait();
  159.             _stopedEvent.Dispose();
  160.             _stopEvent.Dispose();
  161.         }
  162.     }
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement