翻译自Oracle官方文档 The Java EE 7 Tutorial,本篇是概述,各个章节将陆续翻译出来,与大家分享。水平有限,不当之处望大家批评指正。
概述
本章主要叙述Java API for WebSocket(JSR 356),它为创建WebSocket应用提供了支持。WebSocket是一个在TCP协议之上为两个对等端点之间提供全双工通信的应用协议。
在传统的 HTTP 请求-响应模式中,客户端请求资源,服务端进行响应。信息交换总是由客户端发起,如果客户端没有发起请求服务端就不能向它发送数据。当客户端偶尔地请求不经常发生变化的文档时,这种模式在万维网上工作的很好,但是随着网络资源迅速地变化以及用户希望在Web上获得更好的交互式体验,这种方式的局限性越来越凸显。Websocket协议通过在客户端和服务端之间提供一个全双工的通信通道致力于解决这些局限性。通过联合其他客户端技术,比如JavaScript和HTML5,WebSocket使Web应用能够提供更加丰富的用户体验。
接下来要介绍的内容如下:- WebSocket简介
- 在Java EE 平台创建WebSocket应用
- 编程式端点
- 基于注解的端点
- 发送和接收消息
- 维护客户端状态
- 使用编码器和解码器
- Path 参数
- 异常处理
- 指定终端配置器类
- dukeetf2 应用实例
- websocketbot 应用实例
- 关于WebSocket的更多信息
1 、WebSocket简介
在WebSocket应用中,服务器发布一个WebSocket端点,客户端通过端点的URI连接到服务器。连接建立以后,WebSocket协议是对等的,只要连接处于打开状态,客户端和服务端都可以随时互相发送信息。他们也都可以随时关闭连接。通常,客户端只连接到一个服务端,服务端可以接受多个客户端的连接。
WebSocket协议有两个部分:握手和数据传输。客户端通过使用URI向一个WebSocket端点发送请求而发起握手,WebSocket握手兼容现有的基于HTTP的底层结构:Web服务器把它当做HTTP连接升级请求来理解。下面是一个来自客户端的握手例子:
GET /path/to/websocket/endpoint HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost
Sec-WebSocket-Version: 13
服务端响应客户端握手是这样的:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
服务端通过对Sec-WebSocket-Key请求头的值进行一个共知的运算获得Sec-WebSocket-Accept响应头的值。客户端也对Sec-WebSocket-Key头的值进行相同的运算,如果得到的值和服务端返回的值相匹配,连接就会成功建立。成功握手之后客户端和服务端就可以互相发送消息了。
WebSocket支持文本消息(用UTF-8编码)和二进制消息。WebSocket的控制帧有close、ping和pong(用于响应ping帧)。Ping帧和pong帧也可以包含应用数据。
WebSocket端点由以下形式的的URI来表示:
ws://host:port/path?query
wss://host:port/path?query
ws形式表示非加密的WebSocket连接,wss形式表示加密的连接。port部分是可选的,默认的非加密连接端口是80,加密连接端口是443。path部分指明了WebSocket端点在服务器中的位置。query部分也是可选的。
现在的web浏览器大多实现了WebSocket协议,并且提供JavaScript API来建立连接、发送消息和为WebSocket事件(比如打开连接、接收消息、关闭连接)指定回调方法。