如何从浏览器与桌面应用程序通信?

时间:2012-01-24 15:46:22

标签: javascript browser

是否可以通过浏览器与桌面应用程序通信?

我想做这样的事情,

假设我的网络应用程序中有一个按钮,其中包含指向数据源的URL,当单击按钮时,桌面应用程序将打开并获取该数据源URL并使用桌面应用程序处理数据。

做这样的事情难吗?有什么例子吗?

7 个答案:

答案 0 :(得分:9)

在Windows上,通过

创建一个可以调用的custom URL Protocol是微不足道的

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

这适用于IE,FF和Chrome,但在后者中必须通过javascript打开链接以避免全方位混淆。

答案 1 :(得分:6)

您需要在桌面上运行某些内容,例如服务器,并向服务器发出请求,以便服务器打开应用程序。你可以用Node.js做到这一点。当然,这需要服务器在客户端的桌面上运行。

另一种方法是制作浏览器扩展/插件,并让人们安装它。这些扩展可能可能在桌面上启动应用程序。

答案 2 :(得分:1)

嗯,你需要像客户端 - 服务器应用程序这样的东西。服务器是一个轻量级的http服务器,它等待来自客户端(浏览器)的消息。例如,浏览器可以通过ajax与您的服务器通信。

答案 3 :(得分:1)

这是一个笨重的建议,但我认为值得一提的是所有选项,因为自定义URI和正在运行的服务器解决方案非常复杂...生成一个包含感兴趣参数的小文件,其自定义扩展与您的桌面应用相关联。因此,当用户点击浏览器按钮时,他们将不得不通过浏览器的文件下载对话框/工具栏以及一些烦人的安全验证弹出窗口......不是理想的用户体验,但可能是实现此类型的最简单方法沟通,并不需要在后台运行的进程,如服务器。

我的公司内部使用了一个Web应用程序,用于连接旧数据库和组织不良的文件。我需要一种方法来允许用户从网络中打开实际文件而不下载副本,这样就可以对它们进行编辑。考虑这样的解决方案或自定义URI方案,以便可以简单地传递一个不在后台运行的小型可执行文件,并直接为用户打开它。

答案 4 :(得分:1)

桌面应用程序应该在其中嵌入一个小型服务器,如Jetty。由于浏览器内容源域(例如www.myDomain.com)与Jetty的localhost域不同,因此会遇到安全问题。这些应该通过使用CORS(跨源资源共享)来克服,这是一种新标准。使用CORS,Jetty服务器告诉浏览器,如果请求来自源域www.myDomain.com,它/ localhost允许跨域访问其资源。出于安全原因,我还会让Jetty拒绝任何源ip不是localhost的请求

答案 5 :(得分:0)

您可以轻松地将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网页的回声示例(将此添加到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);
}

答案 6 :(得分:0)

另外还有Alex K对Windows的回答......对于那些在macOS和Linux上寻找解决方案的人来说。

的Linux

大多数现代发行版都实施了freedesktop标准,其中一个是desktop files。您可以使用[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

中复制此文件

的MacOS

只需在您的应用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>