如何在c#中接收服务器推送数据?

如何在c#中接收服务器推送数据?,c#,push,C#,Push,我正在写一个程序。我的程序通过HTTP协议从服务器接收数据。数据将由服务器推送到我的程序中。 我尝试使用WebRequest,但只收到一个会话的数据。 如何使连接保持活动状态,以连续地从服务器接收数据, 感谢您的帮助 以下是SDK文档: 在来宾或管理员的授权下,可以获得一系列实时图像 (服务器推送)。要获取图像,请将请求发送到“/liveimg.cgi?serverpush=1”,如图所示 在图2-1-1中。 当摄像头从客户端接收到上述请求时,它会发送返回,如图所示 如图2-2所示。 每个JPE

我正在写一个程序。我的程序通过HTTP协议从服务器接收数据。数据将由服务器推送到我的程序中。 我尝试使用WebRequest,但只收到一个会话的数据。 如何使连接保持活动状态,以连续地从服务器接收数据, 感谢您的帮助

以下是SDK文档:

在来宾或管理员的授权下,可以获得一系列实时图像 (服务器推送)。要获取图像,请将请求发送到“/liveimg.cgi?serverpush=1”,如图所示 在图2-1-1中。
当摄像头从客户端接收到上述请求时,它会发送返回,如图所示 如图2-2所示。
每个JPEG数据由“-myboundary”分隔,“image/JPEG”返回为 “内容类型”标题,在“-myboundary”之后。对于“内容长度”标题,它返回 --myboundary数据中的字节数(不包括“-myboundary”、每个标头和 \r\n作为分隔符)。在“内容长度”标题和“\r\n”(分隔符)之后,实际 将发送数据。
此数据传输将继续,直到客户端停止连接(断开连接),或 出现一些网络错误

内伦; 字符串uri=@“”


如果您使用的是标准的web服务器,它将永远不会向您推送任何内容—您的客户机将不得不定期从中拉出


要真正获得服务器推送数据,您必须自己构建这样的服务器。

如果我理解正确,您的服务器将通过在客户端发出请求/响应之外向客户端发送数据来响应某些事件。这是正确的吗?如果是这样,我不建议尝试保持连接打开,除非您的客户端数量非常少——可用的连接数量有限,因此保持连接打开可能会很快导致异常

也许最简单的解决方案是让客户端定期轮询新数据。这将允许您使用一个简单的服务器,您只需在客户端上编写一个线程,每分钟或30秒或任何最佳时间段请求一次任何更改或新工作


如果您真的想让服务器主动通知客户机,而不让客户机轮询,那么除了简单的web服务器之外,您还必须对客户机进行编码和配置,以接受传入的请求。如果您的客户机运行在防火墙等设备后面,这可能会很困难。如果您选择这条路线,WCF可能是您的最佳选择,因为它将允许您适当地配置服务器和客户端。

如果服务器支持,您可以将HTTP连接保持长时间打开。(如前所述,这将大大限制您可以支持的同时用户数。)

服务器将需要设置为Response.Buffer=false,并有一个扩展的ScriptTimeout(我假设您在服务器端使用ASP.NET)。一旦你这样做了,你的页面可以继续发送响应。根据需要写入数据,直到它所做的一切完成


您的客户端将需要在连接完成之前处理传入的响应,而不是阻塞以获得完整的响应。

您可能想看看-它是一个流行的Comet服务器,并且有一个.NET客户端SDK,允许您在C#(或VB/C++)中接收实时推送更新.

您需要从IP cam获取一个cookie,并将该cookie包含在下一个HttpWebRequest的标头中。否则,它将始终尝试将您重定向到“index.html”。
这是你可以做到的

BitmapObject是一个类,用作Jpeg图像、当前日期和最终错误文本的容器。一旦建立连接,它将每隔200毫秒汇集一个映像。这同样适用于通过“服务器推送”获得的连续映像流


不过,这里的问题似乎是服务器向您发送了“多个”响应。也就是说,许多响应通过管道(HTTP/1.1特性)返回到客户端。除了读取响应流并自己解析之外,HttpWebResponse支持者是否以任何简单的方式管道化请求响应还不清楚。但是无论如何,我想.NET中的HttpWebRequest/HttpWebResponse类是一个开始。WebSocket呢?有了这些,服务器实际上会“推送”到客户端。StreamHub允许像.Net这样的厚客户端,但服务器是java
        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);
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);
}