2009-06-16 3 views
3

Я пишу программу. моя программа получает данные с сервера через протокол HTTP. данные будут перенаправлены сервером на мою программу. Я попытался использовать WebRequest, но получил только один сеанс данных. Как я могу сохранить соединение живым, чтобы получать данные с сервера постоянно, Любая помощь приветствуется.Как получить данные на сервере в C#?

следующие является SDK документ:

Под разрешением гостя или ADMIN, можно получить серию живых изображений (Server Push). Чтобы получить изображения, отправьте запрос на «/liveimg.cgi?serverpush=1», как показано на рисунке . 2-1-1.
Когда камера получает вышеуказанный запрос от клиента, он отправляет возврат, как показано на рисунке . 2-2.
Каждый JPEG-данные разделяются «-myboundary», а «image/jpeg» возвращается как Заголовок «Content-Type», после «--myboundary». Для заголовка Content-Length он возвращает количество байтов в --myboundary данных (исключая «--myboundary», каждый заголовок и \ r \ n в качестве разделителя). После заголовка «Content-Length» и «\ r \ n» (разделитель) будут отправлены фактические данные .
Эта передача данных будет продолжаться до тех пор, пока клиент не остановит соединение (отключить), или произойдет некоторая сетевая ошибка.

int len; строка uri = @ "http://192.168.0.2/liveimg.cgi?serverpush=1";

 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri); 
     req.Credentials = new NetworkCredential("admin", "admin"); 
     req.KeepAlive = true; 

     string line = ""; 

     HttpWebResponse reply = (HttpWebResponse)req.GetResponse(); 
     Stream stream = reply.GetResponseStream(); 

     System.Diagnostics.Debug.WriteLine(reply.ContentType); 

     StreamReader reader = new StreamReader(stream); 
     do 
     { 
      line = reader.ReadLine(); 
      System.Diagnostics.Debug.WriteLine(line); 

      System.Threading.Thread.Sleep(300); 

     } while (line.Length>0); 

ответ

0

Если вы используете стандартный веб-сервер, он никогда не будет толкать что-нибудь к вам - ваш клиент будет периодически вытаскивать из него вместо.

Чтобы действительно получить данные на сервере, вы должны сами создать такой сервер.

+0

Проблема здесь, кажется, сервер посылает вам «несколько» ответов. То есть, многие ответы конвейерны (HTTP/1.1 featore) обратно клиенту. Это очень неясно, почему HttpWebResponse поддерживает любые конвейерные запросы любым способом, кроме чтения потока ответов и его анализа самостоятельно. Но в любом случае классы HttpWebRequest/HttpWebResponse в .NET - это место для начала, я думаю. – nos

+1

Что относительно WebSockets? При этом сервер фактически «нажимает» на клиента. – Brady

1

Если я правильно понимаю вас, ваш сервер будет отвечать на какое-либо событие, отправив данные клиенту за пределы клиента, делающего запрос/ответ. Это верно? Если это так, я бы не рекомендовал пытаться сохранить соединение открытым, если у вас не очень мало клиентов - существует ограниченное количество подключений, поэтому их сохранение может быстро привести к исключению.

Возможно, самым простым решением было бы периодически опроса клиентов для новых данных. Это позволит вам использовать простой сервер, и вам нужно будет только закодировать поток на клиенте, чтобы запросить любые изменения или новую работу один раз в минуту или тридцать секунд или любой ваш оптимальный период времени.

Если вы действительно хотите, чтобы сервер предупреждал клиентов проактивно, без их опроса, вам нужно будет сделать что-то другое, кроме простого веб-сервера, - и вам также придется кодировать и настраивать клиента для принимать входящие запросы. Это может быть сложно, если ваши клиенты работают за брандмауэрами и т. Д. Если вы идете по этому маршруту, WCF, вероятно, ваш лучший выбор, так как он позволит вам настроить сервер и клиент соответствующим образом.

2

Вы можете сохранить HTTP-соединение открытым в течение длительного периода времени, если сервер поддерживает это. (Как уже упоминалось, это значительно ограничит количество одновременных пользователей, которых вы можете поддерживать.)

Серверу необходимо будет установить Response.Buffer = false и иметь расширенный ScriptTimeout (я предполагаю, что вы используете ASP. NET на стороне сервера). Как только вы это сделаете, ваша страница может продолжать отправлять данные Response.Write по мере необходимости, пока не будет сделано то, что она делает.

Ваш клиент должен обработать входящий ответ до завершения соединения, а не блокировать полный ответ.

2

Возможно, вы захотите взглянуть на StreamHub Push Server - его популярный сервер Comet и имеет .NET Client SDK, который позволяет получать обновления в режиме реального времени в C# (или VB/C++).

+0

StreamHub позволяет толстым клиентам как .Net, но сервер java –

1

Вам нужно получить куки-файл от IP-камеры и включить этот файл cookie в заголовок вашего следующего HttpWebRequest. В противном случае он всегда будет пытаться перенаправить вас на «index.html».
Вот как вы можете это сделать ...

BitmapObject - это класс, который служит контейнером для изображения Jpeg, текущей даты и возможного текста ошибки. Как только соединение будет установлено, он объединит изображение каждые 200 мс. То же самое должно применяться для непрерывного потока изображений, полученного с помощью «serverpush».

public void Connect() 
{ 
    try 
    { 
     request = (HttpWebRequest)WebRequest.Create("Http://192.168.0.2/index.html"); 

     request.Credentials = new NetworkCredential(UserName,Password); 
     request.Method = "GET"; 
     response = (HttpWebResponse)request.GetResponse(); 
     WebHeaderCollection headers = response.Headers; 
     Cookie = headers["Set-Cookie"];//get cookie 

     GetImage(null); 
    } 
    catch (Exception ex) 
    { 
     BitmapObject bitmap = new BitmapObject(Properties.Resources.Off,DateTime.Now); 
     bitmap.Error = ex.Message; 
     onImageReady(bitmap); 
    } 
} 

private Stream GetStream() 
{ 
    Stream s = null; 
    try 
    { 
     request = (HttpWebRequest)WebRequest.Create("http://192.168.0.2/liveimg.cgi"); 
     if (!Anonimous) 
      request.Credentials = new NetworkCredential(UserName, Password); 
     request.Method = "GET"; 
     request.KeepAlive = KeepAlive; 

     request.Headers.Add(HttpRequestHeader.Cookie, Cookie); 
     response = (HttpWebResponse)request.GetResponse(); 
     s = response.GetResponseStream(); 

    } 
    catch (Exception ex) 
    { 
     BitmapObject bitmap = new BitmapObject(Properties.Resources.Off,DateTime.Now); 
     bitmap.Error = ex.Message; 
     onImageReady(bitmap); 
    } 
    return s; 
} 

public void GetImage(Object o) 
{ 
    BitmapObject bitmap = null; 
    stream = GetStream(); 
    DateTime CurrTime = DateTime.Now; 
    try 
    { 
     bitmap = new BitmapObject(new Bitmap(stream),CurrTime); 
     if (timer == null)//System.Threading.Timer 
      timer = new Timer(new TimerCallback(GetImage), null, 200, 200); 
    } 
    catch (Exception ex) 
    { 
     bitmap = new BitmapObject(Properties.Resources.Off, CurrTime); 
     bitmap.Error = ex.Message; 
    } 
    finally 
    { 
     stream.Flush(); 
     stream.Close(); 
    } 
    onImageReady(bitmap); 
}