【java】基于Tomcat的WebSocket转帖 + 自己理解

简介: 网址:http://redstarofsleep.iteye.com/blog/1488639 原帖时间是2012-5-8,自己书写时间是2013年6月21日10:39:06   Java代码 package lhc.

网址:http://redstarofsleep.iteye.com/blog/1488639

原帖时间是2012-5-8,自己书写时间是2013年6月21日10:39:06

 

Java代码

package lhc.websocket;
    
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
    
public class MyWebSocketServlet extends WebSocketServlet {
    
    private static final long serialVersionUID = -7178893327801338294L;
    
    @Override
    protected StreamInbound createWebSocketInbound(String arg0) {
System.out.println("##########");
        return new MyMessageInbound();
    }
    
}

这个Servlet继承自WebSocketServlet,实现createWebSocketInbound方法。该方法返回第二个类的实例。

第二个类,处理每一次具体的WebSocket任务:

package lhc.websocket;
    
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
    
import lhc.init.InitServlet;
    
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;
    
public class MyMessageInbound extends MessageInbound {
    
    @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);
            WsOutbound outbound = messageInbound.getWsOutbound();
            outbound.writeTextMessage(buffer);
            outbound.flush();
        }
            
    }
    
    @Override
    protected void onClose(int status) {
        InitServlet.getSocketList().remove(this);
        super.onClose(status);
    }
    
    @Override
    protected void onOpen(WsOutbound outbound) {
        super.onOpen(outbound);
        InitServlet.getSocketList().add(this);
    }
        
        
    
}

这个类继承自MessageInbound类,必须实现onBinaryMessage和onTextMessage方法。Jetty中只有一个onMessage方法,而Tomcat细化成了2个方法。

 

还要一个初始化的Servlet

package lhc.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 = -3163557381361759907L;
        
    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 List<MessageInbound> getSocketList() {  
        return InitServlet.socketList;  
    }  
}

最后,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_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>lhc.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>lhc.init.InitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
</web-app>

页面的话,就是标准的HTML5的websocket,这个和服务器是否是Tomcat或者Jetty是无关的:

<%@ 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/wsoc/mywebsocket.do");
    else if ('MozWebSocket' in window)
        ws = new MozWebSocket("ws://localhost:8080/wsoc/mywebsocket.do");
    else
        alert("not support");
       
       
    ws.onmessage = function(evt) {
        alert(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>
</body>
</html>

---下面讲一下楼主没有说到的地方:

 

1.相关jar包,需要去tomcat的lib目录中拷贝catalina.jar,tomcat-api.jar,tomcat-coyote.jar,tomcat-util.jar

2.如果做集群,apache支持websocket比较困难,可以采用mod_python进行尝试,目前我还在尝试中。

3.总的来说,做一个基于websocket的前台推送技术需要tomcat版本支持,还需要java中实现tomcat要求实现的功能,js中写几个方法,同时,浏览器方面,IE不支持,火狐和谷歌没有问题,移动端来说,qq浏览器支持度比较好,但是对于flash文件的前台推送,qq浏览器有一些弊端,总的来说,websocket还在发展中,让我们拭目以待。

 

 2013年6月21日10:38:25

落雨

目录
相关文章
|
1月前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
4月前
|
Java 关系型数据库 MySQL
Windows用Tomcat发布Java项目
对于云服务器,程序员一般不会陌生,如果项目需要发布到现网,那么服务器是必不可缺的一项硬性条件,那么如何在云服务器上部署一个项目,需要做哪些配置准备,下面就由本文档为大家讲解,本篇以Tomcat服务器发布J2EE项目为例。
53 0
Windows用Tomcat发布Java项目
|
3月前
|
Java 关系型数据库 应用服务中间件
阿里云RDS购买Linux完整过程——安装java环境并跑起来tomcat
阿里云RDS购买Linux完整过程——安装java环境并跑起来tomcat
50 0
|
3月前
|
JavaScript Java 应用服务中间件
centos部署vue项目(java,tomcat环境的搭建)
centos部署vue项目(java,tomcat环境的搭建)
53 0
|
2天前
|
IDE Java 应用服务中间件
JDK1.6.0+Tomcat6.0的安装配置(配置JAVA环境)
JDK1.6.0+Tomcat6.0的安装配置(配置JAVA环境)
12 1
|
18天前
|
Java Linux 应用服务中间件
Linux启动tomcat报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
Linux启动tomcat报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
14 0
|
26天前
|
Web App开发 Java 应用服务中间件
【Java Web】在 IDEA 中部署 Tomcat
【Java Web】在 IDEA 中部署 Tomcat
|
2月前
|
Java 应用服务中间件
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
266 1
|
4月前
|
JSON Java API
Java 编程问题:十三、HTTP 客户端和 WebSocket API
Java 编程问题:十三、HTTP 客户端和 WebSocket API
98 0
|
4月前
|
监控 应用服务中间件
idea debug模式启动Tomcat报错:Error running ‘tomcat8‘: java.net.SocketException “socket closed“
idea debug模式启动Tomcat报错:Error running ‘tomcat8‘: java.net.SocketException “socket closed“