繁体   English   中英

如何在winforms应用程序和webform页面之间进行通信?

[英]How to Communicate between a winforms app and a webform page?

我只想首先说,在研究这个时,我读到这样的东西可能是糟糕的编程,但让我先解释一下我的情况,也许它并不是那么糟糕。 编码在C#中完成。

我有一个winforms应用程序连接到几个ipcameras并创建查看流。 它将每个新帧保存到文件流中。 webform有一个主页面,可让您选择要查看的摄像机,然后开始从文件流中抓取新帧并允许您查看摄像机。

现在,在winforms应用程序中,我有一个“播放”按钮,用于创建查看流,如果视频在winforms应用程序中“播放”,则webform只能查看该相机。 所以我的想法是让winforms应用程序一直运行并让每个摄像机都在播放,然后你可以从webform中选择任何摄像机并能够查看它。 这很好,但现在我必须改变它。 我必须这样做才能在webform中选择相机,然后让视频开始在winforms应用程序中“播放”。

所以我需要某种标志告诉winforms应用程序正在查看该摄像机,并且一旦不再查看该摄像机告诉winforms应用程序它就可以停止“播放”该摄像机。 问题是我不知道该怎么做。 我看了这个问题:

如何在ASPX和WinForms之间进行通信

但我真的不明白答案。 谁能帮我?

我希望这是有道理的; 如果没有请问我,我会尽力解释。 我是一名电气工程专业的学生,​​并不是一名程序员。

创建Windows服务应用程序而不是Windows窗体应用程序,并通过HttpListener侦听某些端口。

在您的Web表单上,您可以使用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                                }
                           }
                         }     
                    }
                 }
            }

我不知道这段代码是否有格式化或编译错误。 但我相信你可以发展它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM