0%

webSocket简介

webSocket简介

WebSocket是一种应用协议,在TCP协议之上为通信双方提供双向全双工通信,在WebSocket应用中,服务器需要发布一个WebSocket端点,客户端使用这个端点的URI来连接服务器,在建立连接之后,WebSocket协议是对称的,客户端和服务器可以在连接打开的任何时间相互发送消息,而且可以在任何时间关闭连接。WebSocket解决了HTTP不适合实时通信的不足之处。

客户端总是只能连接到一个服务器,而服务器可以接受多个客户端的连接

过程

WebSocket协议分为两步,握手和数据传输

客户端使用一个WebSocket端点的URI向它发送一个请求,发起握手过程,Web服务器会将其解释为一个http连接请求

请求头示例

1
2
3
4
5
GET /hello HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: zmcknwcwbwcsocncicnv=
Sec-WebSocket-Version: 13

返回的响应头示例

1
2
3
4
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: CCBCKCSKXJBJWJCKSCKNBVSKDS= #服务器根据Sec-WebSocket-Key来生成的Sec-WebSocket-Accept,客户端收到Sec-WebSocket-Accept后,会对Sec-WebSocket-Key做同样的操作,来看是否匹配,如果匹配,则成功建立连接

在第一次握手时会将HTTP协议升级到WebSocket协议来完成,建立之后,WebSocket消息可以在WebSocket接口定义的方法之间来回传送

webSocket的端点示例

1
ws://host:port/path?query

前端使用时创建WebSocket对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var ws  = new WebSocket("ws://host:port/path?query");
// 发送消息,open事件触发后在进行发送
ws.send("发送消息");
// WebSocket有四个事件
// open事件,服务器响应了WebSocket连接请求,open事件就会触发并建立一个连接。WebSocket已经准备好发送和接收数据了
ws.onopen=function(e){
};
// message事件,服务器向客户端发送了消息
ws.onmessage=function(e){
};
// error事件,在响应意外故障的时候触发
ws.onerror=function(e){
};
// close事件,连接关闭时触发
ws.onclose=function(e){
};

创建端点

1
2
3
4
5
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>

可以使用编程方式和注解方式两种方式来创建端点

编程方式

需要继承Endpoint类(javax.websocket.Endpoint)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class TestWebSocket extends Endpoint {
// Endpoint 有三个生命周期方法onOpen、onClose、onError
// Session参数表示这个端点和远端端点之间的会话
@Override
public void onOpen(Session session, EndpointConfig endpointConfig) {
// 注册消息处理器,端点接收到消息,会执行消息处理器的onMessage方法
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String s) {
try {
System.out.println("收到消息"+s);
// session.getBasicRemote() 会返回一个表示远端端点的对象
// sendText发送消息
session.getBasicRemote().sendText("收到");
} catch (IOException e) {
e.printStackTrace();
}
}
});
}

// 连接关闭
@Override
public void onClose(Session session, CloseReason closeReason) {
super.onClose(session, closeReason);
}

// 连接错误
@Override
public void onError(Session session, Throwable thr) {
super.onError(session, thr);
}
}

注解方式

1
2
3
4
5
6
7
8
@ServerEndpoint("/echo")
public class EchoEndpoint {

@OnMessage
public void onMessage(Session session,String msg){

}
}

欢迎关注我的其它发布渠道