Websocket介绍参考:
http://www.cnblogs.com/qq931399960/p/4730493.html
http://www.cnblogs.com/xdp-gacl/p/5193279.html
一、WebSocket简介
WebSocket protocol是HTML5一种新的协议,WebSocket 是目前唯一真正实现全双工通信的服务器向客户端推送的互联网技术。WebSocket的出现使得浏览器提供对Socket的支持成为可能,从而在浏览器和服务器之间提供了一个基于 TCP 连接的双向通道。
HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术,使客户端浏览器具备像 C/S 架构下桌面系统的实时通讯能力。 浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。因为 WebSocket 连接本质上就是一个 TCP 连接,所以在数据传输的稳定性和数据传输量的大小方面,和轮询以及 Comet 技术比较,具有很大的性能优势。
二、WebSocket出现之前实时web应用
Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种 机制对于信息变化不是特别频繁的应用尚能相安无事,但是对于那些实时要求比较高的应用来说,比如说在线游戏、在线证券、设备监控、新闻在线播报、RSS 订阅推送等等,当客户端浏览器准备呈现这些信息的时候,这些信息在服务器端可能已经过时了。所以保持客户端和服务器端的信息同步是实时 Web 应用的关键要素,对 Web 开发人员来说也是一个难题。在 WebSocket 规范出来之前,开发人员想实现这些实时的 Web 应用,不得不采用一些折衷的方案,其中最常用的就是轮询 (Polling) 和 Comet 技术,而 Comet 技术实际上是轮询技术的改进,又可细分为两种实现方式,一种是长轮询机制,一种称为流技术
轮询:
这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。这种同步方案的最大问题是,当客户端以固定频率向 服务器发起请求的时候,服务器端的数据可能并没有更新,这样会带来很多无谓的网络传输,所以这是一种非常低效的实时方案。
长轮询:
长轮询是对定时轮询的改进和提高,目地是为了降低无效的网络传输。当服务器端没有数据更新的时候,连接会保持一段时间周期直到数据或状态改变或者时间过期,通过这种机制来减少无效的客户端和服务器间的交互。当然,如果服务端的数据变更非常频繁的话,这种机制和定时轮询比较起来没有本质上的性能的提高。
流:
流技术方案通常就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。服务器端接到这个请求后作出回应并不断更新连接状态以保证客户 端和服务器端的连接不过期。通过这种机制可以将服务器端的信息源源不断地推向客户端。这种机制在用户体验上有一点问题,需要针对不同的浏览器设计不同的方 案来改进用户体验,同时这种机制在并发比较大的情况下,对服务器端的资源是一个极大的考验。
综合这几种方案,您会发现这些目前我们所使用的 所谓的实时技术并不是真正的实时技术,它们只是在用 Ajax 方式来模拟实时的效果,在每次客户端和服务器端交互的时候都是一次 HTTP 的请求和应答的过程,而每一次的 HTTP 请求和应答都带有完整的 HTTP 头信息,这就增加了每次传输的数据量,而且这些方案中客户端和服务器端的编程实现都比较复杂,在实际的应用中,为了模拟比较真实的实时效果,开发人员往往 需要构造两个 HTTP 连接来模拟客户端和服务器之间的双向通讯,一个连接用来处理客户端到服务器端的数据传输,一个连接用来处理服务器端到客户端的数据传输,这不可避免地增加了编程实现的复杂度,也增加了服务器端的负载,制约了应用系统的扩展性。
三、WebSocket规范
WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表 明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。
四、补充说明
1、浏览器支持情况
Chrome
|
Supported in version 4+
|
Firefox
|
Supported in version 4+
|
Internet Explorer
|
Supported in version 10+
|
Opera
|
Supported in version 10+
|
Safari
|
Supported in version 5+
|
对于低版本IE,有折中的解决方式。后续实际用到再补充
2、Tomcat支持情况
使用Tomcat的Websocket实现时,采用Tomcat7+版本,对于Tomcat6及以下,可以采用第三方库的方式实现Websocket。
3、代码示例:
client.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> var websocket = null; window.WebSocket = window.WebSocket || window.MozWebSocket; if (!window.WebSocket) { alert('Error: WebSocket is not supported .'); } else { websocket = new WebSocket(encodeURI('ws://127.0.0.1:8080/wstest/ws')); } //连接发生错误的回调方法 websocket.onerror = function () { setMessageInnerHTML("WebSocket连接发生错误"); }; //连接成功建立的回调方法 websocket.onopen = function () { console.log("open"); setMessageInnerHTML("WebSocket连接成功"); } //接收到消息的回调方法 websocket.onmessage = function (event) { setMessageInnerHTML(event.data); } //连接关闭的回调方法 websocket.onclose = function () { setMessageInnerHTML("WebSocket连接关闭"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function () { closeWebSocket(); } //将消息显示在网页上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML + '<br/>'; } //关闭WebSocket连接 function closeWebSocket() { websocket.close(); } //发送消息 function send() { var message = document.getElementById('text').value; websocket.send(message); } </script> </head> <body> Welcome<br/><input id="text" type="text"/> <button onclick="send()">发送消息</button> <hr/> <button onclick="closeWebSocket()">关闭WebSocket连接</button> <hr/> <div id="message"></div> </body> </html>
server端:
不需要任何额外的配置,可以直接调用。示例只支持字符串的交互。
import java.io.IOException; import javax.websocket.CloseReason; import javax.websocket.EndpointConfig; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/ws") public class WSTest { @OnOpen public void onOpen(Session session, EndpointConfig arg1) { // TODO Auto-generated method stub System.out.println("open "+session.getId()); } @OnClose public void onClose(Session session, CloseReason closeReason) { // TODO Auto-generated method stub System.out.println("close "+session.getId()); } @OnError public void onError(Session session, Throwable throwable) { // TODO Auto-generated method stub } @OnMessage public void onMessage(Session session,String msg){ try { session.getBasicRemote().sendText("resp: "+msg); } catch (IOException e) { e.printStackTrace(); } } }
相关推荐
tomcat实现websocket.rar所需jar包。
综上所述,要使用Tomcat实现WebSocket,你需要理解WebSocket的基本概念,配置Tomcat以支持WebSocket,编写WebSocket服务器端点代码,并在客户端使用适当的API与服务器进行通信。同时,还需要关注性能和安全方面的...
在这个“tomcat实现websocket聊天室”的项目中,我们将深入探讨如何利用Tomcat搭建一个具备单聊、群聊、数据库管理以及用户管理功能的聊天室。 首先,我们需要理解WebSocket API的基本概念。WebSocket协议定义了两...
基于Tomcat实现WebSocket,首先需要确保Tomcat版本支持WebSocket。从Tomcat 7.0.27开始,Tomcat内建了对WebSocket的支持,它实现了JSR 356(Java API for WebSocket)规范。以下是实现步骤: 1. **创建WebSocket...
WebSocket DEMO 案例需求:tomcat 通过 websocket 实现一个简易的聊天室功能。 html tomcat 通过 websocket 实现一个简易的聊天室功能-案例-项目-教程-源码.zip websocket :是 HTML5 新增的协议,它的目的是在...
- 在Java中实现WebSocket服务器端逻辑,包括处理客户端发送的消息以及向客户端发送响应。 - 服务器端代码通常需要实现`javax.websocket.Endpoint`接口或使用`@ServerEndpoint`注解来标记WebSocket端点。 ##### ...
本教程将通过Tomcat 9.0来演示如何使用WebSocket实现点对点的聊天功能。 首先,我们需要了解WebSocket的基础知识。WebSocket协议定义了一种在客户端和服务器之间建立持久连接的方法,允许双方进行双向数据传输。与...
WebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端和服务端实现双向通信。这篇文章主要介绍了Tomcat实现WebSocket的方法的相关资料,需要的朋友可以参考下
`WebSocketServlet.java`是实现WebSocket服务端的核心类。在Java中,我们通过继承`javax.websocket.ServerEndpoint`注解的类来创建WebSocket服务器端点。这个注解告诉Tomcat这个类将处理WebSocket连接。例如: ```...
在Tomcat中实现WebSocket,需要创建一个继承自`WebSocketServlet`的类。例如,我们可以创建一个名为`HelloWebSocketServlet`的类,重写`createWebSocketInbound`方法,返回一个`WebSocketMessageInbound`的实例,这...
本篇文章将深入探讨如何在Tomcat环境中实现WebSocket。 首先,我们需要了解WebSocket的基本概念。WebSocket是一种在TCP协议基础上建立的全双工通信协议,它解决了HTTP协议下服务器与客户端实时通信的问题,因为HTTP...
为了在Tomcat上实现WebSocket,你需要以下步骤: 1. **配置项目**:首先创建一个JavaWeb测试项目,然后在`pom.xml`中添加对`javaee-api`的依赖,版本至少为7.0,以确保能使用WebSocket相关API。 ```xml ...
通过以上步骤,你就可以在Tomcat 7.0中实现WebSocket通信了。在实际应用中,你可能还需要处理错误、添加认证和授权、优化性能等复杂情况。源码分析和工具使用是理解这一过程的关键,特别是通过阅读和调试`...
SpringMVC的Socket实现+Java Tomcat websocket实现+Java Socket通信实现 +Java UDP通信实现。websocket_study.rar 为springMVC版本的socket实现 websocket02.rar 里面包含tomcat的websocket实现+java socket双向通信...
通过Netty,开发者可以轻松地实现WebSocket服务器和客户端,而且Netty的API设计得非常直观,有助于提高开发效率。 在实际应用中,选择WebSocket服务器框架通常取决于项目需求和团队的技术栈。Tomcat作为广泛使用的...
在Java中,有两种常见的方式实现WebSocket:使用Tomcat内置的WebSocket API和使用Spring框架的WebSocket支持。下面我们将详细介绍这两种方法。 **一、Tomcat的WebSocket实现** Tomcat从7.x版本开始支持WebSocket,...
tomcat8真正支持jsr-356(包含对websocket的支持), tomcat7部分版本的websocket实现不兼容jsr-356。 需要注意websocket与浏览器的兼容问题,有些早期版本的浏览器支持旧版本的websocket协议,可能会与新版本的...
1. **Tomcat 8.5**:Tomcat是一款开源的、实现了Java Servlet和JavaServer Pages (JSP) 规范的应用服务器,由Apache软件基金会维护。Tomcat 8.5是其一个稳定版本,支持Java EE 7规范,包括Servlet 3.1、JSP 2.3和EL ...
在Tomcat中实现WebSocket,首先需要创建一个实现了`javax.websocket.OnOpen`、`javax.websocket.OnClose`、`javax.websocket.OnMessage`接口的类,这些接口分别用于处理连接打开、关闭和接收到消息的事件。...
总的来说,通过替换这些特定的Tomcat库,你可以使你的服务器环境准备好支持WebSocket通信,从而开启更高效、实时的Web应用程序开发。但请注意,这样做可能会影响其他非WebSocket相关的应用,所以在生产环境中操作前...