HTML5 WebSocket 实时推送信息测试demo

测试一下HTML5的websocket功能,实现了客户端→服务器实时推送信息到客户端,包括推送图片:

websocket实现MessageInbound类 onTextMessage()/onBinaryMessage()方法负责信息的推送,canvas负责绘画,看代码自己研究比较好,源码在后面

demo的服务器:tomcat 7.0.47,

浏览器为支持websocket version 13版本,

注意:引入jar包在tomcat的lib目录下:catalina.jar tomcat-coyote.jar,发布项目后需要删掉,否则包冲突!每个浏览器的websocket版本不同 需要不断测试 慎用!!!

先创建一个服务初始化类 SocketService ,一个servlet
package com.websocket;

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 SocketService extends HttpServlet {

private static List<MessageInbound> socketList;

public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
SocketService.socketList = new ArrayList<MessageInbound>();
super.init(config);
}

public static List<MessageInbound> getMessageInbound() {
return SocketService.socketList;

}
}

再创建WebSocketImp,实现WebSocketServlet类

package com.websocket;

import javax.servlet.http.HttpServletRequest;

import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;

public class WebSocketImp extends WebSocketServlet{

protected StreamInbound createWebSocketInbound(String arg0,
HttpServletRequest arg1) {
// TODO Auto-generated method stub
return new WebSocketInboundImp();
}
}

然后是MessageInbound 的实现类

package com.websocket;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;

public class WebSocketInboundImp extends MessageInbound {

/**
* 打开
*/
protected void onOpen(WsOutbound outbound) {
// TODO Auto-generated method stub
SocketService.getMessageInbound().add(this);
super.onOpen(outbound);
}

/**
* 关闭
*/
protected void onClose(int status) {
// TODO Auto-generated method stub
SocketService.getMessageInbound().remove(this);
super.onClose(status);
}


/**
* 流处理
*/
protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
// TODO Auto-generated method stub
for (MessageInbound bmsg : SocketService.getMessageInbound()) {
ByteBuffer bb = ByteBuffer.wrap(arg0.array());
WsOutbound wb = bmsg.getWsOutbound();
wb.writeBinaryMessage(bb);
wb.flush();
}
}

/**
* 字符处理
*/
protected void onTextMessage(CharBuffer arg0) throws IOException {
// TODO Auto-generated method stub
for (MessageInbound msgib : SocketService.getMessageInbound()) {
CharBuffer cb = CharBuffer.wrap(arg0);
WsOutbound wb = msgib.getWsOutbound();
wb.writeTextMessage(cb);
wb.flush();
}
}

}

接着看web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


<servlet>
<servlet-name>SocketService</servlet-name>
<servlet-class>com.websocket.WebSocketImp</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SocketService</servlet-name>
<url-pattern>/web</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>sload</servlet-name>
<servlet-class>com.websocket.SocketService</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

最后是界面,比较丑,

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<script type="text/javascript">
var ws;
function web(){
if('WebSocket' in window){
ws = new WebSocket("ws://localhost:8080/websocket/web");
}else{
alert("不支持 websocket");
}
ws.onopen = function(evt){
//alert("op");
}
ws.onclose =function(evt){
alert("close");
}
ws.onmessage = function(evt){
var msg = evt.data;
if("[object Blob]" != msg){
var msgdiv = document.getElementById("msgtext");
var span = document.createElement("span");
span.innerHTML = msg+"<br />";
msgdiv.appendChild(span);
}else{
var msgdiv = document.getElementById("msgtext");
var span = document.createElement("span");
var br = document.createElement("br");
var can = document.createElement("canvas");
var context = can.getContext("2d");
var image = new Image();
image.onload = function () {
//image.height
context.clearRect(0, 0, can.width, can.height);
context.drawImage(image, 0, 0, can.width, can.height);
}
image.src = URL.createObjectURL(msg);
span.appendChild(can);
span.appendChild(br);
msgdiv.appendChild(span);
}
}
ws.onerror = function(evt){
alert("error");
}
}
function sendmsg(){
ws.send("游客 ("+new Date().toLocaleTimeString()+")<br />"+document.getElementById("msg").value);
}
function sendbmsg(){
var inputElement = document.getElementById("bmsg");
var fileList = inputElement.files;

for ( var i = 0; i < fileList.length; i++) {
//发送
ws.send("游客 ("+new Date().toLocaleTimeString()+")");
//读取文件  
      var reader = new FileReader();
reader.readAsArrayBuffer(fileList[i]);
//文件读取完毕后该函数响应
reader.onload = function loaded(evt) {
var binaryString = evt.target.result;
ws.send(binaryString);
}
}
return false;
}

