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>
分享到:
相关推荐
websocket+tomcat+jetty+netty
支持websocket的tomcat
Java后端WebSocket的Tomcat实现的简要说明,可以参考一下
本文档主要讲述的是Java后端WebSocket的Tomcat实现;随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,...
Tomcat利用webSocket建立常连接 jar包
文档部分摘录:下载myeclipse10以上版本(支持tomcat7.x的),最好是myeclipse 2014同时支持javaee7(从javaee7起支持websocket)的。这里测试用的是myeclipse10(没有javaee7).如果是myclipse10需要下载javaee7的包。 ...
支持websocket的tomcat 64 bit
jsp WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人),传统的web配置方式,方便移植到自己的系统里,功能包括单人聊天(点对点的推送),多人广播,大家有兴趣还可以自己扩展 这里是tomcat8基于注解的方式实现,...
phonegap+websocket+tomcat实现移动终端推送功能 ,android版
HTML5 WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人).zip HTML5 WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人).zip HTML5 WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人).zip ...
html5+tomcat7+jdk1.7搭建的 websocket聊天室。
Java后端WebSocket的Tomcat实现__动力节点共6页.pdf.zip
此次主要了解,整合的是spring websocket。在最开始的时候,碰到挺多问题的,不是连接错误就是一直连接不成功。整的我的小心脏都受不了,蛋疼。百度,谷歌一大堆demo,整到工程里能跑起来,但是就是连接不成功,放弃...
tomcat-embed-websocket-8.0.35.jar,经过测试,可以使用。
java tomcat 7.0.42 websocket可使用java tomcat 7.0.42 websocket可使用java tomcat 7.0.42 websocket可使用java tomcat 7.0.42 websocket可使用
tomcat8.5 jsp servlet WebSocket等api文档涵盖了整个 Javaweb开发中所需文档内容。
HTML5 WebSocket+Tomcat实现真●Web版即时聊天室(单人+多人),传统的web配置方式,方便移植到自己的系统里,功能包括单人聊天(点对点的推送),多人广播,大家有兴趣还可以自己扩展
tomcat8真正支持jsr-356(包含对websocket的支持), tomcat7部分版本的websocket实现不兼容jsr-356。 需要注意websocket与浏览器的兼容问题,有些早期版本的浏览器支持旧版本的websocket协议,可能会与新版本的...
Web项目的前后端WebSocket的Java和Tomcat7的使用示例,可以参考本样例来实现WebSocket技术的Web前后台的技术。
一个可以正常运行的websocket案例,初学者学习用吧, 由于websocket是在Tomcat7.0.27版本添加的,所以打包在tomcat中运行的时候,注意要删除tomcat中包含的自身jar包才能正常运行