tomcat7之websocket

标签: tomcat7 websocket | 发表时间:2012-09-08 09:30 | 作者:
出处:http://www.iteye.com
从tomcat7.0.26之后开始支持websocket,建议大家使用tomcat7.0.30,期间版本的接口有一些改动。chrome默认支持websocket。其他浏览器可能由于安全原因,默认是关闭的。

package com.panguso.phl.servlet;

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

import javax.servlet.annotation.WebServlet;
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 piaohailin
 * 2012-09-08
 *
 */
@WebServlet(urlPatterns = "/echo.ws")
// 处理WebSocket的Servlet需要继承自WebSocketServlet,这一点和7.0.27仍然一样
public class EchoServlet extends WebSocketServlet {
    // Log
    private Logger logger = Logger.getLogger(EchoServlet.class.getName());

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

        // 方法仍然是返回一个StreamInbound实例,这里采用实现他的子类MessageInbound
        // 只用实现下面四个事件处理函数(其实onClose和onOpen有缺省实现)
        return new MessageInbound() {
            // WebSocket关闭事件,参数status应该来自org.apache.catalina.websocket.Constants中定义的几个常量,可以参考文档或者核对一下Tomcat的源码
            @Override
            protected void onClose(int status) {
                // Log
                logger.info("Web Socket Closed: " + status);
            }

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

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

            // 有文本消息数据到达
            @Override
            protected void onTextMessage(CharBuffer buffer) throws IOException {
                // Log
                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) {
                //                        // TODO Auto-generated catch block
                //                        e.printStackTrace();
                //                    }
                //                    getWsOutbound().writeTextMessage(CharBuffer.wrap(String.valueOf(i).subSequence(0, 1)));
                //                }

            }
        };
    }
}



index.jsp
<%@ 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>Insert title here</title>
<script type="text/javascript">
	var ws = null;

	function startServer() {
		// 设定WebSocket,注意协议是ws,请求是指向对应的WebSocketServlet的
		var url = "ws://127.0.0.1:8080/echo.ws";
		// 创建WebSocket实例,下面那个MozWebSocket是Firefox的实现
		if ('WebSocket' in window) {
			ws = new WebSocket(url);
		} else if ('MozWebSocket' in window) {
			ws = new MozWebSocket(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>



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [tomcat7 websocket] 推荐:

tomcat7之websocket

- - ITeye博客
从tomcat7.0.26之后开始支持websocket,建议大家使用tomcat7.0.30,期间版本的接口有一些改动. chrome默认支持websocket. 其他浏览器可能由于安全原因,默认是关闭的. // 与7.0.27不同的,Tomcat改变了createWebSocketInbound方法的定义,增加了一个HttpServletRequest参数.

Tomcat7配置双向SSL

- - CSDN博客推荐文章
//ca-cert.pem即为CA根证书,可将其下发到客户端,导入作为根证书.  如果按请求生成CA证书,由证书申请者生成请求文件certreq.txt. CA端执行签名,生成证书文件1.cer. 4.将证书导出成浏览器支持的.p12格式,密码changeit. 4.将证书导出成浏览器支持的.p12格式 :.

tomcat7特性 serlvet async特性

- - 编程语言 - ITeye博客
每个请求来到Web容器,Web容器会为其分配一个线程来专门负责该请求,直到完成处理前,该执行线程都不会被释放回容器. 执行线程会耗用系统资源,若有些请求需要长时间处理(例如长时间运算、等待某个资源),就会长时间占用执行线程. 若这类的请求很多,许多执行线程都被长时间占用,而在web容器内,可以使用的线程都是有限的,这对于系统就会是个负担,甚至造成应用程式的性能瓶颈.

WebSocket实战

- - 新浪UED
互联网发展到现在,早已超越了原始的初衷,人类从来没有像现在这样依赖过他;也正是这种依赖,促进了互联网技术的飞速发展. 而终端设备的创新与发展,更加速了互联网的进化;. WebSocket的前世今生. 为什么使用WebSocket. 搭建WebSocket服务器. 以上六点分为两大块,前3点侧重理论,主要让大家明白WebSocket是什么,而后3点则结合代码实战,加深对WebSocket的认知.

基于Tomcat的WebSocket

- - ITeye博客
之前大概的看过WebSocket,当时Tomcat还不支持WebSocket,所以当时写了一篇基于Jetty的WebSocket实现,地址如下:. 现在Tomcat7.0.27发布了,从这个版本开始Tomcat就支持WebSocket了. Tomcat的WebSocket和Jetty的大致上差不多,大同小异,这里就简单的贴两个类吧:.

(原)CentOS_linux5.5、JDK1.6、tomcat7、nginx、mysql5.1、mongodb安…

- - Linux - 操作系统 - ITeye博客
转: http://blog.sina.com.cn/s/blog_438308750100xsb5.html. # 关闭不需要的服务按上面的安装关闭 ip6tables、jexec、kudzu、lvm2-monitor、mcstrans、netfs、rawdevices、restorecond. 2.禁止Ctrl+Alt+Delete重新启动机器命令.

【转载】认识HTML5的WebSocket

- - HTML5研究小组
在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API. WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术. 这个新的API提供了一个方法,从客户端使用简单的语法 有效地推动消息到服务器. 让我们看一看HTML5的WebSocket API:它可用于客户端、服务器端.

Tomcat7调优及JVM性能优化for Linux环境

- - 互联网 - ITeye博客
该优化针对Linux X86_X64环境. Tomcat优化其实就是对server.xml优化(开户线程池,调整http connector参数). 搜索【

Tomcat7集群共享Session 基于redis进行统一管理

- - 行业应用 - ITeye博客
      很多时候,生产环境,需要多个tomcat协作,那么session的统一管理是一个首先需要解决的问题. session的统一管理有很多解决方案,比如存储至数据库、memcache、redis. 那么我想给大家介绍的是将session存储至redis这个方案.        先要感谢开源项目 tomcat-redis-session-manager,感谢作者.

反向Ajax,第2部分:WebSocket

- KnightE - 译言-电脑/网络/数码科技
来源Reverse Ajax, Part 2: WebSockets. 时至今日,用户期待的是可通过web访问快速、动态的应用. 这一文章系列展示了如何使用反向Ajax(Reverse Ajax)技术来开发事件驱动的web应用. 系列的第1部分介绍了反向Ajax、轮询(polling)、流(streaming)、Comet和长轮询(long polling).