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

WEB开发服务器推送技术-tomcat7之websocket

 
阅读更多
从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>

5
0
分享到:
评论
9 楼 allan_chan 2013-11-08  
cqcya 写道
我在本机能够访问,但是从别的机器上访问总提示“closed",不知道是什么原因?

有没有连到你的服务器
8 楼 yanjingjiangjun 2013-06-28  
html5  blob文件发送会用到onBinaryMessage
7 楼 cqcya 2013-05-20  
我在本机能够访问,但是从别的机器上访问总提示“closed",不知道是什么原因?
6 楼 netkiller.github.com 2012-09-14  
xiaozan 写道
请问,这个技术在应用方面可以做哪些功能


即时通信,聊天室,信息通知,等等

例如:可以实现XAMPP做即时通信,直接操作POP,SMTP实现web收发邮件。无需服务端程序介入
5 楼 wukele 2012-09-08  
怎么实现,推送到指定的客户端
4 楼 hebdan 2012-09-08  
跟DWR的 reverse ajax 有何区别?
3 楼 fffddd 2012-09-08  
安全没有看到有安全相关的验证。随便谁都可以连到你的ws上来?
还有每个账号和每个WS连的关系也没看到。怎么区分发给A用户的信息不会发到B哪里去?
2 楼 85977328 2012-09-08  
xiaozan 写道
请问,这个技术在应用方面可以做哪些功能

WEB开发中,服务器端推送消息
1 楼 xiaozan 2012-09-08  
请问,这个技术在应用方面可以做哪些功能

