美文网首页
Websocket:TomCat7 与 TomCat8的区别

Websocket:TomCat7 与 TomCat8的区别

作者: JonesCxy | 来源:发表于2018-03-26 12:52 被阅读2530次

    这两天因为项目需求研究了一下Websocket,发现TomCat7与TomCat8还是有些区别的,总的来说TomCat8比较简单,易实现。
    网上有很多文章都指出TomCat7需要修改web.xml以及单独导入.jar包,但是我没有修改任何地方,也能连接成功。

    • 区别:
      1、tomcat7需要建立一个链接类来继承WebSocketServlet,但是tomcat8不需要
      2、tomcat使用@WebServlet("/DemoWebSocket")建立URL映射,而tomcat8使用@ServerEndpoint("/DemoWebSocket")
    • 相同点:
      1、jsp代码不需要变
      2、链接地址不变
      代码是借鉴别人的
    • 贴上tomcat7下的代码
    package com.scoket.scoketTest;
    
    import java.util.concurrent.atomic.AtomicInteger;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServletRequest;
    import org.apache.catalina.websocket.StreamInbound;
    import org.apache.catalina.websocket.WebSocketServlet;
    import com.scoket.scoketTest.HelloMessageInbound;
    
    @WebServlet("/DemoWebSocket")
    public class WebSocketTest extends WebSocketServlet {
    
        private static final long serialVersionUID = 1L; 
        private final AtomicInteger connectionIds = new AtomicInteger(0);
        @Override
        protected StreamInbound createWebSocketInbound(String arg0,
                HttpServletRequest arg1) {
            // TODO Auto-generated method stub
            return new HelloMessageInbound(connectionIds.getAndIncrement(), arg1 
                    .getSession().getId()); 
        }
    
    }
    
    
    package com.socket;
    
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.Reader; 
    import java.nio.CharBuffer; 
    import org.apache.catalina.websocket.StreamInbound; 
    import org.apache.catalina.websocket.WsOutbound; 
    
    public class HelloMessageInbound extends StreamInbound {
        private String WS_NAME; 
        private final String FORMAT = "%s : %s"; 
        private final String PREFIX = "ws_"; 
        private String sessionId = ""; 
         
        public HelloMessageInbound(int id, String _sessionId) { 
              this.WS_NAME = PREFIX + id; 
              this.sessionId = _sessionId; 
             }
        
        @Override
         protected void onTextData(Reader reader) throws IOException { 
          char[] chArr = new char[1024]; 
          int len = reader.read(chArr); 
          send(String.copyValueOf(chArr, 0, len)); 
         } 
          
         @Override
         protected void onClose(int status) { 
          System.out.println(String.format(FORMAT, WS_NAME, "closing ......")); 
          super.onClose(status); 
         } 
          
         @Override
         protected void onOpen(WsOutbound outbound) { 
          super.onOpen(outbound); 
          try { 
           send("hello, my name is " + WS_NAME); 
           send("session id = " + this.sessionId); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
          
         private void send(String message) throws IOException { 
          message = String.format(FORMAT, WS_NAME, message); // 推送消息
          System.out.println(message); 
          getWsOutbound().writeTextMessage(CharBuffer.wrap(message)); 
         } 
          
         @Override
         protected void onBinaryData(InputStream arg0) throws IOException { 
         }
    
    }
    
    

    前端jsp

    <!DOCTYPE HTML> 
    <html> 
    <head> 
    <title>tomcat7test</title> 
    <style> 
    body {padding: 40px;}
    #outputPanel {margin: 10px;padding:10px;background: #eee;border: 1px solid #000;min-height: 300px;} 
    </style> 
    </head> 
    <body> 
    <input type="text" id="messagebox" size="60" /> 
    <input type="button" id="buttonSend" value="Send Message" /> 
    <input type="button" id="buttonConnect" value="Connect to server" /> 
    <input type="button" id="buttonClose" value="Disconnect" /> 
    <br> 
    <% out.println("Session ID = " + session.getId()); %> 
    <div id="outputPanel"></div> 
    </body> 
    <script type="text/javascript"> 
     var infoPanel = document.getElementById('outputPanel'); // 输出结果面板 
     var textBox = document.getElementById('messagebox'); // 消息输入框 
     var sendButton = document.getElementById('buttonSend'); // 发送消息按钮 
     var connButton = document.getElementById('buttonConnect');// 建立连接按钮 
     var discButton = document.getElementById('buttonClose');// 断开连接按钮 
     // 控制台输出对象 
     var console = {log : function(text) {infoPanel.innerHTML += text + "<br>";}}; 
     // WebSocket演示对象 
     var demo = { 
      socket : null, // WebSocket连接对象 
      host : '',  // WebSocket连接 url 
      connect : function() { // 连接服务器 
       window.WebSocket = window.WebSocket || window.MozWebSocket; 
       if (!window.WebSocket) { // 检测浏览器支持 
        console.log('Error: WebSocket is not supported .'); 
        return; 
       } 
       this.socket = new WebSocket(this.host); // 创建连接并注册响应函数 
       this.socket.onopen = function(){console.log("websocket is opened .");}; 
       this.socket.onmessage = function(message) {console.log(message.data);}; 
       this.socket.onclose = function(){ 
        console.log("websocket is closed ."); 
        demo.socket = null; // 清理 
       }; 
      }, 
      send : function(message) { // 发送消息方法 
       if (this.socket) { 
        this.socket.send(message); 
        return true; 
       } 
       console.log('please connect to the server first !!!'); 
       return false; 
      } 
     }; 
     // 初始化WebSocket连接 url 
     //demo.host=(window.location.protocol == 'http:') ? 'ws://' : 'wss://' ;
     //demo.host += window.location.host + '/tomcat7test/DemoWebSocket';
     demo.host = 'ws://localhost:9090/tomcat7test/DemoWebSocket'
     console.log(demo.host);
     // 初始化按钮点击事件函数 
     sendButton.onclick = function() { 
      var message = textBox.value; 
      if (!message) return; 
      if (!demo.send(message)) return; 
      textBox.value = ''; 
     }; 
     connButton.onclick = function() { 
      if (!demo.socket) demo.connect(); 
      else console.log('websocket already exists .'); 
     }; 
     discButton.onclick = function() { 
      if (demo.socket) demo.socket.close(); 
      else console.log('websocket is not found .'); 
     }; 
    </script> 
    </html>
    
    • jar截图


      jar截图

    相关文章

      网友评论

          本文标题:Websocket:TomCat7 与 TomCat8的区别

          本文链接:https://www.haomeiwen.com/subject/zatrcftx.html