WebSocket的java实现

 WebSocket API简介:

首先看一段简单的javascript代码,该代码调用了WebSockets的API。

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var ws = new WebSocket(“ws://echo.websocket.org”);  
  2.   
  3. ws.onopen = function(){ws.send(“Test!”); };  
  4.   
  5. ws.onmessage = function(evt){console.log(evt.data);ws.close();};  
  6.   
  7. ws.onclose = function(evt){console.log(“WebSocketClosed!”);};  
  8.   
  9. 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  
                }  
            }  
        }  
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值