Tomcat和Jetty对WebSocket的支持
公司项目须要,了解了下眼下几种支持WebSocket的框架。曾经用jWebSocket做过一些项目。相对来说。改jWebSocket的源代码略复杂,也不是一天两天能搞定的。
一调研才发现,如今非常多主流的web框架都已经開始支持WebSocket了,不得不感慨时间太快,科技进步太快,在微策略的几年真的荒废了。不多说,先记录下今天的研究。
Tomcat:
J2EE以下用的最多的容器应该就是tomcat了。说到tomcat对WebSocket的支持,不得不先提一下,眼下的WebSocket协议已经经过了好几代的演变。不同浏览器对此协议的支持程度也不同。因此,假设作为server。最理想的是支持尽可能多的WebSocket协议版本号。
tomcat8真正支持jsr-356(包括对websocket的支持)。 tomcat7支持部分版本号的websocket实现不兼容jsr-356。因此,能用tomcat8的话,还是尽量用。
代码实现相当简单,下面是一个列子,仅仅须要tomcat8的基本库,不须要其它依赖。
import java.io.IOException;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/websocket")
public class WebSocketTest { @OnMessage public void onMessage(String message, Session session) throws IOException, InterruptedException { // Print the client message for testing purposes System.out.println("Received: " + message); // Send the first message to the client session.getBasicRemote().sendText("This is the first server message"); // Send 3 messages to the client every 5 seconds int sentMessages = 0; while (sentMessages < 3) { Thread.sleep(5000); session.getBasicRemote().sendText("This is an intermediate server message. Count: " + sentMessages); sentMessages++; } // Send a final message to the client session.getBasicRemote().sendText("This is the last server message"); } @OnOpen public void onOpen() { System.out.println("Client connected"); } @OnClose public void onClose() { System.out.println("Connection closed"); }
}
Jetty:
Jetty和Tomcat一样,也是一个Servlet的容器。假设说不同之处,那么最大的不同应该是Tomcat採用的是BIO处理方式,也就是说一个request会用一个线程去处理,即使是WebSocket这样的长连接,也是会独立开一个线程。
作为一个普通的Webserver,tomcat能够轻松应对耗时比較短的Request/Response。可是假设换成是长连接的WebSocket。那麻烦就来了,对于上万用户的聊天和推送,总不能开上万个线程去处理吧。此时,Jetty的性能就体现出来了。Jetty採用的是NIO,一个线程能够处理多个WebSocket的长链接,假设你的需求是大量耗时比較长的request或者大量长连接,那么建议採用Jetty。
Jetty对WebSocket的实现有点绕,Servlet不再是继承原来的HttpServlet。而是继承WebSocketServlet。此处要注意导入jetty-util.jar和jetty-websocket.jar两个包,否则可能会有class not found错误。
ReverseAjaxServlet.java:
import java.io.IOException;
import java.util.Date;
import java.util.Random;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.codehaus.jettison.json.JSONArray;
import org.eclipse.jetty.websocket.WebSocket;
import org.eclipse.jetty.websocket.WebSocketServlet;/*** @author Mathieu Carbou (mathieu.carbou@gmail.com)*/
public final class ReverseAjaxServlet extends WebSocketServlet {private final Endpoints endpoints = new Endpoints();private final Random random = new Random();private final Thread generator = new Thread("Event generator") {@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(random.nextInt(5000));endpoints.broadcast(new JSONArray().put("At " + new Date()).toString());} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}};@Overridepublic void init() throws ServletException {super.init();generator.start();}@Overridepublic void destroy() {generator.interrupt();super.destroy();}@Overridepublic WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {return endpoints.newEndpoint();}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.getWriter().write("11111");}
}
Endpoints.java:
package com.cn.test.chapter2.websocket;import org.eclipse.jetty.websocket.WebSocket;import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;/*** @author Mathieu Carbou (mathieu.carbou@gmail.com)*/
final class Endpoints {private final Queue<Endpoint> endpoints = new ConcurrentLinkedQueue<Endpoint>();void broadcast(String data) {
// for (Endpoint endpoint : endpoints) {
// endpoint.onMessage(data);
// }}void offer(Endpoint endpoint) {endpoints.offer(endpoint);}void remove(Endpoint endpoint) {endpoints.remove(endpoint);}public WebSocket newEndpoint() {return new Endpoint(this);}
}
Endpoint.java
import java.io.IOException;
import java.util.concurrent.ConcurrentLinkedQueue;import org.codehaus.jettison.json.JSONArray;
import org.eclipse.jetty.websocket.WebSocket;/*** @author Mathieu Carbou (mathieu.carbou@gmail.com)*/
class Endpoint implements WebSocket.OnTextMessage {protected Connection _connection;private Endpoints endpoints;private static int clientCounter = 0;private int clientId = clientCounter++;public Endpoint(Endpoints endpoints) {this.setEndpoints(endpoints);}@Overridepublic void onClose(int code, String message) {System.out.println("Client disconnected"); this.endpoints.remove(this);}@Overridepublic void onOpen(Connection connection) {System.out.println("Client connected"); _connection = connection;try {this._connection.sendMessage(new JSONArray().put("ClientID = " + clientId).toString());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}endpoints.offer(this);}@Overridepublic void onMessage(final String data) {System.out.println("Received data: " + data); this.endpoints.broadcast(data);}public Endpoints getEndpoints() {return endpoints;}public void setEndpoints(Endpoints endpoints) {this.endpoints = endpoints;}
}
Tomcat和Jetty对WebSocket的支持相关推荐
- Undertow,Tomcat和Jetty服务器之间的区别
Undertow,Tomcat和Jetty服务器配置详解与性能测试 本文文章是通过研究时下比较流行的Java框架spring boot引发的思考,希望大家能一起学习.undertow,jetty和to ...
- 自家表兄弟Tomcat和Jetty
点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 Jetty是Eclipse基金会的一个开源项目,是"HTTP服务器 + Servlet容器",并且Jet ...
- springboot启动没反应_新特性:Tomcat和Jetty如何处理Spring Boot应用?
为了方便开发和部署,Spring Boot 在内部启动了一个嵌入式的 Web 容器.我们知道 Tomcat 和 Jetty 是组件化的设计,要启动 Tomcat 或者 Jetty 其实就是启动这些组件 ...
- Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP、CMS-WordPressGhost、Jenkins、Gitlab)
Web服务和应用是目前信息技术领域的热门技术.如何使用Docker来运行常见的Web服务器(包括Apache.Nginx.Tomcat等),以及一些常用应用(LAMP.CMS等).包括具体的镜像构建方 ...
- [转]总结:Apache/Tomcat/JBOSS/Jetty/Nginx区别 .
总结:Apache/Tomcat/JBOSS/Nginx区别 . 1.Apache是Web服务器,Tomcat是应用(Java)服务器.Tomcat在中小型系统和并发访问用户不是很多的场合下被普遍使用 ...
- Maven配置tomcat和jetty插件来运行项目
针对eclipse中的Run on Server有些情况下并不是那么好操作,比如配置maven下的springmvc插件,如果使用此方法运行会很容易出现组件缺少导致错误出现一大堆的问题. 那么针对这种 ...
- Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现
Spring Boot 在关闭时,如果有请求没有响应完,在不同的容器会出现不同的结果,例如,在 Tomcat 和 Undertow 中会出现中断异常,那么就有可能对业务造成影响.所以,优雅停机非常有必 ...
- Tomcat学习总结(7)——Tomcat与Jetty比较
Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理 ...
- tomcat与jetty的区别
Jetty和Tomcat为目前全球范围内最著名的两款开源的webserver/servlet容器. 由于它们的实现都遵循Java Servlet规范,一个java Web应用部署于两款容器的任意一个 ...
最新文章
- 如何在科研论文中画出漂亮的插图?(附代码)
- 7 个小仙女花3年时间写了一本1200页的机器学习算法手册(限时开放下载)
- 金九银十铁12,看完弄懂,工资少说加 5K
- [Dask使用实例]Dask简单计算实例(map, submit)
- 1.3 单一数字评估指标-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
- 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)
- java安装版本哪种好_我怎么知道我安装了哪个版本的Java?
- 2020 最烂密码 TOP 200 大曝光,一不小心就中枪了
- nginx 监听同一端口
- Java基础学习总结(106)——高级JAVA工程师必需技能
- HTML5开发和web前端开发的区别与联系?
- Lua初学习 9-13_04 require moudle
- 基于Markdown语法的个人简历
- wps空白页怎么删除,迅速帮你解决问题
- 在Excel中批量生成复选框,也支持批量打勾批量删除,#excel插件
- 【EMC电磁兼容】01.12——差模与共模
- CSDN博客编写快捷键
- TP-LINK三层网管交换机通过console接口完成复位操作
- 我为什么鼓励你读计算机博士
- react路由不显示下划线