</script>
<body onload="web();">
<div>
<h3>testing...</h3>
<div id="msgtext">

</div>
<div>
<input type="text" name="msg" id="msg" />
<button onclick="sendmsg();">发送</button><br />
<input type="file" name="bmsg" id="bmsg" />
<button onclick="sendbmsg();">发送</button>
</div>
</div>

</body>
</html>

一个效果图:多个不同的浏览器发信息,实现同步推送
基于WebSocket与Spring Boot构建实时在线状态感知系统 实时通信技术是现代Web应用实现即时交互的核心基础,其原理在于建立客户端与服务器之间的持久化双向连接,以支持数据的低延迟推送。这项技术的核心价值在于能够显著提升用户体验,实现诸如在线状态感知、即时消息、协同编辑等实时互动场景。在众多实现方案中,WebSocket协议因其全双工通信和低开销的特性,成为构建实时系统的首选。结合Spring Boot框架,开发者可以高效地搭建后端服务,处理连接管理、消息路由和用户会话映射等关键任务。本文聚焦于实时在线状态感知这一具体应用,通过一个完整的示例,详细阐述了如何使用We 阅读详情

相关推荐

WebSocket实战指南:从协议原理到实时应用开发

在构建需要实时数据推送的Web应用时,传统的HTTP轮询方案往往面临性能瓶颈和资源浪费的挑战。WebSocket作为一种基于TCP的应用层协议,通过一次握手建立持久连接,实现了全双工、低延迟的双向通信,从根本上解决了服务器主动推送和实时交互的技术难题。其核心价值在于极小的协议开销和高效的连接管理,特别适用于在线聊天、股票行情、协同编辑和在线游戏等高并发场景。本文聚焦于WebSocket的工程实践,通过Node.js与浏览器环境的完整示例,详细解析了连接建立、数据帧格式、心跳保活等关键技术点,并提供了连接中断

weixin_30598225的博客 321

Postman实战WebSocket:构建电商订单实时通知测试环境

在实时通信技术领域,WebSocket协议是实现全双工、低延迟数据推送的核心方案。其原理是基于TCP连接,通过一次HTTP握手升级为持久化通道,实现服务器与客户端之间的双向实时数据流动。这一技术价值在于彻底解决了传统轮询或长轮询带来的资源浪费和高延迟问题,为高并发、强实时性场景提供了高效通信基础。在电商、在线协作、即时通讯等应用场景中,WebSocket是实现订单状态、物流信息、聊天消息实时推送的理想选择。本文聚焦于电商订单通知这一典型场景,通过Postman这一常用工具,详细演示如何构建和调试WebSoc

weixin_30571465的博客 296

Vue2+Echarts+SpringBoot+Websocket+Scheduled实现大屏图表数据实时展示

Vue2+Echarts+SpringBoot+Websocket+Scheduled实现大屏图表数据实时展示

qq_60067835的博客 3819

html5 websocket php,详解HTML5中的WebSocket及实例代码

在WebSocket API中,浏览器和服务器只需要做一个握手动作,然后,浏览器和服务器之间就形成一条快速通道,两者之间就可以直接进行数据传送,这一个功能可以应用到“字幕”,自己做了一个demo,废话不说了,直接贴代码:1 2 3 4 5 弹幕6 7 8 9 #Barrage{10 width:800px;11 height:400px;12...

