资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
使用 JSR 356 在 Java 中构建 WebSocket 应用,Arun Gupta ,以下内容旨在概述产品的总体发展方向。该内容仅供参考,不可纳入任何合同。其内容不构成提供任何材料、代码或功能的承诺,并且不应该作为制定购买决策的依据。此处所述有关 Oracle 产品的任何特性或功能的开发、发布以及相应的日程安排均由 Oracle 自行决定。,议题,WebSocket 基本知识 JSR 356:Java API for WebSocket,交互式网站,HTTP 为半双工协议 HTTP 冗长而繁琐 针对服务器推送的黑客攻击 轮询 长时间轮询 Comet/Ajax 复杂、低效、浪费,WebSocket 将您解放出来,基于 TCP 的双向全双工消息传递 最初作为 HTML5 的一部分提出 IETF 定义的协议:RFC 6455 握手 数据传输 W3C 定义的 JavaScript API 候选建议,基本理念是什么?,升级 HTTP 以升级至 WebSocket 单一 TCP 连接 对代理、防火墙和路由器透明 在两个方向发送数据帧(双向) 无头部信息、Cookie、身份验证 无安全开销 用于保持激活的“ping”/“pong”帧 发送彼此独立的消息(全双工) 结束连接,建立连接,客户端,握手请求,握手响应,服务器,握手请求,GET /chat HTTP/1.1Host: Upgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ=Origin: Sec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 13,握手响应,HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Sec-WebSocket-Protocol: chat,服务器,客户端,握手请求,握手响应,已连接!,建立连接,对等端点(服务器),对等端点(客户端),已连接!,打开,打开,关闭,消息,错误,消息,消息,消息,消息,已断开,WebSocket 生命周期,WebSocket API,www.w3.org/TR/websockets/,浏览器支持,JSR 356 规范,用于创建 WebSocket 应用程序的标准 Java API 透明的专家组 jcp.org/en/jsr/detail?id=356 最后:Java EE 7 的一部分,JSR 356:参考实现,Tyrus: 开源和透明 在 GlassFish 4 中集成,Java API for WebSocket 的特性,针对 WebSocket 服务器和客户端端点的 API 注解式:ServerEndpoint、ClientEndpoint 编程式:端点 WebSocket 打开握手协商 生命周期回调方法 与 Java EE 技术集成,Hello World 和基本POJO,Hello World,注解式端点,import javax.websocket.*;ServerEndpoint(/hello)public class HelloBean OnMessage public String sayHello(String name) return “Hello “ + name; ,注解,ServerEndpoint 属性,自定义负载,ServerEndpoint( value=/hello, decoders=MyMessageDecoder.class, encoders=MyMessageEncoder.class)public class MyEndpoint . . .,自定义负载 文本解码器,public class MyMessageDecoder implements Decoder.Text public MyMessage decode(String s) JsonObject jsonObject = Json.createReader().readObject(); return new MyMessage(jsonObject); public boolean willDecode(String string) . . . return true; / Only if can process the payload . . .,自定义负载 文本编码器,public class MyMessageEncoder implements Encoder.Text public String encode(MyMessage myMessage) return myMessage.jsonObject.toString(); . . .,自定义负载 二进制解码器,public class MyMessageDecoder implements Decoder.Binary public MyMessage decode(byte bytes) . . . return myMessage; public boolean willDecode(byte bytes) . . . return true; / Only if can process the payload . . .,哪些方法可以使用 OnMessage?,以下类型之一: 文本:String、Java 基元或等价类、String 和 Boolean、Reader、任何具有相应解码器的类型 二进制:byte、ByteBuffer、byte 和 Boolean、ByteBuffer 和 Boolean、InptuStream、任何具有相应解码器的类型 Pong 消息:PongMessage 可选的 Session 参数 使用 PathParam 注解的 0 到 n 个 String 参数 返回类型:String、byte、ByteBuffer、JAVA 原始类型及其对应包装类,或者任何具有相应编码器的类型,示例消息,void m(String s); void m(Float f, PathParam(“id”)int id); Product m(Reader reader, Session s); void m(byte b); or void m(ByteBuffer b); Book m(int i, Session s, PathParam(“isbn”)String isbn, PathParam(“store”)String store);,聊天服务器,ServerEndpoint(/chat) public class ChatBean static Set peers = Collections.synchronizedSet(); OnOpen public void onOpen(Session peer) peers.add(peer); OnClose public void onClose(Session peer) peers.remove(peer); . . .,聊天服务器,. . . OnMessage public void message(String message, Session client) for (Session peer :peers) peer.getBasicRemote().sendObject(message); ,URI 模板匹配,仅 1 级,ServerEndpoint(“/orders/order-id”)public class MyEndpoint OnMessage public void processOrder( PathParam(“order-id”)String orderId) . . . ,WebSocket 客户端,ClientEndpointpublic class HelloClient OnMessage public void message(String message, Session session) / process message from server WebSocketContainer c = ContainerProvider.getWebSocketContainer();c.connectToServer(HelloClient.class, “hello”);,Hello World 和基本非 POJO,编程式端点,public class MyEndpoint extends Endpoint Override public void onOpen(Session session) session.addMessageHandler(new MessageHandler.Text() public void onMessage(String name) try session.getBasicRemote().sendText(“Hello “ + name); catch (IOException ex) ); ,接口驱动的端点,ServerEndpointConfiguration config = ServerEndpointConfigurationBuilder .create(MyEndpoint.class, “/foo”) .build();,服务器封装,服务器和客户端配置,服务器 URI 匹配算法 子协议和扩展协议 消息编码器和解码器 来源检查 握手响应 客户端 请求的子协议和扩展协议 消息编码器和解码器 请求 URI,与依赖注入的关系,支持端点所需要的全部依赖注入 字段、方法、构造函数注入 也支持使用拦截器,与 Servlet 3.1 的关系,允许通过轻便的方式升级 HTTP 请求 新 API HttpServletRequest.upgrade(ProtocolHandler handler),安全性,在打开握手期间使用 Servlet 安全机制进行身份验证 由 ws:/ 映射的端点将通过使用相应 http:/ URI 定义的安全模型获得保护 使用 定义授权 TBD:添加/重用安全注解 使用 wss:/ 的传输机密性 仅允许通过加密的连接访问,如何查看 WebSocket 消息?,捕获回环中的流量,如何查看 WebSocket 消息?,chrome:/net-internals - Sockets - View live sockets,资源,规范 JSR: jcp.org/en/jsr/detail?id=356 邮件列表、JIRA、存档: 最后:Java EE 7 的一部分 参考实现 Tyrus: 在 GlassFish 4 中集成,问答,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号