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

时间:2015-02-23 16:31:24

标签: c# asp.net winforms

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

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

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

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

How to communicate between ASPX and WinForms

但我并没有真正理解答案。任何人都可以帮助我吗?

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

1 个答案:

答案 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                                }
                           }
                         }     
                    }
                 }
            }

我不知道此代码是否存在格式错误或编译错误。但我相信你可以开发它。