相关推荐

    comet4j-tomcat6.jar和comet4j-tomcat7.jar和comet4j.js

    4. 在Web应用的HTML页面中引入"comet4j.js",设置客户端的监听器,以便接收服务器推送的数据。 5. 测试和优化应用程序,确保其在不同网络环境和浏览器下的兼容性和性能。 通过这种方式,Comet4j为开发者提供了一种...

    comet4j.js+comet4j-tomcat7jar包资源

    启动Tomcat服务器,访问你的Web应用,确保客户端能够成功建立连接并接收到服务器推送的数据。使用浏览器的开发者工具来检查网络请求和响应,以及可能出现的错误。 总结来说,Comet4J.js和comet4j-tomcat7.jar是...

    comet4j-tomcat7.jar和comen4j.js

    虽然Comet4J-tomcat7.jar不支持Tomcat8及以上版本,但可以考虑使用其他服务器推送技术,如WebSocket,它已被现代浏览器广泛支持,并且有更丰富的库和工具。 通过理解这些关键概念和步骤,你可以有效地在Tomcat7...

    websocket日志实时推送

    WebSocket日志实时推送技术在现代Web应用中扮演着重要角色,尤其对于监控、故障排查以及实时数据分析至关重要。本文将深入探讨WebSocket协议、Linux的`tail -f`命令、Java编程在实现这一功能中的应用,以及如何整合...

    atmosphere-runtime-0.7-for-tomcat7.jar.zip

    Atmosphere框架的核心概念之一是Comet,这是一种用于实现服务器向客户端推送数据的技术。在Atmosphere框架中,它通过异步处理HTTP请求来实现,允许服务器在请求保持打开状态的同时处理多个事件,而无需客户端不断地...

    apache-tomcat-8.5.31-64位

    Servlet 4.0引入了对HTTP/2的支持,提高了Web应用的性能,允许服务器推送内容,减少了网络延迟。 3. **WebSocket规范**:除了Servlet,Tomcat 8.5.x还支持WebSocket 1.1规范,这是一个双向通信协议,使得浏览器和...

    服务器推送技术之comet4j资源包

    服务器推送技术是现代Web开发中一个重要的概念,它允许服务器主动向客户端发送数据,而不仅仅是响应客户端的请求。Comet4j就是一种基于Java实现的服务器推送技术框架,旨在简化实时Web应用的开发过程。本资源包包含...

    webSocket 后端向前端推送消息

    WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在任意方向...了解并掌握WebSocket的基本概念、工作流程以及编程接口,对于现代Web开发人员来说是必不可少的技能之一。

    apache-tomcat-9.0.0

    Servlet 4.0带来了诸如HTTP/2协议的原生支持,使得应用程序可以利用HTTP/2的优势,如多路复用、头部压缩和服务器推送等,提高性能和响应速度。 2. **HTTP/2**:Tomcat 9.0.0.M13实现了HTTP/2协议,允许更高效的网络...

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

    这个"基于WebSocket+Tomcat7+HTML5的消息推送.zip"项目,显然旨在教你如何利用WebSocket、Tomcat7服务器和HTML5技术实现实时的消息推送功能。Tomcat7是一个流行的开源Java Servlet容器,它可以运行基于Java的Web应用...

    JAVA整合WebSocket实现服务器消息推送项目源码

    WebSocket是Web应用中实现双向通信的关键技术,它允许服务器主动向客户端推送数据,极大地提高了实时性。本项目源码展示了如何使用Java进行WebSocket的整合,从而实现服务器消息推送功能。以下将详细介绍WebSocket的...

    phonegap+websocket+tomcat实现推送功能

    总的来说,"phonegap+websocket+tomcat实现移动终端推送功能"项目涉及到的技术栈包括前端的PhoneGap应用开发、WebSocket的JavaScript客户端实现、后端的Tomcat服务器配置以及WebSocket的Java服务端编程。通过这一...

    apache-tomcat-8.5.61

    1. **Servlet 4.0支持**:Tomcat 8.5引入了对Servlet 4.0规范的支持,带来了HTTP/2协议的原生支持,这使得Web应用程序能够利用多路复用、服务器推送等特性,从而提高性能和响应速度。 2. **NIO2连接器**:除了传统...

    tomcat实现推送技术

    【标题】:“Tomcat实现推...以上内容详细介绍了在Tomcat中实现推送技术的基本原理、常用方法、配置步骤以及示例代码,希望对你理解服务器推送有帮助。实际应用中,还需要考虑如负载均衡、安全性、性能优化等更多因素。

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

    WebSocket是HTML5中引入的一种在单个TCP连接上进行全双工通信的协议,它允许服务器端主动向客户端推送数据,极大地改善了实时性。在本文档中,我们将讨论如何在Java环境中,结合Tomcat服务器和WebSocket技术进行应用...

    apache-tomcat-7.0.42

    此外,Tomcat 7.0.42引入了对WebSocket的支持,这是一个在HTML5中引入的新特性,允许双向通信,使得服务器可以主动向客户端推送数据。 在安全方面,Tomcat 7.0.42增强了安全管理,支持JAAS(Java Authentication ...

    spring+websocketdemo

    WebSocket是Web交互技术的一种革新,它为实时双向通信提供了标准协议。在传统的HTTP协议中,客户端与服务器之间的通信是请求-响应...在实际项目中,这种技术可以应用于在线聊天、股票实时推送、游戏同步等多种场景。

    Spring Boot 整合 Netty + WebSocket 实时消息推送

    WebSocket是Web应用中实现双向通信的关键技术,它允许服务器与客户端之间进行持续的连接,而不仅仅是HTTP请求-响应模式。Spring Boot是Java生态系统中的一个流行框架,用于快速开发微服务和Web应用。Netty则是一个高...

    tomcat7.0.42 下部署websocket需要替换的包

    总的来说,通过替换这些特定的Tomcat库,你可以使你的服务器环境准备好支持WebSocket通信,从而开启更高效、实时的Web应用程序开发。但请注意,这样做可能会影响其他非WebSocket相关的应用,所以在生产环境中操作前...

    websocket、catalina和javax.websocket-api-1.0 jar

    在实际开发中,WebSocket可以应用于多种实时交互场景,如在线聊天、股票交易更新、游戏同步、实时推送通知等。使用WebSocket,开发者可以构建低延迟、高效率的实时Web应用程序。 总结来说,WebSocket提供了高效、...

Global site tag (gtag.js) - Google Analytics