weixin_32829077的博客 321

WPF MVVM实战:构建可绑定的RichTextBox富文本编辑器

本文详细介绍了如何在WPF MVVM模式下构建可绑定的RichTextBox富文本编辑器,解决标准RichTextBox.Document属性不支持数据绑定的问题。通过创建自定义BindableRichTextBox控件,实现FlowDocument的绑定支持,并分享插入图片、文本格式控制等实战技巧,帮助开发者高效开发富文本编辑功能。

weixin_33717117的博客 307

AUTOSAR开发实战:NvM模块如何解决汽车电子中的EEPROM与Flash存储难题?

本文深入探讨了AUTOSAR中的NvM模块如何有效解决汽车电子系统中EEPROM与Flash存储的难题。通过分层架构设计,NvM模块实现了硬件抽象与统一管理,支持数据一致性检查、错误恢复等高级功能,显著提升了存储可靠性和耐久性。文章结合实战案例,详细解析了NvM的核心机制及工程优化方案,为汽车电子开发者提供宝贵参考。

e3f4g5的博客 564

HTML5 WebSocket DEMO示例

1.使用Eclipse+Tomcat8环境进行演示 2.创建一个Servlet用于接收客户端的请求数据,并进行处理 package com.jCuckoo.server; import java.io.IOException; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.we...

dawuafang 600

ml307 二次开发

中移物联网旗下4g模组官方网站官方教程id=514官方客户不知道啥时候上班 早上10点也说不在服务时间内 找不到官方的sdk下载路径。

myWorld001的博客 2882

webSocket开发入门

websocket的优点 双向通信、事件驱动、异步、使用ws或wss协议的客户端能够真正实现意义上的推送功能(http协议之只能从客户端向服务端发数据包,websocket是http协议的扩充,建立连接时也符合http握手流程)。 开发流程 package com.hst.ces.test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.websocket.*; import javax.websocket.

zouyang920的博客 1294

做量化没有实时数据怎么行?我找到一个超级好用的Python库,速度还贼快!

今天咱们介绍了 pytdx 这个神奇的库,重点包括:✅ 安装 pytdx✅ 连接 TDX 服务器✅ 获取实时行情数据✅ 获取 K 线数据✅ 获取分笔成交数据总之,pytdx 是一个速度快、免费、易用的量化利器,适合 A 股量化交易的同学们使用。如果你还在为数据发愁,赶紧试试吧!🚀顺手再看就是对花姐最大的支持,期待你的关注。

奔跑的蜗牛 5724

亚马逊爬虫实战:中国商家信息(电话)爬取

import os), # 保存图片的路径# 搜索关键词"keywords":["毛巾","衣服"],"product_number": 1000000000000000, # 分页获取数量# 和url一一对应 个数要一样"remarks": ["备注1"],# 以下内容非专业人员请勿更改,请找开发人员更改. 对应的是amazon_product_url_setting文件中名称.},

youbingchen的博客 1524

h5:WebSocket

实时 Web 应用的窘境   Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种机制对于信息变化不是特别频繁的应用尚能相安无事,但是对于那些实时要求比较高的应用来说,比如说在线游戏、在线证券、设备监控、新闻在线播报、RSS 订阅推送等等,当客户端浏览器准备呈现这些信息的时候,这些信息在服务器端可能已经过时了。所以保持客户端和服务器端的信息同步是实时 Web 应用的关键要素,对 Web 开发人员来说也是一个难

u011927449的博客 456

Ardupilot EKF3核心算法《开篇》

Ardupilot EKF3核心算法本专栏重点,透彻,详细的分析了ardupilot的EKF3,保证是你看到的最完美的EKF3资料,相信你的选择不会错误。网上EKF资料真是太多,说真的没有一篇讲解好的。!!

陌城烟雨 1413

Websocket Stomp+RabbitMQ实现消息推送

