簡體   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