Java EE,通信Web应用程序和桌面应用程序

3
我有一个Java Server Faces Web应用程序,需要在网络机器上调用桌面应用程序中的方法。该机器将在特定机器上执行一些逻辑。完成后,它应该调用Web应用程序上的一个方法来报告其状态。这两种方法都是void类型的,但需要参数。
最佳的开发方式是什么? 我考虑了一些选项:
- Sockets:我读过多篇文章,称不应在Web应用程序上使用Sockets。 - Soap:我可以在Web应用程序上设置服务器,但不能在桌面应用程序上进行设置。 - JCA适配器:我对此没有任何了解。
WebApp
    class WebAppClient {
        public void start(String x, List<String> y) {
            // Call DesktopServer.start(x, y);
        }
    }

    interface WebAppServer {
        public void reportBack(String info);
    }

桌面应用程序

    class DesktopClient
        public void reportBack(String info) {
            // Call WebAppServer.reportBack(info);
        }
    }

    interface DesktopServer {
        public void start(String x, List<String> y);
    }

2
无论您选择哪种解决方案,它都必须使用套接字进行通信和使用。因此,使用套接字编写自己的解决方案并不是一个坏主意,特别是如果您只需要在两个方向上发送一条消息。 - JB Nizet
嗯,我在Stackoverflow上读到多篇帖子都说这不是正确的做法,为什么呢?这会存在安全风险吗? - Menno
1
让我问你,为什么 Web 应用程序必须发起呼叫?在这种情况下,您只有一个桌面应用程序吗? - Perception
是的,这是一对一的关系。 我的Web应用程序将发起呼叫,因为它使用CMS,从该CMS可以在另一台机器上执行一些测试软件(出于安全原因)。该机器将使用最基本的Java桌面应用程序接收消息,并根据这些消息从命令行执行软件。当此软件完成时(可能是1分钟,也可能是2小时),该机器将向Web服务器报告。 - Menno
@Aquillo,从设计的角度来看,网络服务是未来的趋势。实施方法非常灵活(套接字、SOAP、REST和原始Http)。我不确定你所说的“我无法在桌面上设置服务器”是什么意思,你是指你没有权限吗?还是说这不可行?我问这个问题是因为JDK 6附带了一个轻量级的http webserver,它可以作为一个轻量级容器,用于在你的Web应用程序和桌面应用程序之间建立Socket级别或HTTP级别的桥接。 - kolossus
显示剩余2条评论
1个回答

0

关于套接字,你是正确的,它们很容易使用,但许多网络会阻止简单的TCP套接字,只允许HTTP,有时仅通过HTTP代理。

HTTP是最好的选择,但HTTP不允许服务器启动对话,它强制你在请求响应模式下工作。

然而,有一些方法可以用来克服这个限制:

  • 简单轮询:您只需定期轮询服务器以了解是否收到新消息。

  • 长轮询:您轮询服务器,但请求保持打开状态,直到服务器有东西要说,这也称为“彗星”协议,有像Jetty这样的实现。

  • WebSockets:HTML5的一个功能,提供真正的双向套接字,不过并非所有网络设置都支持。例如,一些代理将阻止它。

您应该对每种方法进行一些研究,并选择适合您情况的正确方法。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接