tomcat7和tomcat8的websocket区别

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。



      
        WebSocket
        Tomcat7Test
    
    
        WebSocket
        /websocket/*
       

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页面。





Insert title here


服务器返回的信息:


浏览器发送的信息:



 
 



二、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代码。





Insert title here


服务器返回的信息:

 
浏览器发送的信息:


 
 



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

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

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

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

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

2)在tomcat的contex.xml中添加(不建议使用,容易产生其他错误)

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

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

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

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

你可能感兴趣的:(tomcat7和tomcat8的websocket区别)