0%

webSocket简介

webSocket简介

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

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

过程

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做同样的操作,来看是否匹配,如果匹配,则成功建立连接

webSocket的端点示例

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

创建端点

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){

}
}