Java - 如何从服务器向客户端发送通知

Posted

技术标签:

【中文标题】Java - 如何从服务器向客户端发送通知【英文标题】:Java - How to send notification from server to client 【发布时间】:2011-03-20 11:41:23 【问题描述】:

我有一个服务器,我的 java 网络应用程序数据库 服务器驻留。

现在我的网络应用的客户是 两种类型:

ClientType1 ClientType2

两者都可以访问数据库。

ClientType1 将数据存储在数据库中。

ClientType2 从数据库中检索数据。

但是 ClientType1 应该启动 将数据存储在数据库中 当 ClientType2开始

类似地,ClientType1 应该停止将数据存储在数据库中 当 ClientType2Stop

================================================ ==============================

Q1.有什么办法可以解决这个问题?

以下是我想到的方法:

在数据库中创建一个表,其中有一列显示状态 StartStop 并且该列的值应由 ClientType2 设置强>。 ClientType1会不断向数据库发送查询,从这个表中获取状态,并根据状态进行操作。

应用 ServerPush 方法,服务器将通过该方法保持与 ClientType1 的连接,并在收到命令时将请求发送给他( 开始停止)从ClientType2。这种方法的问题是没有。服务器上打开的套接字的数量将随着数量的增加而增加。 ClientType1

【问题讨论】:

【参考方案1】:

您应该为此使用一种 Ajax,因为这将“服务器可以调用客户端”抽象出来。

选择一个允许您保持单个连接打开并通过此连接执行多项操作的库。

【讨论】:

我认为单个打开的连接只能服务于一个客户端。因此,对于许多客户端,服务器需要保持打开各种连接(套接字),如果我们有很多客户端,这些连接将无法正常工作。 自然每个客户端都需要自己的连接。这就是 TCP/IP 的工作原理。对于“许多客户端”场景,您将需要使用针对这种用途进行了调整的底层 Web 服务器 - 请参阅 en.wikipedia.org/wiki/C10k_problem - 这是 Jetty 开发人员对该问题的主要评论。 markmail.org/message/ulfklgftht7lhcqu【参考方案2】:

我并不认为通过数据库进行进程间通信是一种很好的方法。典型的场景是客户端向服务器注册自己,使其有资格使用基于套接字的机制接收消息。

然后客户端可以:

请求服务器代表它执行数据库操作 请求访问数据库

如果有很多客户端保持打开连接将成为问题,您可以在每次需要与服务器通信时启动新连接,或者让服务器提供例如某种服务器可以提供的 REST API投票。

【讨论】:

您能否解释一下“客户端向服务器注册自身”是什么意思。 @Yatendra,即client 发起与server 的联系,该server 可以保持所有clients 的队列。此队列可用于仲裁客户端之间的数据库访问。例如,服务器可以依次向队列中的客户端发送startstop命令。简而言之,您可以通过网络应用Listener 概念。

以上是关于Java - 如何从服务器向客户端发送通知的主要内容,如果未能解决你的问题,请参考以下文章

如何从服务器向客户端发送消息?

C# - 关于服务器向客户端发送推送通知的设计问题 - 如何实现?

如何使用 fcm 和 j2ee 向 android 发送通知 [关闭]

消息传递服务器如何识别目标客户端并发送推送通知

向特定用户发送通知

如何从 Java REST servlet 向 Angular 客户端发送注销消息?