4

我正在写一个程序。我的程序通过 HTTP 协议从服务器接收数据。数据将由服务器推送到我的程序。我尝试使用 WebRequest,但只收到了一个会话数据。我怎样才能保持连接活跃,以连续接收来自服务器的数据,感谢任何帮助。

以下是SDK文档:

在 GUEST 或 ADMIN 的授权下,可以获得系列直播图像(服务器推送)。要获取图像,请将请求发送到“/liveimg.cgi?serverpush=1”,如图所示。2-1-1。
当摄像头收到客户端的上述请求后,如图所示发送返回。2-2。
每个 JPEG 数据由“--myboundary”分隔,“image/jpeg”在“--myboundary”之后作为“Content-Type”标头返回。对于“Content-Length”标头,它返回 --myboundary 数据中的字节数(不包括“--myboundary”、每个标头和 \r\n 作为分隔符)。在“Content-Length”标头和“\r\n”(分隔符)之后,将发送实际数据。
这种数据传输将一直持续到客户端停止连接(断开连接),或者出现一些网络错误。

国际化; 字符串 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);
4

5 回答 5

2

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

服务器将需要设置 Response.Buffer=false,并具有扩展的 ScriptTimeout(我假设您在服务器端使用 ASP.NET)。一旦你这样做了,你的页面可以根据需要继续发送 Response.Write 数据,直到它正在做的任何事情都完成。

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

于 2009-06-16T16:58:59.753 回答
2

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

于 2009-09-25T21:52:50.560 回答
1

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

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

如果您真的想让服务器主动通知客户端,而不需要它们轮询,那么您将不得不做一些除了简单的 Web 服务器之外的事情——您还必须编写和配置客户端以接受传入的请求。如果您的客户端在防火墙等后面运行,这可能会很困难。如果你走这条路,WCF 可能是你最好的选择,因为它允许你适当地配置服务器和客户端。

于 2009-06-16T16:57:28.523 回答
1

您需要从 IP cam 获取 cookie,并将该 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);
}
于 2011-05-30T06:26:21.717 回答
0

如果您使用的是标准 Web 服务器,它永远不会向您推送任何内容 - 您的客户端将不得不定期从中拉取。

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

于 2009-06-16T16:52:39.557 回答