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");
ws.send("发送消息");
ws.onopen=function(e){ };
ws.onmessage=function(e){ };
ws.onerror=function(e){ };
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 { @Override public void onOpen(Session session, EndpointConfig endpointConfig) {
session.addMessageHandler(new MessageHandler.Whole<String>() { @Override public void onMessage(String s) { try { System.out.println("收到消息"+s); 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){ } }
|