[英]How to Communicate between a winforms app and a webform page?
我只想首先說,在研究這個時,我讀到這樣的東西可能是糟糕的編程,但讓我先解釋一下我的情況,也許它並不是那么糟糕。 編碼在C#中完成。
我有一個winforms應用程序連接到幾個ipcameras並創建查看流。 它將每個新幀保存到文件流中。 webform有一個主頁面,可讓您選擇要查看的攝像機,然后開始從文件流中抓取新幀並允許您查看攝像機。
現在,在winforms應用程序中,我有一個“播放”按鈕,用於創建查看流,如果視頻在winforms應用程序中“播放”,則webform只能查看該相機。 所以我的想法是讓winforms應用程序一直運行並讓每個攝像機都在播放,然后你可以從webform中選擇任何攝像機並能夠查看它。 這很好,但現在我必須改變它。 我必須這樣做才能在webform中選擇相機,然后讓視頻開始在winforms應用程序中“播放”。
所以我需要某種標志告訴winforms應用程序正在查看該攝像機,並且一旦不再查看該攝像機告訴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.