美文网首页Java 杂谈
tomcat7和tomcat8的websocket区别

tomcat7和tomcat8的websocket区别

作者: Tank丶Farmer | 来源:发表于2019-04-02 10:19 被阅读4次

    tomcat8真正支持jsr-356(包含对websocket的支持), tomcat7部分版本的websocket实现不兼容jsr-356。websocket实现tomcat7.x与tomcat8.x有很大差异。在tomcat7中使用websocket需要定义一个servlet,然后继承WebSocketServlet,在tomcat8中使用websocke。出自:http://blog.csdn.net/liuxiao723846/article/details/46930173

    一、tomcat7定义servlet的方式简单举例。

    1、新建一个环境为tomcat7的web工程,需要的包有catalina.jar,tomcat-coyote.jar。

    2、修改web.xml。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:web="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee"
        id="WebApp_ID" version="2.5">
          <servlet>
            <servlet-name>WebSocket</servlet-name>
            <servlet-class>Tomcat7Test</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>WebSocket</servlet-name>
            <url-pattern>/websocket/*</url-pattern>
        </servlet-mapping>   
    </web-app>
    

    3、写一个后台类:Tomcat7Test.java。

    import java.io.IOException;
    import java.nio.ByteBuffer;
    import java.nio.CharBuffer;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.catalina.websocket.MessageInbound;
    import org.apache.catalina.websocket.StreamInbound;
    import org.apache.catalina.websocket.WebSocketServlet;
    import org.apache.catalina.websocket.WsOutbound;
    
    public class Tomcat7Test extends WebSocketServlet{
       @Override
       protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest arg1) {
           // TODO Auto-generated method stub
           return new MsgInbound();
       }
       
    
       private class MsgInbound extends MessageInbound{
       
           protected void onClose(int status){  
                       super.onClose(status);  
               }  
               protected void onOpen(WsOutbound outbound){  
                       super.onOpen(outbound);  
               }  
           
           @Override
           protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
               // TODO Auto-generated method stub
               
           }
       
           @Override
           protected void onTextMessage(CharBuffer message) throws IOException {
               // TODO Auto-generated method stub
               System.out.println(message.toString());
               //将websocket传过来的值返回回去
               WsOutbound outbound=this.getWsOutbound();
               outbound.writeTextMessage(message);
               outbound.flush();
           }
       }
    }
    

    4、前端html页面。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    

    服务器返回的信息:

    <input type="text" id="show"/>
    

    浏览器发送的信息:

    <input type="text" id="msg"/>
    <input type="button" value="send" id="send" onclick="q()"/>
     
     
    <script>
        var ws = null ;
        var target="ws://localhost:8080/TestWeb/websocket/test";
        if ('WebSocket' in window) {
            ws = new WebSocket(target);
        } else if ('MozWebSocket' in window) {
            ws = new MozWebSocket(target);
        } else {
            alert('WebSocket is not supported by this browser.');
        }
     
        ws.onopen = function(obj){
            console.info('open') ;
            console.info(obj) ;
        } ;
        
        ws.onclose = function (obj) {
            console.info('close') ;
            console.info(obj) ;
        } ;
        ws.onmessage = function(obj){
            console.info(obj) ;
            document.getElementById('show').value=obj.data;
        } ;
        function q(){
            ws.send(document.getElementById('msg').value);
        }
    </script>
    </body>
    </html>
    

    二、tomcat8使用websocket实例。

    只需要写java类,和前端代码。

    1、新建一个环境为tomcat7的web工程,需要的包有websocket-api.jar。

    2、后台java类。

    import java.io.IOException;
     
    import javax.websocket.OnClose;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.ServerEndpoint;
    //一定要添加这个注释
    @ServerEndpoint("/websocket/test")
    public class Test {
        @OnOpen
        public void onOpen(){
            System.out.println("WEBopen");
        }
        @OnClose
        public void onClose(){
            System.out.println("WEBCLOSE");
        }
        @OnMessage
        public void onMessage(Session session,String msg){
            System.out.println("send message"+msg);
            if(session.isOpen()){
                try {
                    //将websocket传过来的值返回回去
                    session.getBasicRemote().sendText(msg);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    

    3、前端html代码。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    服务器返回的信息:
    <input type="text" id="show"/>
     
    浏览器发送的信息:
    <input type="text" id="msg"/>
    <input type="button" value="send" id="send" onclick="q()"/>
     
     
    <script>
        var ws = null ;
        var target="ws://localhost:8080/TestWeb/websocket/test";
        if ('WebSocket' in window) {
            ws = new WebSocket(target);
        } else if ('MozWebSocket' in window) {
            ws = new MozWebSocket(target);
        } else {
            alert('WebSocket is not supported by this browser.');
        }
     
        ws.onopen = function(obj){
            console.info('open') ;
            console.info(obj) ;
        } ;
        
        ws.onclose = function (obj) {
            console.info('close') ;
            console.info(obj) ;
        } ;
        ws.onmessage = function(obj){
            console.info(obj) ;
            document.getElementById('show').value=obj.data;
        } ;
        function q(){
            ws.send(document.getElementById('msg').value);
        }
    </script>
    </body>
    </html>
    

    三、备注:
    1、websocket的前端代码都是一样的。

    2、tomcat7也支持上述的非servlet方式。

    3、tomcat8不支持servlet,没有对应要继承的WebSocketServlet.java。

    4、注意不要发生包冲突问题。

    1)web项目里面不能有跟tomcat/lib一样的包,否则启动tomcat的时候会发生包冲突。

    2)在tomcat的contex.xml中添加<Loader delegate="true"/>(不建议使用,容易产生其他错误)

    作用: Loader对象可出现在Context中以控制Java类的加载。

    属性:delegate、含义:True代表使用正式的Java代理模式(先询问父类的加载器);false代表先在Web应用程序中寻找。默认值:FALSE。

    5、以上的列子在tomcat的examples里面都有,需要学习可以直接在里面看源码。

    原文:https://blog.csdn.net/ja0000/article/details/72882194/

    相关文章

      网友评论

        本文标题:tomcat7和tomcat8的websocket区别

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