WebSocket API简介:
首先看一段简单的javascript代码,该代码调用了WebSockets的API。
- var ws = new WebSocket(“ws://echo.websocket.org”);
- ws.onopen = function(){ws.send(“Test!”); };
- ws.onmessage = function(evt){console.log(evt.data);ws.close();};
- ws.onclose = function(evt){console.log(“WebSocketClosed!”);};
- ws.onerror = function(evt){console.log(“WebSocketError!”);};
这份代码总共只有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
}
}
}
}
}