二、实现方式
1、客户端(浏览器)实现
1.1、websocket对象
实现websocket的web浏览器将通过websocket对象公开所有必须的客户端功能(主要支持HTML5的浏览器)。以下API用于创建websocket对象:
var ws = new WebSocket(url);
参数URL 格式说明:ws://ip地址:端口号/资源名
1.2、websocket 事件
websocket 对象的相关事件
1.3、websocket 方法
给服务端发送消息
1.4、总结:客户端的API
2、服务端实现
Tomcat 的7.0.5版本开始支持WebSocket,并且实现了 Java WebSocket
规范(JSR356)。
Java WebSocket
应用由一系列的webSocketEndpoint
组成。Endpoint
是一个java
对象,代表webSocket
链接的一端,对于服务端,我们可以视为处理具体webSocket
消息的接口,就像servlet
之与http
请求一样。
我们可以通过两种方式定义Endpoint
:
- 第一种是编程式,即继承类
javax.websocket. Endpoint
并实现其方法 - 第二种是注解式,即定义一个
POJO
,并添加@serverEndpoint
相关注解。【常用】
Endpoint
实例在webSocket
握手时创建,并在客户端与服务端链接过程中有效,最后在链接关闭时结束。在Endpoint接口中明确定义了与其生命周期相关的方法,规范实现者确保生命周期的各个阶段调用实例的相关方法。生命周期方法如下:
2.1、服务端如何接收客户端发送的数据呢?
通过为session
添加 MessageHandler
消息处理器来接收消息,当采用注解方式定义Endpoint
时,我们还可以通过@onMessage
注解指定接收消息的方法。
2.2、服务端如何推送数据给客户端呢?
发送消息则由 RemoteEndpoint
完成,其实例由session
维护,根据使用情况,我们可以通过Session.getBasicRemote
获取同步消息发送的实例,然后调用其sendXxx ()
【sendText()】方法就可以发送消息,可以通过session.getAsyncRemote`获取异步消息发送实例。
服务端代码
@serverEndpoint("/robin") // @serverEndpoint("路径")
public class chatEndPoint {
private static set<chatEndPoint > websocketset = new Hashset<>();
private session session;
@onMessage
pub7ic void onMessage(string message,Session session) throws IOException {
system.out.print1n("接收的消息是:" + message);
system.out.print1n(session);
//将消息发送给其他的用户
for (chat chat : websocketset) {
if(chat != this) {
chat.session. getBasicRemote().sendText(message);
}
}
}
@onopen
public void onopen(session session) {
this.session = session;
websocketset.add(this);
}
@onopen
public void onopen(Session session) {
this.session = session;
websocketset.add(this);
}
@onclose
pub1ic void onc1ose(session seesion) {
system.out. print1n("连接关闭了。。。");
}
@onError
public void onError(session session, Throwable error) {
system. out.print1n("出错了。。。。" +error. getMessage());
}
}
2.3、总结:服务端的实现
常用的Node实现有以下三种:
三、特点
- 建立在TCP协议之上,服务端的实现比较容易
- 与HTTP协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用HTTP协议,因此握手时不容易屏蔽,能通过各种HTTP代理服务器
- 数据格式化比较轻量,性能开销小,通信高效。
- 可以发送文本,也可以发送二进制数据
- 没有同源限制,客户端可以与任意服务器通信
- 协议标识符是
ws
(如果加密,则为wss
),服务器网址就是URL。四、基于WebSocket的网页聊天室
1、实现流程
2、消息格式