Socket的生命周期,包括客户端的与服务器端的:
- 浏览器发出一个HTTP请求,带有一个特殊的Upgrade头,其值是“websocket”。
- 如果服务器能够“理解”WebSocket,那么它会使用状态101进行应答——交换协议。从现在开始,我们就不再使用HTTP了。
- 当服务器接收这个TCP Socket连接后,一个初始化方法会得到调用,当前的WebSocket Session会被传递进来。每个Socket都有唯一一个Session id。
- 当浏览器向服务器发送消息时,另一个方法会得到调用,你在这里获得Session与消息负载。
- 根据某个负载参数,应用代码会执行一个动作。负载的格式完全取决于开发者。一般来说会使用JSON序列化的对象。
- 当服务器需要发送消息时,它需要获得这个Session对象,然后通过它来发送消息。
- 当浏览器关闭连接时,服务器会得到通知,这样它就可以清理与特定Session关联的一些资源了。
WebSocket协议改变了web服务器响应客户端请求的方式:新方式取代了原来关闭连接的方式,服务器将返回101状态码并将连接保持在打开状态,该协议期望达到的效果是消息可以在流上读取也可以被写入到流中。它与HTTP不同,该协议支持全双工通信,所以客户端(通常是浏览器)和服务器之间可以在同一时间互相发送消息。
WebSocket协议通过IETF RFC 6455进行定义。
为了建立WebSocket连接,客户端会向服务器发起一个WebSocket握手请求,而服务器将会作出响应
一旦握手成功后,客户端和服务器便处于连接状态并成为了对等的两个节点(peer);双方都可以发送或接收消息,以及终止本次连接。
我们通常使用JavaScript并结合由W3C定义的相关API来处理WebSocket客户端。Java WebSocket应用由WebSocket端点(endpoint)构成,该端点是一些Java对象,用于表示WebSocket两节点之间连接的某一端。
Java WebSocket API将一次会话中的每个具有端点的节点(each peer of a session with an endpoint)模拟成一个RemoteEndpoint接口的实例。该接口及其两个子类型(RemoteEndpoint.Whole 和 RemoteEndpoint.Partial)包含了各种各样用于将WebSocket消息从端点发送至其节点的方法。
有两种方式可以用以创建端点。
第一种是实现Java WebSocket API中某些具有必需行为的API类,从而能够处理端点生命周期、消费和发送消息、发布自身或连接到节点。
第二种方式是使用Java WebSocket API中的某些注解来装饰一个普通Java类(POJO)。底层实现将会根据这些被注解的类在运行时创建合适的对象,从而将POJO部署为WebSocket端点。
API对每个Session 的MessageHandler注册进行了限制:每个原生WebSocket消息(text、binary、pong)类型只能有一个MessageHandler,该限制有可能在将来会发生变化。
端点在建立WebSocket连接的握手开始阶段参与进来,通常都会发送和接收各种各样的WebSocket消息。端点的生命周期在WebSocket连接关闭时结束。
不论是由于从节点收到WebSocket关闭事件,还是因为底层实现需要关闭连接,只要在WebSocket端点上的某个打开连接由于任何原因将要被关闭时,WebSocket实现必须调用WebSocket端点的onClose()方法。