JAVA 服务器向客户端推送数据

4
我希望客户端通过服务器互相查询而没有延迟(=无轮询间隔)。
例子:服务器S,客户端A和B
客户端A想请求客户端B。 客户端A将向服务器S发出请求,没问题。 然后服务器S需要能够请求客户端B,但是如何在没有轮询的情况下实现呢?
所有的node.js / APE(对于PHP)技术都是为Web设计的,但我不使用Web服务器。Java是否有类似于推送技术/框架的东西,而不是Web?
我真的很希望找到一种不需要每个客户端使用自己的保留端口的解决方案(例如,我不想以每个客户端1个WebService结束)
注意:所有客户端都在同一台机器上。

你的客户端是否实际上是守护进程?换句话说,它们是否始终在服务器上运行? - Pace
是的,我想你可以这么说。 - benji
3个回答

5
以下是翻译的结果:

几个选项...

  • 普通 socket 通讯。java.net.Socket,java.net.ServerSocket。最大的灵活性但需要了解低级 TCP/IP API/概念。

  • 经典的 RMI。Java 基于 TCP/IP 的远程过程调用(RPC)层。当客户端和服务器都在 Java 中且通常在同一子网中时效果很好。当客户端和/或服务器进行 NAT 转换时可能会出现问题。

  • Spring Remoting,它实际上非常不错。

  • 双向 Web 服务。即客户端主机自己的 WSes,当服务器需要回调时调用它们。

  • JMS 正如其他人所提到的。

  • 分布式数据结构,请查看 http://www.hazelcast.com/

有许多选择可供选择,无需 Web 服务器。


  • 纯套接字通信:我之所以要求一个框架,是因为在套接字级别上调用远程对象的远程方法很困难。
  • RMI / WS:它们需要每个客户端使用预定义的TCP端口,这是不可选的(我会更新问题,抱歉)
  • 我认为JMS仍然是请求的延迟处理
我会查看你最后提供的链接,谢谢!
- benji
您可以使用Endpoint.publish(*) API在运行时确定端口并编程方式启动WS,然后调用服务器上的WS,让服务器知道此端点URL。这样客户端就不需要使用预定义的端口。 - user507484
TCP推送技术的优点在于,您将使用单个TCP端口用于服务器,然后在客户端上,您将使用处于“动态端口范围”内的端口,并确保您永远不会与机器上的任何内容发生冲突!我想知道是否可能获取和使用这样的短暂端口,或者这些端口是否严格保留给TCP协议。 - benji
Spring远程调用只是对其他现有远程访问协议的包装。只有支持某种消息传递的协议的包装才实际适用于使用案例,例如JMS。大多数实际上都是基于请求/响应的。 - Robin
@BhaskarKarambelkar,我想要实现的是,在客户端上显示记录的JSP页面,如果服务器更新了,应该在不刷新客户端页面的情况下将更新反映回客户端(服务器应该将数据推送到客户端),使用JAVA技术。请帮帮我。 - Azuu
@Azuu,请在Google上搜索WebSockets。 - user507484

3

如果您真的不想使用Web服务器,那么我建议看看JMS。话虽如此,现在所有酷炫的孩子们都在使用Web服务器,因为这些协议是如此普及。


好的,假设服务器是托管Web服务的Web服务器。那么他如何向客户端推送呢?(那里没有JavaScript,因此没有ajax或node.js等) - benji

0

您的使用情况需要一种消息协议。我们不太清楚您的问题范围,但您已经说过您想要一个服务器来在客户端之间交换请求,所以我建议您选择现有的解决方案而不是自己开发。

JMS已经被提到并且是一个可行的基于Java的解决方案,另一个是XMPP,它是一种实时通信协议,通常用于即时通讯。

它是一个开放标准,在每个主要语言和平台上都有服务器和客户端支持。这将允许您拥有独立的应用程序、基于Web的应用程序和移动设备应用程序,所有这些应用程序都能够相互通信。对于您的使用情况唯一可能的问题是它是基于文本的。由于您没有说明要传递什么请求,我不知道这是否符合您的要求。

您可以在Java中使用Smack进行客户端开发,并选择任何操作系统作为服务器。


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