最近写了一个小demo,用到了消息推送,想了想还是记录一下。这篇文章其实和第2篇文章 还是差不多的、 本系列文章: 1、springboot+websocket构建在线聊天室(群聊+单聊) 2、SpringBoot+STOMP 实现聊天室(单聊+多聊)及群发消息详解 3、websocket stomp+rabbitmq实现消息推送 目录 1、技术栈 2、依赖 3、修改配置文件 4...

小牛呼噜噜的博客 1万+

AutoSAR从0开始实战 --- 目录

​​​​​​本专栏是全网最真实的AutoSAR实战专栏,博主将从一个0基础小白的身份来讲解AutoSAR工具的配置,以及相应代码的讲解。

wj博客 1728

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

maven 实现WebSocket简单demo聊天功能

一.WebSocket简单介绍   随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。   我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理...

qq_38775392的博客 3849

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

转载 Html5 + Websocket 实现的Web聊天(可群聊)

原文链接 https://www.cnblogs.com/maolan/p/11112343.html 扯淡的前情提要(赶时间的小伙伴直...

wahahachuang6的博客 1489

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

webSocket入门基本使用和与springBoot的整合使用

1.webSocket简介 WebSocket 是HTML5一种新的协议(它是一个协议)。它实现了客户端和服务端的全双工通信。它是一种在单个TCP连接上进行全双工通讯协议。Websocket通信协议与2011年倍IETF定为标准RFC 6455,Websocket API被W3C定为标准。 2.webSocket和http的区别 2.1http http协议是短连接,因为请求之后,都会关闭连接,下次重新请求数据,需要再次打开链接。HTTP的生命周期通过Request来界定,也就是一个Reque.

u010689849的博客 2931

WebSocket服务端实现demo

Java后端WebSocket的Tomcat实现 一.WebSocket简单介绍   随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。   我们知道,传统的HTTP协议是无状态的,每次请求(request...

gsc1456的博客 2万+

websocket向服务器发送消息_Springboot整合Websocket实现后端向前端主动推送消息案例...

在手机上相信都有来自服务器的推送消息,比如一些及时的新闻信息,这篇文章主要就是实现这个功能,只演示一个基本的案例。使用的是websocket技术。一、什么是websocketWebSocket协议是基于TCP的一种新的网络协议。它实现了客户端与服务器全双工通信,学过计算机网络都知道,既然是全双工,就说明了服务器可以主动发送信息给客户端。这与我们的推送技术或者是多人在线聊天的功能不谋而合。为什么不使...

weixin_30647489的博客 542

Java后端WebSocket的Jetty实现

一.WebSocket简单介绍 在WebSocket规范提出之前,开发人员实现实时性较强的功能基本采用两种轮询方法:轮询(polling)和Comet技术。   轮询:轮询技术要求客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动。明显地,这种方法会导致过多不必要的请求,浪费流量和服务器资源。   Comet技术可分为:长轮询、流技术。长轮询改进了上述的轮询技术,减小了无用的请求。它会为某些数据设定过期时间,当数据过期后才会向服务端发送请求;这种机制适合数据的改动...

Aquilian的专栏 1237

SpringBoot快速入门WebSocket(​​JSR-356附Demo源码)

websocket 快速入门,前后端源码分享

YinLiaoEr的博客 1518

WebSocket

1、WebSocket的使用场景 社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等需要高实时的场景 2、为什么要用WebSocket WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信。特点:事件驱动、异步,使用ws或者...

weixin_30485291的博客 163

java websocket 库_详解WebSocket+spring示例demo(已使用sockJs库)

1、简介作为下一代的Web标准,HTML5拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket等等。这其中有“Web的 TCP”之称的 WebSocket格外吸引开发人员的注意。WebSocket的出现使得浏览器提供对 Socket的支持成为可能,从而在浏览器和服务器之间提供了一个基于TCP连接的双向通道。Web开发人员可以非常方便地使用WebSocket构建实...

weixin_35256987的博客 525
上一篇: 转载:Struts2源码分析--请求处理
下一篇: spring mysql 事务支持
hacker5077
博客等级 码龄18年 68粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hacker5077

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值