我只想首先说,在研究这篇文章时,我读到这样的内容可能是错误的编程,但让我先解释一下我的情况,也许它并不是那么糟糕。编码在C#中完成。
我有一个连接到几个ipcameras的winforms应用程序并创建了查看流。它将每个新帧保存到文件流中。 webform有一个主页面,可让您选择要查看的摄像机,然后开始从文件流中抓取新帧并允许您查看摄像机。
现在,在winforms应用程序中,我有一个" play"创建观看流的按钮,如果视频是"播放"则webform只能查看该摄像机。在winforms应用程序中。所以我的想法是让winforms应用程序一直运行并让每个摄像机都在播放,然后你可以从webform中选择任何摄像机并能够查看它。这很好,但现在我必须改变它。我必须这样做才能在网络表格中选择相机,然后让视频开始播放"在winforms应用程序中。
所以我需要某种标志告诉winforms应用程序正在查看该摄像机,并且一旦不再查看该摄像机告诉winforms应用程序它可以停止播放"那台相机。问题是我不知道该怎么做。我看了这个问题:
How to communicate between ASPX and WinForms
但我并没有真正理解答案。任何人都可以帮助我吗?
我希望这是有道理的;如果没有,请问我,我会尝试解释。我是一名电气工程专业的学生,并不是一名程序员。
答案 0 :(得分:0)
创建Windows服务应用程序而不是Windows窗体应用程序,并通过HttpListener侦听某些端口。
在您的网络表单上,您可以使用XmlHttpRequest或XDomainRequest或类似的浏览器版本。当有人点击“播放”按钮时,它会向运行Windows窗体应用程序或Windows服务的计算机发送请求。
您的Windows应用程序通过HttpListener捕获该请求,然后您可以执行所需的操作。
<强>示例:强>
如果你有Internet Explorer 10+,你将使用XmlHttpRequest,但我从未使用它。我有IE 9.我认为你可以轻松转换它。当有人通过Web Form单击相机1的“播放”按钮时,您可以在按钮单击事件中编写该代码。
XDomainRequest xDomainRequest = new XDomainRequest();
if (xDomainRequest ) {
xDomainRequest.onerror = xDomainRequestError;
xDomainRequest.onprogress = xDomainRequestProgress;
xDomainRequest.onload = xDomainRequestOnLoad;
xDomainRequest.ontimeout = xDomainRequestTimeOut;
xDomainRequest.timeout = 70000;
// Lets say the PC which runs your win.app. has an IP like: 10.10.10.10
// and lets say you will listen on 1234 port via HttpListener
// Tell Windows form application that the camera with number 1 started playing
var cameraUrl = "http://10.10.10.10:1234/camera/play/1;"
// send request to Windows form application
xDomainRequest.open("POST", cameraUrl);
xDomainRequest.send();
}
else {
alert("Error!");
}
在Windows Form应用程序中,假定始终运行:
public void StartNewThread()
{
Thread thread = new Thread(StartListening);
thread.Start();
}
public void StartListening()
{
HttpListener listener = new HttpListener();
string hostAddress = Dns.GetHostAddresses(Environment.MachineName)[1].ToString();
if (hostAddress == "[::1]" || hostAddress == "::1") { hostAddress = "127.0.0.1"; }
String[] prefixes = new String[] {
"http://localhost:1234/camera/",
"http://" + hostAddress + ":1234/camera/" ,
"http://" + Environment.MachineName + ":1234/camera/" };
int ii = 0;
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
ii++;
}
while (true)
{
// When button clicked in Web Form for playing camera 1, Windows form application will catch it here
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
String url = request.RawUrl;
String[] subUrlArray = url.Split('/');
String queryString = subUrlArray[2];
HttpListenerResponse response = context.Response;
if (queryString == "play")
{
if (subUrlArray.Length > 2 && subUrlArray[3] != "")
{
if(subUrlArray[3] == "1")
{
// Code for starting to play Camera 1
}
else if(subUrlArray[3] == "2")
{
// Code for starting to play Camera 2
}
}
}
else if (queryString == "stop")
{
if (subUrlArray.Length > 2 && subUrlArray[3] != "")
{
if(subUrlArray[3] == "1")
{
// Code for stopping Camera 1
}
else if(subUrlArray[3] == "2")
{
// Code for stopping Camera 2 }
}
}
}
}
}
我不知道此代码是否存在格式错误或编译错误。但我相信你可以开发它。