桌面应用程序和 Web 前端之间的通信

Posted

技术标签:

【中文标题】桌面应用程序和 Web 前端之间的通信【英文标题】:Communication between desktop application and web frontend 【发布时间】:2015-04-24 12:36:09 【问题描述】:

我的项目可以分为3个组件:桌面应用程序、服务器后端、服务器前端。我正在使用 websockets 应用程序后端和后端前端通信。前端是单页应用程序。整体是这样的:

我需要实现前端和应用程序之间的通信(上图中的虚线箭头)。我可以将后端服务器用作代理,但在前端和应用程序之间进行直接通信会更有用,这样就不会浪费后端资源。

有什么方法可以在本地应用程序和网络前端之间建立直接连接?

PS:我将 Go 用于后端和应用程序,javascript 用于前端,WebSockets 用于通信,但欢迎一般架构答案。

【问题讨论】:

在这种情况下,“服务器前端”是什么意思?您是指在与“桌面应用程序”相同的机器上运行在浏览器中的东西吗? “相同的扶手椅场景”(同一台机器上的浏览器和应用程序)将涵盖大多数用例,但不是全部。欢迎提出任何建议。 后端资源没有被浪费——除了满足前端的请求,后端资源还有什么重要的作用? 关系:在这种情况下,我需要后端只是用于身份验证/授权,服务器端没有做任何实际工作,所以它不仅是服务器资源,而且在通过后端与应用程序前端通信时也会滞后。 【参考方案1】:

您是否尝试从您的桌面应用程序连接到 JavaScript 前端?如果是这样,我可以想到以下选项

    WebRTC。 Chrome(和 Opera)和 Firefox 都支持它。 Chrome 原生消息传递,这显然只适用于 chrome,它从标准输入/从您的桌面应用程序发送/接收信息。

总的来说,我认为 WebRTC 可能是一个更好的解决方案。不过,这两种解决方案都要求您在现代浏览器 Chrome/Firefox 中运行 Web 前端。

如果您必须处理 IE,我只能考虑让您的桌面应用程序运行本地 Web 服务器,然后让您的 Web 应用程序轮询/发布到它。即使这样,您也必须解决跨域问题,并且您可能希望围绕它实施某种级别的安全性,所以它变得相当混乱。

【讨论】:

我对最后一个解决方案特别感兴趣。我可以在桌面应用程序中制作本地服务器并注意安全性,但我想我会经常遇到一些防火墙的问题......只是好奇,你认为我多久会遇到这种问题?我该如何解决? 如果你连接到本地主机,防火墙通常不会大惊小怪,但是在这种情况下你也需要解决跨域问题:如果你的应用程序运行在domain.com 上,然后连接到localhost 将被视为跨域。 JSONP 解决了这个问题。但是,如果您使用 https,这将变得不可能,因为您将无法向 localhost 颁发证书。这就是为什么我没有将这种方法作为要点之一提及,因为它实际上是一种 hack 而不是解决方案。 @QianQiao WebRTC 会很好,但快速的 Google 搜索并没有出现任何 Go WebRTC 客户端。我是否忽略了某些东西,还是您建议他从头开始做 WebRTC?我认为实现 WebRTC 客户端并非易事。 @TrevorDixon WebRTC 连接在桌面应用程序和 Web 前端之间,我想桌面应用程序是用 C# 或 C++ 或类似语言编写的,所有这些语言都有 WebRTC 实现免费提供. @QianQiao He 说,“PS:我在后端和应用程序中都使用 Go……”我认为他的桌面应用程序是用 Go(CLI?)编写的。关于“但是,如果您使用https,那将变得不可能,因为您将无法向localhost颁发证书”,他是否可以设置解析为127.0.0.1的域或子域,然后获取证书为那个域?【参考方案2】:

这可能有效,但可能需要花很多心思才能安全完成:

让您的桌面程序在任意端口 p 上运行 Web(套接字)服务器,然后尝试从您的前端与 localhost:p 对话。

或者您可以尝试在浏览器和桌面应用程序之间进行 WebRTC。快速搜索出现https://github.com/coreos/go-webrtc-datachannel,目前只是一个规划文件。

【讨论】:

以上是关于桌面应用程序和 Web 前端之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

WEB UI 前端和 C++ 后端之间的通信?

桌面应用程序和服务器之间的套接字通信

命令行应用程序 Web 前端的推荐通信模式

桌面应用程序之间的数据共享和通信

桌面应用程序和 Windows 服务之间通信的最佳方式

flex:在桌面应用程序中的 ActionScript 和 JavaScript 之间进行通信