tomcat7和tomcat8的websocket区别

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

大家好,又见面了,我是你们的朋友全栈君。

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、新建一个环境为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();
			}
		}
	}
}

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://javaforall.net/161090.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Altium Designer 13 安装完整元件库「建议收藏」

    Altium Designer 13 安装完整元件库「建议收藏」AltiumDesigner更新的非常快,都快赶上chrome了,13出来没多久14又出来了,之前一直用AD9.4,算是10之前的最后一个版本,也是很经典的一个版本。安装新版本后看到在目录结构上有些

    2022年7月4日
    44
  • 火狐浏览器怎么查看页面加载了那些js文件,那系js文件有作用

    火狐浏览器怎么查看页面加载了那些js文件,那系js文件有作用

    2021年9月19日
    128
  • java 静态变量 存储_java中,类的静态变量如果是对象,该对象将存储在内存的哪个区域?…

    java 静态变量 存储_java中,类的静态变量如果是对象,该对象将存储在内存的哪个区域?…静态变量所引用的实例位于Java堆或运行时常量池。Java字节码与Native机器码不同,字节码是运行在JVM这一平台上的,字节码在被解释的过程中,具体的执行方式因JVM的不同实现而不同,但是对于JVM来说,它的各种不同实现都必须要遵循Java虚拟机规范。JVM的运行时数据区包含以下部分:1、PC寄存器每一条Java虚拟机线程都有自己的PC寄存器,如果正在被线程执行的当前方法不是native的,那…

    2022年4月28日
    48
  • redis HSCAN命令及jedis的hscan方法[通俗易懂]

    redis HSCAN命令及jedis的hscan方法[通俗易懂]参考文档:http://doc.redisfans.com/key/scan.html@Override publicScanResultshscanToResltByVague(Stringkey,Stringpattern,Stringcursor,intpageSize){ List<Map.Entry<String,String>>result=null; List<Map.Entry<String,String&

    2025年6月17日
    4
  • react子组件向父组件传递数据_react子组件改变父组件的状态

    react子组件向父组件传递数据_react子组件改变父组件的状态本博客代码是React父组件和子组件相互传值的demo;实现封装一个折线图,折线图选择下拉框,获取下拉框点击的值并且传给父组件根据下拉框筛选的条件更新视图;效果图如下:父组件代码:代码解析:父组件Parent引用子组件Sub,传递了list组件给子组件,并且接收子组件传递给父组件的storeId;importReact,{Component}fro…

    2025年9月12日
    5
  • pycharm快速调整格式_pycharm自带python吗

    pycharm快速调整格式_pycharm自带python吗代码自动填充了空格问题在使用pycharm的代码编辑器时,常常懒得写空格,如下图,但这是不符合代码规范的,而且也会影响可读性。解决方法pycharm有自动调整代码格式的快捷键,默认为alt+ctrl+l,按下快捷键后,代码自动填充了空格。自动对齐代码问题在使用pycharm的代码编辑器时,有点时候copy的代码的没有按照代码格式对齐,如下图,但这是不符合代码规范的,而且也会影响可读性。解决方法py…

    2022年8月25日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号