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 应该停止将数据存储在数据库中 当 ClientType2 说 Stop
================================================ ==============================
Q1.有什么办法可以解决这个问题?
以下是我想到的方法:
在数据库中创建一个表,其中有一列显示状态 Start 或 Stop 并且该列的值应由 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 的队列。此队列可用于仲裁客户端之间的数据库访问。例如,服务器可以依次向队列中的客户端发送start
和stop
命令。简而言之,您可以通过网络应用Listener
概念。以上是关于Java - 如何从服务器向客户端发送通知的主要内容,如果未能解决你的问题,请参考以下文章
C# - 关于服务器向客户端发送推送通知的设计问题 - 如何实现?