
导读:本文通过一个实际的场景来介绍在前后端分离的项目中通过 WebSocket 来实现服务器端主动向客户端发送消息的应用。主要内容如下 Websocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 连接成功后,服务
本文通过一个实际的场景来介绍在前后端分离的项目中通过 WebSocket 来实现服务器端主动向客户端发送消息的应用。主要内容如下
Websocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 连接成功后,服务端与客户端可以双向通信。在需要消息推送的场景,Websocket 相对于轮询能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
具体如下特点
在客户端的列表数据中有个 status 字段,服务器端需要花费较长的时间进行处理,处理完成后才会更新对应数据的 status 字段值,通过 Websocket 的处理流程如下:
通过注入 ServerEndpointExporter 类,用于在项目启动的时候自动将使用了 @ServerEndpoint 注解声明的 Websocket endpoint 注册到 WebSocketContainer 中。
为什么增加一个 ServerEndpointExporter Bean,并通过在一个类上增加 @ServerEndpoint 和 @Component 注解就可以实现服务器端 Websocket 功能,这里简单解析一下。
java 定义了一套 javaxservlet-api, 一个 HttpServlet 就是一个 HTTP 服务。java websocket 并非基于 servlet-api 简单扩展, 而是新定义了一套 javaxwebsocket-api。
一个 websocket 服务对应一个 Endpoint。与 ServletContext 对应, websocket-api 也定义了 WebSocketContainer, 而编程方式注册 websocket 的接口是继承自 WebSocketContainer 的 ServerContainer。
一个 websocket 可以接受并管理多个连接, 因此可被视作一个 server。主流 servlet 容器都支持 websocket, 如 tomcat, jetty 等。看 ServerContainer api 文档, 可从 ServletContext attribute 找到 ServerContainer。
如果你是 安卓客户端 用webview 打开一个html页面, 那你就去搜 WEB推送。
如果是 安卓原生应用的话,你应该挂一个长连接 都服务端,然后服务端推送信息即可。有很多提供推送功能,即时通讯,的都可以, 个推,xmpp协议是即时通讯的协议,实现这样功能的服务器,也可以满足你这个要求。有很多这样的协议,我也记不住那么多。如果你要自己写的话,可以用下mina,跟netty吧。以前我跟我同事用过mina做安卓的推送。
Thank you for your help!问题补充:laorer 写道应该是客户端主动定时去连服务器端,这种操作最好要让用户知道第二个问题应该是不是在用户连接到手机时,存到一个地方,或者内存中,或者数据库中但是现在的需求是当数据库有更新时就要主动发送一个更新通知给所有的客户端,然后客户端接到这个通知后才到服务器端取数据。你说的那是轮询,暂时还不想用这种方法,呵呵。问题补充:laorer 写道如果你只是想把消息发给现在在线的用户的话,那么客户端肯定需要一个监听程序,来监听来自服务器的消息,而服务端则在有新数据时,检查在线的用户并获取相关信息,然后发个消息给客户端的监听端口android是linux内核的,而且能连网络,那么肯定是要端口来连接的,这是我的推测,没有去找相关的资料如果是手机的话,是不是会发条短信给手机,毕竟这样不需要知道IP之类的东西浏览器请求服务时,肯定是浏览器定时去服务器请求的,才可能知道有没有新的内容关于在Android手机端开放监听端口,我再研究一下,值得借鉴。问题补充:laorer 写道如果你是自己来管理这些的话,那么当用户连接到服务器时,你需要把用户的这些内容写到服务器的文本或者数据库或者直接保存到内存中,然后用户断开后,把相应的用户信息删掉这样当数据库有新消息时,你可以从保存用户信息的地方得到所有的连线用户,发消息给用户的话,就是把消息发给用户的IP和监听端口,如果客户端有http服务的话,你也可以直接发送http信息到这个客户端的http服务上这只是我的想法,你做个参考吧
Socket通信的原理还是比较简单的, 它大致分为以下几个步骤。 服务器端的步骤如下。 (1)建立服务器端的Socket,开始侦听整个网络中的连接请求。 (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的
服务器接受到了信息之后 返回一个确定数据完全接受的消息给客户端
比如:打电话的时候,A:请问你是B吗?
B:是的,我是B
A:消息1
B:收到1
这是个例子,不知道你能不能看懂 就是TCP/IP协议的三次握手的知识,建议你看一看这个协议
1、打开应用时向服务器发申请
2、如果应用一直打开,或者有后台服务,可以定时向服务器发申请
Google本身就有一个推送demo可以用,Google Cloud Message,你可以参考一下,不过国内用Google推送不太稳定,但是我测试的时候基本上都能推送成功。详细的搭建你可以参考我的微博,有什么问题你再问吧





















.jpg)


.jpg)
.jpg)

.jpg)
.jpg)






.jpg)


.jpg)
