业务背景:张三要发消息给李四
实现:
(1)客户端点到点发消息
(2)服务器转发消息(采用这个)
1,张三发消息给服务器
2,服务器发消息给李四 使用http协议是不行的 (服务器的ip是开发在公网,所有人能访问,客户端的IP不开放,服务端不知道)
websocket实现的消息推送流程
客户端和服务端建立连接
客户端和服务端建立连接 只能客户端发起请求建立,双方建立连接
客户端js代码
new websocket:双方建立连接(双方通知打开连接的回调函数执行)
客户端建立回调
服务端建立回调:
双方通信都是全双工,客户端和服务端既可以发消息,也可以收消息
客户端服务端发送消息
客户端发送消息:websocket.send(message);
服务端发送消息:session.getBasicRemote().sendText(message)
session建立连接之后就有的会话对象
只要我们有session引用就可以发消息
session会话,是websocket的会话(长连接没关闭就是一个会话)和Servlet的session不一样
客户端服务端接收信息
客户端接收消息:
服务端接收消息
双方接收消息:被动接收消息(事件驱动的异步回调)
客户端:张三发送消息事件中,调用客户端websocket.send(message);
服务端:接收张三发送的消息
服务器发送消息给李四
客户端:李四接收消息
当前项目需要把张三发送的消息转发到所有的客户端,前端去过滤某个消息频道的消息。
前端保存有所有接收的消息,用户进入某个频道后,在接收的消息列表中,过滤并显示
分析业务:前后端接口设计和数据库表的设计
用户相关接口:
1.注册
2.登录 输入账号密码,点击登录按钮后,调用的接口
3.检查是否已登陆 页面初始化后,调用的接口
分析以上接口
调用检查登录状态接口:
获取session,再获取保存的用户信息
HttpSession s = request.getSession(false);
Useru =(User) s.getAttribute(“键”);登录时设置的键
响应 OK:true显示登陆信息
响应 OK:false显示登陆,注册按钮、
校验账号密码通过:
创建一个session, 保存用户信息
HttpSession S = request.getSession();
s.setAttribute(“键”,用户信息);
登录接口和检查登陆状态接口,如果返回的响应数据为OK或true,用户登录成功
以上业务客户端接收消息有两个场景
(1)上次登录以后的消息----数据库查询(发送的消息要保持在数据库)
-------服务端建立连接事件中
(2)新的消息------------服务端接收消息事件中 所有客户端转发消息
需要考虑:服务的在什么时候/代码中发送,客户端在什么地方接收,消息在服务端什么地方保存。
关于序列号和反序列化
结合网络中协议去理解
网络传输数据,发送方要封装数据格式,接收方要使用相同数据格式解析,协议是大家都公认的,用途非常广泛的数据格式
序列化和反序列化也是类似的,网络传输数据,不同设备间传输数据使用。
某个语言中特定的数据保存方式(如Java就是对象),发送给其他主机(网络数据传输),或者其他设备(比如内存)
反序列化就是反向的过程:接收的数据格式转变为自己程序的数据方式(Java就是对象)
jdbc操作:
(1)占位符替换:使用变量,对象中的属性
(2)查询操作,返回的结果集,多行数据,转换为<List类型> 多个对象,一个数据,转换为一个对象