前端WebSocket 引用以及使用,测试以及解决404问题

本文详细介绍了如何在Tomcat中实现WebSocket服务,包括Maven配置、Java后端代码示例以及前端JavaScript代码。在遇到404错误时,分析了问题原因并给出了解决方案,强调了与Tomcat内置WebSocket库的版本冲突可能导致此类问题。此外,还讨论了WebSocket在实际应用中的使用和测试情况。
摘要由CSDN通过智能技术生成

提示:根据自身经验和一些网上的资料总结出一些WebSocket的知识;

首先了解webSocket的原理:

https://www.runoob.com/html/html5-websocket.html

 

文章目录

  •  
  • Tomcat实现websocket方法
  • 引入:maven下

    利用javax扩展包下的websocket API开发的websocket服务部署正常,代码如下:

    构建maven工程,引入项目依赖jar包:

    <dependency>
           <groupId>javax.websocket</groupId>
           <artifactId>javax.websocket-api</artifactId>
           <version>1.1</version>
     </dependency>
     

  • java代码:
  • package com.ict.web.modules.command.web;
    
    import javax.websocket.server.ServerEndpoint;
    
    import org.springframework.stereotype.Component;
    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.websocket.*;
    import javax.websocket.server.PathParam;
    
    import java.io.IOException;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    
    @ServerEndpoint(value = "/websocketTest/{userId}")
    @Component
    public class DemoWebsocket  {
    	private static Logger logger = LoggerFactory.getLogger(DemoWebsocket.class);
    	 
        private String userId;
        private Session session;
     
        /**
         * 以用户的姓名为key,websocket为对象保存起来
         */
        private static Map<String, DemoWebsocket> clients = new ConcurrentHashMap<>();
        
        @OnOpen
        public void onOpen(@PathParam("userId") String userId, Session session) {
            logger.debug("新连接:{}", userId);
            //首先要判断该ID是否已经加入,如果已经加入不重复加入
            if (!isEmpty(userId)) {
                this.userId = userId;
                this.session = session;
                clients.put(userId, this);
                logger.info("现在连接的客户编码为:" + userId);
            }
        }
     
        /**
         * 关闭时执行
         */
        @OnClose
        public void onClose() {
        
        	//clients.remove(this.userId);
            logger.debug("连接:{} 关闭", this.userId);
        }
     
        /**
         * 收到消息时执行
         *
         * @param message
         * @param session
         */
        @OnMessage
        public void onMessage(String message, Session session) {
            logger.debug("收到用户{}的消息{}", this.userId, message);
            //回复用户
            //session.getAsyncRemote().sendText("收到 " + this.userId + " 的消息:" + message);
            //发送消息: 
            if(1<2){
            	 sendAll(message);
            }
        }
     
         /**
             * 给所有人发消息
             * @param message
             */
          private void sendAll(String message) {
        	  //recoverycz_1221accid_时间戳(1221突发事件id)
        	  String[] messageArrays = message.split("_");
              String  newMessage = messageArrays[0];//发送信息内容 
              String  userIdaccid = messageArrays[1]; //发送者 发送同个突发事件的不同浏览器
              
              //遍历 用户 全部 发送 
              
              for(String key:clients.keySet()){
            	  
            	  //判断 用户是否存在;
            	  try {
            		 // DemoWebsocket demoWebsocket = clients.get(key);
    				  //clients.get(key).sendMessage(newMessage);
            		  String key2=key;  
            		  if(key2.contains(userIdaccid)){  //判断是不是 同一个突发事件 ,如果是发送给同一个事件不同的浏览器 ;
            			  sendMessageToUser(key,newMessage);
            		  }
    				  
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
            	  
              }
          }
    
         //发送信息 
         public void sendMessage(String message) throws IOException {
        	   session.getAsyncRemote().sendText( message);
         }
        	
        /**
         * 连接错误时执行
         *
         * @param session
         * @param error
         */
        @OnError
        public void onError(Session session, Throwable error) {
            logger.debug("用户id为:{}的连接发送错误", this.userId);
            error.printStackTrace();
        }
     
        /**
         * 消息点对点推送
         *
         * @param clientId
         * @param message
         */
        public static void sendMessageToUser(String clientId, String message) {
     
            DemoWebsocket session = clients.get(clientId);
            if (session != null) {
                if (session.session.isOpen()) {
                   // session.session.getAsyncRemote().sendText("收到 " + clientId + " 的消息:" + message);
                	session.session.getAsyncRemote().sendText("收到 " + clientId + " 的消息:" + message);
                } else {
                    logger.info("用户session关闭");
                }
            } else {
                logger.info("用户session不存在");
            }
        }
     
        private static boolean isEmpty(String s) {
            return s == null || s.length() == 0 || "".equals(s)
                    || "null".equalsIgnoreCase(s)
                    || "undefined".equalsIgnoreCase(s);
        }
     
    }
    

     

  • 前端代码: 根据项目业务 将A信息 发送给 B、C等信息
  • <script type="text/javascript">
    var accId="${accid}";	
    var eventdate1='${eventDate}';
    var Ip;
    var timestamp = (new Date()).getTime();
    //区别 每个发送者 id 
    
    var userId = accId+'accId_'+timestamp;
    var recoveryczMsg =0;
    var operationendMsg=0;
    var ctx ="${ctx}";
    
    if('WebSocket' in window){
    	//alert("userId="+userId);
    	 var socketUrl ="ws://localhost:8080/emergency/websocketTest/"+userId;
     // var socketUrl = "ws://"+ window.location.host+ctx+"/websocketTest/" + userId;//访问SocketServer,并传输当前id
    	//alert("socketUrl="+socketUrl); 
         console.log("socketUrl="+socketUrl);
    	 websocket = new WebSocket(socketUrl);
    	 
    	console.log("link success")
    }else{
        alert('Not support websocket')
    }
    
    //连接发生错误的回调方法
    websocket.onerror = function(){
        //setMessageInnerHTML("error");
       // alert("error");
        alert("websocket连接发生错误,请修改地址");
    };
    
    //连接成功建立的回调方法
    websocket.onopen = function(event){
        //setMessageInnerHTML("open");
        
    	//alert("open");
    }
    console.log("-----")
    //接收到消息的回调方法
    websocket.onmessage = function(event){
         //setMessageInnerHTML(event.data);
         
         //alert(event.data);
         var messa = event.data;
    	if(messa.indexOf("recoverycz") != -1 ){ //3
    		 
    		 recoveryczMsg =1;
    		 $(".recovery-operation").trigger("click");//恢复运营
    		
    	 }else if(messa.indexOf("operationend") != -1){ //5
    		 operationendMsg=1;
           $(".disposal-end").trigger("click");//处置结束
           
    	 }
         
    }
    
    //连接关闭的回调方法
    websocket.onclose = function(){
       // setMessageInnerHTML("close");
       // alert("close");
    }
    
    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function(){
    
        websocket.close();
    }
    
    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML){
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }
    
    //关闭连接
    function closeWebSocket(){
    	//alert("关闭链接");
        websocket.close();
    }
    
    //发送消息
    function send(message){
        //var message = document.getElementById('text').value;
        message =message+"_"+userId;// userId = accId+'accId'+timestamp;
        websocket.send(message);
    }
  • 写完后测试:

  • websocket = new WebSocket("ws://172.28.14.122:7001/emergency/websocketTest/122_accId_122");
  • 172.28.14.122:7001是我本地项目;emergency项目名称:
  • 测试:
  • Tomcat下和maven项目下出现404的原因:

  • 如题所示,tomcat8启动正常,访问页面也正常,当页面上的websocket连接tomcat部署的websocket服务器时,出现404错误
  • 出现404的原因:有可能是:
  • 出现这个问题,不是websocket服务器地址的问题,也不是tomcat7与tomcat8版本的问题。而是我们引入的依赖javax.websocket-api-1.1.jar和tomcat lib目录下自带的websocket-api.jar冲突了。(去掉maven的websocket-api-1.1.jar )
  • 第一步 (去掉maven的websocket-api-1.1.jar )

第二步:引用tomcat自带 websocket 便可

  • 总结:
  • webSocket的应用;webSocket的测试,以及解决报404 的原因

 


前言

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值