基础内容
这个项目包含使用100%Java编写的准系统WebSocket服务器和客户端实现。 底层类是java.nio实现的,它允许非阻塞事件驱动模型(类似于Web浏览器的WebSocket API)。
视点1:
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。【3】
WebSocket解决了浏览器客户端-服务器通信低效(低速、低效)的问题,提供了一种高效的长连接通信模式。
视点2:
我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据;这种客户端是主动方,服务端是被动方的传统Web模式 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应 用。在WebSocket规范提出之前,开发人员若要实现这些实时性较强的功能,经常会使用折衷的解决方法:轮询(polling)和Comet技术。其实后者本质上也是一种轮询,只不过有所改进。
轮询是最原始的实现实时Web应用的解决方案。轮询技术要求客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动。明显地,这种方法会导致过多不必要的请求,浪费流量和服务器资源。【4】
代码部分
S1.添加到项目
下载Java-WebSocket-1.3.8.jar包
https://github.com/TooTallNate/Java-WebSocket/releases
添加Java-WebSocket-1.3.8.jar包或直接添加源码到工程libs目录,add as library;
S2.使用
//1.参考官方提供的示例example //2.实用范例 //创建WebSocketService /** * WebSocket service 服务端 * https://github.com/TooTallNate/Java-WebSocket */ public class WebSocketService extends WebSocketServer { private static int counter = 0;
public WebSocketService(int port, Draft d) throws UnknownHostException { super(new InetSocketAddress(port), Collections.singletonList(d)); }
public WebSocketService(InetSocketAddress address, Draft d) { super(address, Collections.singletonList(d)); }
@Override public void onOpen(WebSocket conn, ClientHandshake handshake) { counter++; System.out.print("WebSocket Opened connection number" + counter); System.out.print("WebSocket onOpen:" + conn.getRemoteSocketAddress().getAddress().getHostAddress()); }
@Override public void onClose(WebSocket conn, int code, String reason, boolean remote) { System.out.print("WebSocket closed:" + conn.getRemoteSocketAddress().getAddress().getHostAddress()); }
@Override public void onError(WebSocket conn, Exception ex) { ex.printStackTrace(); System.out.print("WebSocket Error:" + ex.getMessage()); }
@Override public void onStart() { System.out.print("WebSocket Server started!"); }
@Override public void onMessage(WebSocket conn, String message) { conn.send(message); }
@Override public void onMessage(WebSocket conn, ByteBuffer blob) { conn.send(blob); }
@Override public void onWebsocketMessageFragment(WebSocket conn, Framedata frame) { FramedataImpl1 builder = (FramedataImpl1) frame; builder.setTransferemasked(false); conn.sendFrame(frame); } } //启动WebSocketService WebSocketService webSocketService = null; try { webSocketService = new WebSocketService(9002, new Draft_6455()); webSocketService.setConnectionLostTimeout(0); webSocketService.start(); } catch (UnknownHostException e) { e.printStackTrace(); }
|
//客户端js var ws = new WebSocket("wss://echo.websocket.org");
ws.onopen = function(evt) { console.log("Connection open ..."); ws.send("Hello WebSockets!"); };
ws.onmessage = function(evt) { console.log( "Received Message: " + evt.data); ws.close(); };
ws.onclose = function(evt) { console.log("Connection closed."); };
|
Ref:
1. https://github.com/TooTallNate/Java-WebSocket
2. https://github.com/TooTallNate/Java-WebSocket/releases