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