`
Tyrion
  • 浏览: 260952 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Tomcat7、Chrome下web socket的一个例子

    博客分类:
  • Java
阅读更多

先介绍一下背景吧:最近看javaEE7中可能发布的JSR规范,偶然看到JSR356,是关于web socket的,当时觉得奇怪,心说socket这几年又出了什么新东西出来了?早上了解了一下,原来也是HTML5里面的,Google工程师的这段话还是挺有吸引力的“数据的字节数急剧减少到2字节,延迟从150毫秒减少到50毫秒,实际上,这两个因素已经足以引起Google的兴趣了。通过在一个浏览器中模拟全双工连接,HTML 5 Web Socket对Web通信带来了显著的改善。”而目前一般的实时Web程序是通过Ajax轮询服务器的方式来实现的,其缺点显而易见,定时发送请求导致网络上的大量无意义数据,而且不断的连接将大量消耗服务器资源。

而Web Socket相比较的优点是:1,服务器与客户端之间交换的标头信息很小,大概只有2字节(早期版本)。2,服务器可以主动传送数据给客户端(比现有的客户端不断轮询方式好太多了)。

 

这概念看起来是真不错,好吧,其它废话就不多说了。上例子。

我的web服务器是从Apache tomcat网站上下载的apache-tomcat-7.0.40,浏览器用的最新的Chrome(26.0.1410.64 m)。

 

在Eclipse里建一个Dynamic Web Project,后台写一个继承自WebSocketServlet的Servlet

package org.study.webSocket;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.logging.Logger;

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;

/**
 * @author niwei
 * 
 */
// 处理WebSocket的Servlet需要继承自WebSocketServlet
public class EchoServlet extends WebSocketServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -328927602003370849L;

	// Log
	private Logger logger = Logger.getLogger(EchoServlet.class.getName());

	@Override
	/**
	 * 与7.0.27不同的,Tomcat改变了createWebSocketInbound方法的定义,增加了一个HttpServletRequest参数,
	 * 这样我们也可以从request参数中获取更多请求方的信息 
	 * 
	 */
	protected StreamInbound createWebSocketInbound(String subProtocol,
			HttpServletRequest request) {
		logger.info("request ws servlet");

		/**
		 * 方法仍然是返回一个StreamInbound实例,这里采用实现他的子类MessageInbound
		 * 只用实现下面四个事件处理函数(其实onClose和onOpen有缺省实现)
		 */
		return new MessageInbound() {

			// WebSocket关闭事件,参数status应该来自org.apache.catalina.websocket.Constants中定义常量
			@Override
			protected void onClose(int status) {
				logger.info("Web Socket Closed: " + status);
			}

			// WebSocket握手完成,创建完毕,WsOutbound用于向客户端发送数据
			@Override
			protected void onOpen(WsOutbound outbound) {
				logger.info("Web Socket Open!");
			}

			// 有二进制消息数据到达,暂时没研究出这个函数什么情况下触发,js的WebSocket按理说应该只能send文本信息才对
			@Override
			protected void onBinaryMessage(ByteBuffer buffer)
					throws IOException {
				logger.info("Binary Message Receive: " + buffer.remaining());
			}

			// 有文本消息数据到达
			@Override
			protected void onTextMessage(CharBuffer buffer) throws IOException {
				logger.info("Text Message Receive: " + buffer.remaining());
				// getWsOutbound可以返回当前的WsOutbound,通过他向客户端回传数据,这里采用的是nio的CharBuffer
				getWsOutbound().writeTextMessage(buffer);

				// 模拟服务器通知浏览器,从浏览器就会看,每3秒收到1条服务器消息
				for (int i = 0; i < 3; i++) {
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					getWsOutbound().writeTextMessage(
							CharBuffer
									.wrap(String.valueOf(Math.random())));
				}

			}
		};
	}

}

在web.xml里面配置一下该servlet

<?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_2_5.xsd"
	id="WebApp_ID" version="2.5">
	
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	
	<servlet>
		<servlet-class>org.study.webSocket.EchoServlet</servlet-class>
		<servlet-name>EchoServlet</servlet-name>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>EchoServlet</servlet-name>
		<url-pattern>/EchoServlet</url-pattern>
	</servlet-mapping>
</web-app>

客户端访问的代码直接写在项目的欢迎页里:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>web socket example</title>
<script type="text/javascript">  
    var ws = null;
    
    function startServer() {
        // 设定WebSocket,注意协议是ws,请求是指向对应的WebSocketServlet的,
        // localhost:8080/web-socket是你实际web项目发布的地址,
        // 后面的/EchoServlet是在上面web.xml里配置的servlet访问的url
        var url = "ws://localhost:8080/web-socket/EchoServlet"; 
        // 创建WebSocket实例,chrome浏览器使用
        if ('WebSocket' in window) {
            ws = new WebSocket(url);
        } else {
            alert('Unsupported.');
            return;
        }
        
        // WebSocket握手完成,连接成功的回调
        // 有个疑问,按理说new WebSocket的时候就会开始连接了,如果在设置onopen以前连接成功,是否还会触发这个回调
        ws.onopen = function() {
            alert('Opened!');
        };
        
        // 收到服务器发送的文本消息, event.data表示文本内容
        ws.onmessage = function(event) {
            alert('Receive message: ' + event.data);
        };
        
        // 关闭WebSocket的回调  
        ws.onclose = function() {
            alert('Closed!');
        };
    }
    
    function sendMyMessage() {
        var textMessage = document.getElementById('textMessage').value;
        
        if (ws != null && textMessage != '') {
            // 通过WebSocket想向服务器发送一个文本信息
            ws.send(textMessage);
        }
    }
</script>
</head>
<body>
<body onload="startServer()">
	<input type="text" id="textMessage" size="20" />
	<input type="button" onclick="sendMyMessage()" value="Send">
</body>
</html>

 关于代码的要说明的东西在注释里,不再赘述了。

直接访问项目路径即可。

 

项目源代码在附近里面。

1
0
分享到:
评论
4 楼 Tyrion 2013-08-30  
zidafone 写道
大多数都是轮询定时发送请求?可以长连接的呀?

呵呵,你所说的长连接很多也是通过长轮询的方式来模拟出这种效果,这种方案有一缺陷是只是半双工通信,而Web Socket支持全双工。
当然本文的目的只是介绍一下Web Socket,并用一个例子演示一下而已。
3 楼 zidafone 2013-08-30  
大多数都是轮询定时发送请求?可以长连接的呀?
2 楼 Tyrion 2013-05-14  
MrLee23 写道
Java EE 7 去哪下载?oracle上没有java ee 7的下载连接啊?

早着呢,目前Java EE7还只是发布了部分规范而已,离实现还远着呢,目前最新的可用Java EE版本是6
1 楼 MrLee23 2013-05-14  
Java EE 7 去哪下载?oracle上没有java ee 7的下载连接啊?

相关推荐

    Tomcat7部署多个Web项目的方法-有图有真相

    根据提供的文件信息,下面详细介绍在Tomcat7上部署多个Web项目的方法,这些知识点包括了配置文件的编辑、部署路径的管理以及特定开发环境下的项目结构调整。 首先,Tomcat作为一个应用服务器,用于托管Java Web应用...

    tomcat 分配请求之——socket获取请求

    标题“Tomcat分配请求之——Socket获取请求”主要涉及的是Tomcat服务器在处理HTTP请求时的核心机制。在Web服务器中,Tomcat是一个...这个过程是Tomcat服务器核心功能的一部分,对于理解和优化Web应用的性能至关重要。

    tomcat 7到9 版本

    这里提到的资源包含了Tomcat 7、8、8.5和9四个主要版本,这些版本都是为Java Web开发者准备的,特别是针对Eclipse集成开发环境的使用者。 Tomcat 7是Apache Tomcat的一个重要版本,它支持Java EE 6规范,包括...

    Tomcat与Java_Web开发技术详解3.pdf

    综上所述,《Tomcat与Java Web开发技术详解》这本书不仅全面覆盖了Tomcat的基本使用方法,还深入探讨了Java Web开发中的高级技术,对于希望深入了解Tomcat及其在Java Web开发中应用的读者来说,是一本非常有价值的...

    linux64_tomcat7

    标题中的"linux64_tomcat7"暗示了这是一个适用于64位Linux操作系统的Tomcat 7版本。Linux操作系统以其稳定性和安全性而受到广大服务器管理员的青睐,64位系统则能够更好地支持内存资源的使用,这对于处理大型Java...

    web监听端口(Socket服务随web启动而启动)

    本文将详细解析"web监听端口(Socket服务随web启动而启动)"这一主题,涵盖Socket、Tomcat服务器以及Web服务的监听端口设置。 首先,让我们了解Socket。Socket是计算机网络中的一个概念,它提供了一种进程间通信(IPC...

    tomcat7,tomcat8,tomcat9

    Tomcat7、Tomcat8和Tomcat9是不同版本的Tomcat,每个版本都有其特性和改进。 **Tomcat7**: Tomcat7是2011年发布的,它主要支持Java Servlet 3.0和JSP 2.2规范。这个版本引入了一些重要改进,包括增强的安全性、更...

    flex+java+tomcat实现socket通信及安全策略

    本例子是本人参考网上的例子,重新整理和修改的例子,非常简单和具有针对性****/ 1.背景:Flex Socket通信及安全策略,使用flex实现客户端,java实现服务端; 2.重点解决安全策略问题:将flash发布为html格式后,...

    tomcat 7 和 tomcat 8

    Tomcat 7 和 Tomcat 8 是两个非常重要的版本,它们是Apache软件基金会开发的开源Java Servlet容器,主要用于运行Java Web应用程序。这两个版本都遵循Java EE(Enterprise Edition)规范,但各自具有不同的特点和改进...

    内嵌式tomcat启动web工程

    在本教程中,我们将深入探讨如何使用Maven来配置和启动一个内嵌式的Tomcat服务器,以便运行Web工程。 首先,我们需要在项目中添加Tomcat内嵌库。在Maven的`pom.xml`文件中,我们需要引入`tomcat7-maven-plugin`或`...

    迷你版的Tomcat,socket原理

    服务器端的Tomcat监听这个端口,一旦有连接请求,它就会创建一个Socket实例来处理这个连接。 在迷你版的Tomcat中,`ServerSocket`类用于监听客户端的连接请求。`ServerSocket`创建一个监听套接字,并在指定端口等待...

    Tomcat6.0 web服务器

    举个例子,如果我们想部署一个名叫MyWebApp.war的应用,该应用使用realm作为访问控制方式,我们可以使用下面这个片断: &lt;!-- Context fragment for deploying MyWebApp.war --&gt; “/demo” docBase=“webapps/...

    tomcat 7 最新版本 apache-tomcat-7.0.109

    Apache Tomcat 7是Apache软件基金会的一个开源项目,专门用于实现Java Servlet和JavaServer Pages(JSP)技术的标准,以及Java EE的Web应用程序部署。这个最新版本,即7.0.109,包含了对先前版本的改进和修复,旨在...

    Tomcat与Java.Web开发技术详解(PDF)

    1. **Tomcat介绍**:Tomcat是Apache软件基金会的Jakarta项目下的一个开源Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是Java Web应用最常用的运行环境之一。Tomcat以其轻量级、...

    Tomcat 与Java web开发技术详解(孙卫琴)

    由于Java Web技术是SUN公司在Java Servlet规范中提出的通用技术,因此本书讲解的Java Web应用例子可以运行在任何一个实现了SUN的Servlet规范的Java Web服务器上。随书附赠光盘的内容为本书范例的源程序,以及本书...

    模仿tomcat的国产开源web服务器

    JerryMouse是一个基于Java开发的国产开源Web服务器,它的设计灵感来源于知名的Apache Tomcat服务器。Tomcat作为Java Servlet和JavaServer Pages(JSP)技术的标准实现,是许多开发者进行Java Web应用部署的首选。而...

    tomcat7安装使用及jvm连接数参数调优

    Tomcat7 是一个流行的 Java Web 服务器,主要用于部署和管理基于 Java 的 Web 应用程序。为了确保 Tomcat7 的稳定运行和高效性能,需要对其进行合理的安装、配置和优化。下面我们将介绍 Tomcat7 的安装使用及 JVM ...

    Tomcat与java.web开发技术详解

    Tomcat与java.web开发技术详解,介绍了Tomcat javabean jsp等技术的使用

Global site tag (gtag.js) - Google Analytics