WebSocket API简介:
首先看一段简单的javascript代码,该代码调用了WebSockets的API。
这份代码总共只有5行,现在简单概述一下这5行代码的意义。
第一行代码是在申请一个WebSocket对象,参数是需要连接的服务器端的地址,同http协议使用http://开头一样,WebSocket协议的URL使用ws://开头,另外安全的WebSocket协议使用wss://开头。
第二行到第五行为WebSocket对象注册消息的处理函数,WebSocket对象一共支持四个消息 onopen, onmessage, onclose和onerror,当Browser和WebSocketServer连接成功后,会触发onopen消息;如果连接失败,发送、接收数据失败或者处理数据出现错误,browser会触发onerror消息;当Browser接收到WebSocketServer发送过来的数据时,就会触发onmessage消息,参数evt中包含server传输过来的数据;当Browser接收到WebSocketServer端发送的关闭连接请求时,就会触发onclose消息。我们可以看出所有的操作都是采用消息的方式触发的,这样就不会阻塞UI,使得UI有更快的响应时间,得到更好的用户体验。
实现:
@ServerEndpoint(value = "/websocket/{random}") public class WebSocket { private static final Set<WebSocket> connections = new CopyOnWriteArraySet<WebSocket>(); private Session session; private String random; public WebSocket() { } /*当websocket的客户端连接到服务器时候,这个方法就会执行,并且传递一个session会话对象来 我们拿到这话session,就是可以给客户端发送消息*/ @OnOpen public void start(Session session,@PathParam("random") String random) { this.random=random; System.out.println(random); this.session = session; connections.add(this); } /*客户端被关闭时候,就会自动会调用这个方法*/ @OnClose public void end() { connections.remove(this); } /*客户端给服务器发送消息,这个方法会自动调用,并且可以拿到发送过来的数据*/ @OnMessage public void incoming(String message) { // Never trust the client //sendByIp("10.104.5.51","only to the first"); System.out.println(random+":"+message); broadcast(message); } /*发生了异常自动执行*/ @OnError public void onError(Throwable t) throws Throwable { } /*广播:遍历客户端集,发送消息,注意发送要用的session,用session.getBasicRemote().sendText(msg)发送消息*/ public static void broadcast(String msg) { for (WebSocket client : connections) {//遍历所有 try {//如果这个client已经在线 synchronized (client) { client.session.getBasicRemote().sendText(msg);//发送消息 } } catch (IOException e) {//如果这个client不在线 connections.remove(client); try { client.session.close(); } catch (IOException e1) { // Ignore } } } } }
原文地址:http://blog.csdn.net/zhangxbj/article/details/44807079