通过实现简单聊天室了解websocket的基础使用

websocket基础使用

用到的依赖包
  • websocket的依赖

    <dependency>
    	<groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.1</version>
        <scope>provided</scope>
    </dependency>
    
  • json-lib的依赖

    <dependency>
    	<groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
    </dependency>
    
    服务端代码实现
  • 服务端需要Servlet3.0的注解

    @ServerEndpoint("/websocket/{name}") : 用于标记该类为websocket服务端类

    name用于记录当前websocket是谁,用于区分连接的用户

    servlet是单例对象,websocket是多里对象,因为他需要实时连接,与要知道每个连接是谁
    (解释都在注释里,不多赘述)

    public class WebSocket {
        private String name;//用于记录当前websocket是谁,用于区分连接的用户
        private Session session; //webSocket中的session 链接,用于记录当前的连接
        
        private static Map<String,WebSocket> allClients = new HashMap<>();
        
        public Session getSession(){
            //...
        }
        
        public void setSession() {
            //...
        }
        
        /**
          *
          * @param name 嗲表地址参数中的name
          * @param session 当前建立的链接
          */
        @OnOpen  //标志建立连接的注释
        public void openConnection(@PathParam("name") String name,Session session){
            this.name = name;
            this.session = session;
            allClients.put(name,this);//将name与webSocket绑定
        }
        
        /**
          * 当服务器接受到消息时触发
          * @param message 
          * @param session 当前建立的链接
          */
        @OnMessage //用于接收客户端发来的消息,这个地方应该根据自己的实际业务需求,来决定到底写什么
        public void onMessage(Session session,String message) {
            //1.首先解析发过来的内容,找到目标接收者:通过名字找到名字对应的websocket对象,获取websocket对象中的session,创建一个固定容器用于存放对应key-value值:String-WebSocket
            JSONObject jsonObject  JSONObject.fromObject(message);
            
            //与前端约定,接收者为toUser,发送信息内容为toMessage
            String to = jsonObject.getString("toUser");//找到接收者
            String toMessage = jsonObject.getString("toMessage");//获取到发送的内容
            //2.根据目标接收者,找到它的session链接
            WebSocket webSocket = allClients.get(to);//获取到目标接收者的webSocket
            //3.通过session发消息
            if(WebSocket != null){
                Session toSession = webSocket.getSession();//获取到服务器和目标接收者的链接
    			if(toSession.isOpen()) {
                    //toSession为要发送的目标者,getAsyncRemote获得链接的相对的另一端
                    toSession.getAsyncRemote().sendText(toMessage);
                }
            }else {
                //正常来说应该缓存这个消息,这里我就直接发送留言,对方不在线
                session.getAsyncRemote().sendText("对方不在线");
            }
           
        }
        
        /**
          * 当服务器发生异常时触发
          * @param e 可抛出的异常
          * @param session 哪个链接出现了异常
          */
        @OnError
        public void onError(Session session,Throwable e) {
            
        }
        
        /**
          * 当链接关闭的时候触发
          * @param e 可抛出的异常
          * @param session 哪个链接出现了异常
          */
        @OnClose
        public void onClose(Session session){
            
        }
        
    }
    
    客户端js代码
    var websocket = null;
    
    //-------------===客户端获取websocekt链接===-----------------
    function connection(){
        var username="";//对应服务端的name TODO:更具具体情况获得一个username用于表示当前的链接
        //首先判断当前浏览器是否支持websocket
        if('WebSocket' in window) {
            //创建websocket
            websocket = new WebSocket("ws://"+document.location.host+"/websocket"+username);
        }else{
            alert('当前浏览器不支持websocket');
        }
        
        //建立链接的回调
        websocket.onopen = function() {
            console.log("链接建立了")
        }
        
        //收到消息时
        websocket.onmessage = function(event) {
           	//获得消息,并打印
            console.log(event.data)
        }
        
        websocket.onerror = function() {
            console.log("出现异常了")
        }
        
        websocket.onclose = function() {
            console.log("链接关闭了")
        }
        
        //当浏览器的页面窗口关闭的时候,此时应该关闭链接,防止服务器出现异常
        window.onbeforeunload = = function() {
            if (websocket!=null){
                websocket.close();
            }
        }
    }
    
    //------------==发送消息==-----------
    function sendMessage(){
        //1.获取到发送给谁
        var toUser = "";//Dom操作,此处省略了
        //2.获取到发送的内容
        var toMessage = ""//Dom操作,此处省略了
        
        if(websocket!=null) {
           	//拼json串
            var message = "{'toUser':"+toUser+","+"'toMessage':"+toMessage+"}";】
            //发送json串
            websocket.send(message);
        }
    }
    
posted @ 2020-03-14 00:44  阿尔伯特-李古拉-逸凡  阅读(131)  评论(0编辑  收藏  举报