簡體   English   中英

如何從瀏覽器與桌面應用程序通信?

[英]how to communicate with a desktop application from browser?

是否可以從瀏覽器與桌面應用程序通信?

我想做這樣的事,

假設我的Web應用程序中有一個按鈕,其中包含指向數據源的URL,當單擊按鈕時,桌面應用程序將打開並獲取該數據源URL並使用桌面應用程序處理數據。

做這樣的事情難嗎? 任何例子?

在Windows上,它可以創建一個可以通過調用的自定義URL協議

<a href="whatever://somedata">..</a>

這適用於IE,FF和Chrome,但在后者中必須通過javascript打開鏈接以避免全方位混淆。

您需要在桌面上運行某些內容,例如服務器,並向服務器發出請求,以便服務器打開應用程序。 你可以用Node.js做到這一點。 當然,這需要服務器在客戶端的桌面上運行。

另一種方法是制作瀏覽器擴展/插件,讓人們安裝它。 這些擴展可能在桌面上啟動應用程序。

這是一個笨重的建議,但我認為值得一提的是所有選項,因為自定義URI和正在運行的服務器解決方案非常復雜...生成一個包含感興趣參數的小文件,其自定義擴展與您的桌面應用程序相關聯。 因此,當用戶點擊瀏覽器按鈕時,他們將不得不瀏覽瀏覽器的文件下載對話框/工具欄,可能還有一些煩人的安全驗證彈出窗口...不是理想的用戶體驗,但可能是實現此類通信的最簡單方法,並且不需要像后台一樣在后台運行進程。

我在我的公司內部使用了一個Web應用程序,用於連接舊數據庫和組織不良的文件。 我需要一種方法來允許用戶從網絡中打開實際文件而不下載副本,這樣就可以對它們進行編輯。 考慮這樣的解決方案或自定義URI方案,以便可以簡單地傳遞不在后台運行的小型可執行文件並直接為用戶打開它。

桌面應用程序應該在其中嵌入一個小型服務器,如Jetty。 由於瀏覽器內容源域(例如www.myDomain.com)與Jetty的localhost域不同,因此會遇到安全問題。 這些應該通過使用CORS(跨源資源共享)來克服,這是一種新標准。 使用CORS,Jetty服務器告訴瀏覽器,如果請求來自源域www.myDomain.com,它/ localhost允許跨域訪問其資源。 出於安全考慮,我還會讓Jetty拒絕任何源ip不是localhost的請求

嗯,你需要像客戶端 - 服務器應用程序這樣的東西。 服務器是一個輕量級的http服務器,它等待來自客戶端(瀏覽器)的消息。 例如,瀏覽器可以通過ajax與您的服務器通信。

您可以輕松地將Fleck WebSocket服務器添加到桌面應用程序,然后使用Websocket訪問它。

注意:只有Windows 8和10通過Microsoft的WebSockets實現支持WebSockets,但Fleck將與Windows 7一起使用。

https://github.com/statianzo/Fleck使用NuGet Package Manager將Fleck添加到您的項目中非常容易:

Install-Package Fleck

這是來自Fleck網頁的echo示例(將此添加到C#程序以在啟動期間執行):

var server = new WebSocketServer("ws://127.0.0.1:8181");
server.Start(socket =>
{
  socket.OnOpen = () => Console.WriteLine("Open!");
  socket.OnClose = () => Console.WriteLine("Close!");
  socket.OnMessage = message => socket.Send(message);
});

在javascript中:

var exampleSocket = new WebSocket("ws://127.0.0.1:8181", "protocolOne");

exampleSocket.send("Here's some text that the server is urgently awaiting!");

//and receive (make a listener for the socket) :
exampleSocket.onmessage = function (event) {
  console.log(event.data);
}

另外還有Alex K對windows的回答......對於那些在macOS和Linux上尋找解決方案的人來說。

Linux的

大多數現代發行版都實現了freedesktop標准,其中一個是桌面文件 您可以使用[service]部分創建桌面文件。

$ cat test.desktop 
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Comment=My test app
Name=TestApp
Icon=TestIcon
Exec=/opt/test/test.sh %u
DBusActivatable=true
Categories=Network;
MimeType=x-scheme-handler/test;  <------ This is handler for test://somedata URLs 
NoDisplay=false

將此文件復制到/usr/share/applications/test.desktop

蘋果系統

只需在應用程序Info.plist文件中添加以下內容即可

    <array>
            <dict>
                    <key>CFBundleTypeIconFile</key>
                    <string>/tmp/test.png</string>
                    <key>CFBundleTypeRole</key>
                    <string>Viewer</string>
                    <key>CFBundleURLName</key>
                    <string>com.mytest</string>
                    <key>CFBundleURLSchemes</key>
                    <array>
                            <string>test</string>  <---- This is handler for test://somedata URLs hit on browser
                    </array>
            </dict>
    </array>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM