是否可以通过浏览器与桌面应用程序通信?
我想做这样的事情,
假设我的网络应用程序中有一个按钮,其中包含指向数据源的URL,当单击按钮时,桌面应用程序将打开并获取该数据源URL并使用桌面应用程序处理数据。
做这样的事情难吗?有什么例子吗?
答案 0 :(得分:9)
在Windows上,通过
创建一个可以调用的custom URL Protocol是微不足道的 <a href="whatever://somedata">..</a>
这适用于IE,FF和Chrome,但在后者中必须通过javascript打开链接以避免全方位混淆。
答案 1 :(得分:6)
您需要在桌面上运行某些内容,例如服务器,并向服务器发出请求,以便服务器打开应用程序。你可以用Node.js做到这一点。当然,这需要服务器在客户端的桌面上运行。
另一种方法是制作浏览器扩展/插件,并让人们安装它。这些扩展可能可能在桌面上启动应用程序。
答案 2 :(得分:1)
答案 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上寻找解决方案的人来说。
大多数现代发行版都实施了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
只需在您的应用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>