`
smilease
  • 浏览: 88457 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

WebSocket在tomcat7.0.29上的应用

 
阅读更多

1、什么是WebSocket

 

 

WebSocket是HTML5开始提供的一种浏览器和服务器间进行全双工通讯的网络技术。

在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

 

 

2、开发环境

eclipse-jee-indigo-SR2-win32

apache-tomcat-7.0.29

tomcat从7.0.27开始支持WebSocket,目前最新版(截至2012.8.17)是7.0.29,相对7.0.27有改进

3、开发步骤

      3.1 创建 Dynamic Web Project,Target runtime 选择 apache-tomcat-7.0.29

3.2 创建一个servlet来响应WebSocket的请求

 

package websocket;

import javax.servlet.http.HttpServletRequest;

import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;

/**
 * 
 * @author allan_he
 *这个Servlet继承自WebSocketServlet,实现createWebSocketInbound方法
 */
public class MyWebSocketServlet extends WebSocketServlet {

	private static final long serialVersionUID = 7648892814938958971L;
	
	/**
	 * 这是tomcat7.0.27的写法
	@Override
	protected StreamInbound createWebSocketInbound(String arg0) {
		System.out.println("#########################################");
		return new MyMessageInbound();
	}
	*/
	
	/**
	 * 这是tomcat7.0.29的写法, 与7.0.27不同的,Tomcat改变了createWebSocketInbound方法的定义,
	 * 增加了一个HttpServletRequest参数, 这样我们也可以从request参数中获取更多请求方的信息
	 * 返回一个自定义的MyMessageInbound,它继承自MessageInbound
	 * MessageInbound是StreamInbound的子类
	 * */
	@Override
	protected StreamInbound createWebSocketInbound(String arg0,
			HttpServletRequest arg1) {
		System.out.println("#########################################");
		return new MyMessageInbound();
	}

}
3.3 创建MessageInbound的子类,用于处理每一次WebSocket任务
package websocket;

import init.InitServlet;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;
/**
 * @author allan_he
 *用于处理每一次WebSocket任务
 *需要实现四个事件处理函数,其中onOpen和onClose有默认实现
 */
public class MyMessageInbound extends MessageInbound {

	/**
	 *  有二进制消息数据到达,暂时没研究出这个函数什么情况下触发,
	 *  js的WebSocket按理说应该只能send文本信息才对
	 */
	@Override
	protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
		// TODO Auto-generated method stub
		
	}

	// 有文本消息数据到达
	@Override
	protected void onTextMessage(CharBuffer msg) throws IOException {
		for (MessageInbound messageInbound : InitServlet.getSocketList()) {
			CharBuffer buffer = CharBuffer.wrap(msg);
			// getWsOutbound可以返回当前的WsOutbound,通过他向客户端回传数据,这里采用的是nio的CharBuffer
			WsOutbound outbound = messageInbound.getWsOutbound();
			outbound.writeTextMessage(buffer);
			outbound.flush();
		}
	}

	/**
	 *  WebSocket关闭事件,参数status应该来自org.apache.catalina.websocket.Constants中定义的几个常量,
	 *  可以参考文档或者核对一下Tomcat的源码
	 */
	@Override
	protected void onClose(int status) {
		InitServlet.getSocketList().remove(this);
		super.onClose(status);
	}
	
	// WebSocket握手完成,创建完毕,WsOutbound用于向客户端发送数据
	@Override
	protected void onOpen(WsOutbound outbound) {
		super.onOpen(outbound);
		InitServlet.getSocketList().add(this);
	}
		

}
  3.4 创建用于初始化的servlet
package init;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.catalina.websocket.MessageInbound;

public class InitServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5218126862760826639L;
	
	private static List<MessageInbound> socketList;  
    
    public void init(ServletConfig config) throws ServletException {  
        InitServlet.socketList = new ArrayList<MessageInbound>();  
        super.init(config);  
        System.out.println("Server start============");  
    }  
      
    public static synchronized List<MessageInbound> getSocketList() {  
        return InitServlet.socketList;  
    }  

}
  3.5配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>wsoc</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>mywebsocket</servlet-name>
  	<servlet-class>websocket.MyWebSocketServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>mywebsocket</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>initServlet</servlet-name>
  	<servlet-class>init.InitServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
</web-app>
  3.6 创建测试页面,注意路径要正确,否则连接不上
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index</title>
<script type="text/javascript">
var ws = null;
function startWebSocket() {
	if ('WebSocket' in window){
		ws = new WebSocket("ws://localhost:8080/html5WebSocket/mywebsocket.do");
	}
		
	else if ('MozWebSocket' in window)
		ws = new MozWebSocket("ws://localhost:8080/html5WebSocket/mywebsocket.do");
	else
		alert("not support");
	
	
	ws.onmessage = function(evt) {
		//alert(evt.data);
		document.getElementById('chatMessage').innerHTML=evt.data;
	};
	
	ws.onclose = function(evt) {
		alert("close");
	};
	
	ws.onopen = function(evt) {
		alert("open");
	};
}

function sendMsg() {
	ws.send(document.getElementById('writeMsg').value);
}
</script>
</head>
<body onload="startWebSocket();">
<input type="text" id="writeMsg"></input>
<input type="button" value="send" onclick="sendMsg()"></input>
<div id="chatMessage"></div>
</body>
</html>
 
分享到:
评论
2 楼 onedayliu 2012-12-14  
请问LZ,为什么我运行不成功的?
description The requested resource (/html5WebSocket/index.jsp) is not available.
1 楼 yangf2008 2012-09-19  
测试通过,感谢分享

相关推荐

    websocket+tomcat+jetty+netty

    在WebSocket技术的应用中,Tomcat自4.0版本开始支持WebSocket规范,提供了`org.apache.tomcat.websocket`包来帮助开发者创建WebSocket服务端程序。 Jetty是一个轻量级、高性能的HTTP服务器和Servlet容器,同样也...

    Tomcat WebSocket

    在Tomcat中,为了启用WebSocket,开发者需要在服务器配置中加入相应的WebSocket支持,然后在应用代码中创建WebSocket服务器端点(通常通过实现`javax.websocket.Endpoint`或其子类)。 以下是一些关键的WebSocket...

    支持websocket的tomcat

    支持websocket的tomcat

    Java后端WebSocket的Tomcat实现.docx

    因此,如果你打算在Tomcat上部署WebSocket应用,确保你的Tomcat版本在7.0.47以上。 为了在Tomcat上实现WebSocket,你需要以下步骤: 1. **配置项目**:首先创建一个JavaWeb测试项目,然后在`pom.xml`中添加对`...

    Java后端WebSocket的Tomcat实现

    在Java后端,WebSocket的实现通常涉及到多种技术和库,其中Tomcat作为流行的Java应用服务器,提供了对WebSocket的支持。本篇文章将深入探讨如何在Tomcat环境中实现WebSocket。 首先,我们需要了解WebSocket的基本...

    websocket+tomcat+java环境部署和实现.doc

    在本文档中,我们将讨论如何在Java环境中,结合Tomcat服务器和WebSocket技术进行应用部署与实现。 首先,你需要确保拥有一个支持WebSocket的Tomcat服务器。在这个例子中,推荐使用Tomcat 7.0.43或更高版本,因为...

    websocket+tomcat7

    在“websocket+tomcat7”的场景下,我们将探讨如何利用WebSocket技术在Tomcat 7服务器上构建一个实时的聊天室应用。首先,我们需要确保我们的开发环境已经安装了JDK 1.7,因为WebSocket在Java中的一些API是在Java 7...

    phonegap+websocket+tomcat实现推送功能

    为了保证推送的稳定,开发者需要在应用中添加网络状态监听,以便在网络恢复时重新建立WebSocket连接。 在项目实施过程中,可能会遇到一些常见问题,例如跨域限制、安全问题(WebSocket需要在HTTPS环境下运行)、...

    支持websocket的tomcat 64 bit

    在这个“支持WebSocket的Tomcat 64 bit”主题中,我们主要关注的是Tomcat如何在64位操作系统上支持WebSocket协议。64位版本的Tomcat通常比32位版本在处理大数据量和多线程时性能更优,因为64位系统可以处理更大的...

    jsp WebSocket+Tomcat8实现真●Web版即时聊天室(单人+多人)

    jsp WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人),传统的web配置方式,方便移植到自己的系统里,功能包括单人聊天(点对点的推送),多人广播,大家有兴趣还可以自己扩展 这里是tomcat8基于注解的方式实现,...

    Java后端WebSocket的Tomcat实现-动力节

    总的来说,Java后端在Tomcat上实现WebSocket涉及到的主要步骤包括:了解WebSocket协议,使用JSR 356创建WebSocket服务器端点,配置Tomcat以支持WebSocket,以及编写客户端代码与服务器交互。在实际应用中,还需要...

    基于WebSocket+Tomcat7+HTML5的消息推送.zip

    Tomcat7是一个流行的开源Java Servlet容器,它可以运行基于Java的Web应用程序,包括WebSocket服务。 WebSocket API在HTML5规范中被引入,为Web开发者提供了一种在浏览器和服务器之间建立长连接的方法,从而实现实时...

    HTML5 WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人).zip

    HTML5 WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人).zip HTML5 WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人).zip HTML5 WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人).zip ...

    Tomcat9.0使用WebSocket实现点对点之间的聊天Demo

    WebSocket是HTML5引入的一种在单个TCP连接上进行全双工通信的协议,极大地改进了浏览器与服务器的数据传输效率,特别适用于实时性要求高的应用场景,如在线聊天、游戏、股票交易等。本教程将通过Tomcat 9.0来演示...

    tomcat8.5 jsp servlet WebSocket等api文档

    在Tomcat 8.5中,WebSocket API与JSR 356兼容,为实时应用如聊天室、游戏、股票报价等提供了强大支持。 在"tomcatall"这个压缩包中,你将找到这些技术的详细文档,包括类库、接口、方法和属性的说明,以及示例代码...

    WebSocket的Java和Tomcat7使用示例

    1. **部署**:将项目部署到Tomcat 7服务器上。确保Tomcat版本至少为7.0.47。 2. **环境兼容性**:上述示例在多种环境中进行了测试,包括JDK 7+Tomcat 7.0.47/7.0.52/8.0.3和JDK 7+Glassfish 4等。 3. **注意事项**:...

    HTML5 WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人)

    部署在Tomcat上的WebSocket应用需要配置web.xml文件,声明Servlet和WebSocket端点。同时,确保Tomcat版本支持WebSocket,因为较早版本可能不包含WebSocket API。 在实际应用中,你可能还需要考虑安全性、负载均衡、...

    Tomcat7.0下实现的websocket 代码

    WebSocket是HTML5中引入的一种在单个TCP连接上进行全双工通信的协议,它为浏览器和服务器之间提供了低延迟、高效率的数据传输方式。在本主题中,我们将深入探讨如何在Tomcat 7.0版本中实现WebSocket,以及相关的源码...

    spring4 websocket+tomcat8

    此次主要了解,整合的是spring websocket。在最开始的时候,碰到挺多问题的,不是连接错误就是一直连接不成功。整的我的小心脏都受不了,蛋疼。百度,谷歌一大堆demo,整到工程里能跑起来,但是就是连接不成功,放弃...

Global site tag (gtag.js) - Google Analytics