• 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/*
    	   
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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();
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    4、前端html页面。

    
    
    
    
    Insert title here
    
    
    服务器返回的信息:
    
    
    浏览器发送的信息:
    
    
    
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    二、tomcat8使用websocket实例。

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

    1、新建一个环境为tomcat8的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();
    			}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    3、前端html代码。

    
    
    
    
    Insert title here
    
    
    服务器返回的信息:
    
    
    浏览器发送的信息:
    
    
    
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    三、备注:

    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里面都有,需要学习可以直接在里面看源码。

  • 相关阅读:
    nodejs--process
    CSS怎么选择除了第一个子元素外的其余同级子元素
    nodejs篇 内置模块path 常用api
    .NET WebAPI 采用 IDistributedCache 实现分布式缓存过滤器 Redis 模式
    C++类与对象初步认识
    【图像分割】基于混洗Shuffled Complex Evolution实现图像分割附matlab代码
    一个基于字节的流式diff算法
    外观缺陷检测原理
    Python自动生成小学生口算试卷源代码,可设置各算数项和取值范围、可以生成求结果、求算数项、带括号的算式
    19.删除链表的倒数第 N 个节点
  • 原文地址:https://blog.csdn.net/m0_67401134/article/details/126516830