The WebSocket protocol 76 - WebSocket 76 协议以及NETTY组装返回结果示例

    RFC文档地址:http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76。

    原来的程序在GOOGLE的CHROME中使用WEBSOCKET通讯是没有问题,但有一次发现原来的程序在没有改动的情况下,在CHROME里面使用WEBSOCKET是,建立不了连接了,刚开始还以为是不小心改动了程序,后面经过仔细排查,终于发现是WEBSOCKET协议变了的原因,随着CHROME升级的时候一起就升级了。

    现在最新的WEBSOCKET协议为76号协议,它较原来的协议比较,增加了安全性方面的验证,要求服务在接到握手请求后,必须返回三个要素给客户端确认,两个信息分类来自Sec-WebSocket-Key1及Sec-WebSocket-Key2中的去除其它字符后的所有数字拼装串,除以其本身的空格后的各32位,第三部份是是后8个字节,再加MD5加密后,返回给客户端,然后客户端确认后,才算握手成功。

 

    以上提到的内容,参看协议文档中的“1.3.  Opening handshake”

    以下是一个JAVA示例,通过NETTY根据请求,组装WEBSOCKET握手返回的源代码实现:

    private HttpResponse buildWebSocketRes(HttpRequest req) {
        HttpResponse res = new DefaultHttpResponse(HttpVersion.HTTP_1_1,
                                                   new HttpResponseStatus(101, "Web Socket Protocol Handshake"));
        res.addHeader(HttpHeaders.Names.UPGRADE, HttpHeaders.Values.WEBSOCKET);
        res.addHeader(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.UPGRADE);
        // Fill in the headers and contents depending on handshake method.
        if (req.containsHeader(Names.SEC_WEBSOCKET_KEY1) && req.containsHeader(Names.SEC_WEBSOCKET_KEY2)) {
            // New handshake method with a challenge:
            res.addHeader(Names.SEC_WEBSOCKET_ORIGIN, req.getHeader(Names.ORIGIN));
            res.addHeader(Names.SEC_WEBSOCKET_LOCATION, getWebSocketLocation(req));
            String protocol = req.getHeader(Names.SEC_WEBSOCKET_PROTOCOL);
            if (protocol != null) {
                res.addHeader(Names.SEC_WEBSOCKET_PROTOCOL, protocol);
            }

            // Calculate the answer of the challenge.
            String key1 = req.getHeader(Names.SEC_WEBSOCKET_KEY1);
            String key2 = req.getHeader(Names.SEC_WEBSOCKET_KEY2);
            int a = (int) (Long.parseLong(filterNonNumeric(key1)) / filterNonSpace(key1).length());
            int b = (int) (Long.parseLong(filterNonNumeric(key2)) / filterNonSpace(key2).length());
            long c = req.getContent().readLong();
            ChannelBuffer input = ChannelBuffers.buffer(16);
            input.writeInt(a);
            input.writeInt(b);
            input.writeLong(c);
            ChannelBuffer output = null;
            try {
                output = ChannelBuffers.wrappedBuffer(MessageDigest.getInstance("MD5").digest(input.array()));
            } catch (NoSuchAlgorithmException e) {
                if (logger.isInfoEnabled()) {
                    logger.info("no such Algorithm : MD5. " + e);
                }
                e.printStackTrace();
            }

            res.setContent(output);
        } else {
            // Old handshake method with no challenge:
            res.addHeader(Names.WEBSOCKET_ORIGIN, req.getHeader(Names.ORIGIN));
            res.addHeader(Names.WEBSOCKET_LOCATION, getWebSocketLocation(req));
            String protocol = req.getHeader(Names.WEBSOCKET_PROTOCOL);
            if (protocol != null) {
                res.addHeader(Names.WEBSOCKET_PROTOCOL, protocol);
            }
        }

        return res;
    }

    

/**
     * 过滤掉非数字的字符<br>
     * 例如:str="uis sdj13 e8 kj*<ks90ao",则返回"13890"
     * 
     * @param str
     * @return 过滤后的字符串.如果str为空,则直接返回str
     */
    public static String filterNonNumeric(String str) {
        if (StringUtil.isEmpty(str)) {
            return str;
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);            
            if (NumberUtils.isNumber(String.valueOf(c))) {//NumberUtils是org.apache.commons.lang.math.NumberUtils
                sb.append(c);
            }
        }

        return sb.toString();
    }

    /**
     * 过滤掉非空格的字符<br>
     * 例如:str="uis sdj13 e8 kj*<ks90ao",则返回"   "
     * 
     * @param str
     * @return 过滤后的字符串.如果str为空,则直接返回str
     */
    public static String filterNonSpace(String str) {
        if (StringUtil.isEmpty(str)) {
            return str;
        }

        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (" ".equals(String.valueOf(c))) {
                sb.append(c);
            } else {
                sb.append("");
            }
        }

        return sb.toString();
    }

 

DigitalOcean上构建可扩展虚拟教室的实战指南 虚拟教室本质上是高并发实时音视频分布式系统,其可扩展性取决于网络吞吐、状态同步与弹性伸缩能力。核心原理在于解耦计算、状态与存储层,通过Ubuntu系统内核调优(如net.core.somaxconn、vm.swappiness)提升实时调度稳定性,并依托DigitalOcean Load Balancer、Managed Databases和Spaces实现基础设施级弹性。技术价值体现在300+并发下首屏加载<2秒、音频断连率<1%、扩容成本线性可控。典型应用场景包括社区教育平台、语言学校及职业培训系统,尤 阅读详情

相关推荐

【信息科学与工程学】【通信工程】计算机科学与自动化——第二百三十三篇 云NaaS服务 系列二02

字段内容类型​云网络自定义路由表(Custom Route Table):允许用户自定义 VPC 或子网的路由规则,控制流量走向,支持黑白名单、策略路由。端计算节点->边缘计算节点->边缘DC->中心云的网络情况及存储需求及配置情况列表​端计算节点为 VPC 内的云资源。边缘计算节点不适用。边缘 DC 和中心云为路由表管理平台。存储需求:路由条目存储于数据库。网络:路由表在虚拟路由器中执行。QoS:无。网络的端到端配置(从接入到汇聚到核心)​。

weixin_49199313的博客 327

netty-websocket 鉴权token及统一请求和响应头(鉴权控制器)

netty websocket自定义鉴权控制器(握手前) ,自定义协议头 Sec-WebSocket-Protocol 增加Sec-WebSocket-Protocol总是连接不上

weixin_43861630的博客 6824

Ubuntu环境下读取罗技G29方向盘信息

Ubuntu环境下读取罗技G29方向盘信息

工大机器人工作室 3459

Netty笔记:使用WebSocket协议开发聊天系统

前言,之前一直围绕着Http协议来开发项目,最近由于参与一个类似竞拍项目的开发,有这样一个场景,多个客户端竞拍一个商品,当一个客户端加价后,其它关注这个商品的客户端需要立即知道该商品的最新价格。        这里有个问题,Http协议是基于请求/响应的,客户端发送请求,然后服务端响应返回,客户端是主动方,服务端被动的接收客户端的请求来响应,无法解决上述场景中服务端主动将最新的数据推送给客户端的

一条宝鱼的专栏 1677

Ansys Zemax | 利用OpticStudio实现衍射光学元件(DOE)与超透镜(metalens)的高效建模与验证

本文详细介绍了如何利用Ansys Zemax的OpticStudio软件实现衍射光学元件(DOE)与超透镜(metalens)的高效建模与验证。通过混合建模策略、相位面等效建模法、POP与FDTD联合验证等多种方法,帮助工程师快速解决跨尺度仿真难题,提升设计效率与精度。文章还分享了实战案例与高级技巧,适用于AR、医疗内窥镜等应用场景。

weixin_29268331的博客 499

西门子1200与FANUC机器人Profinet通讯

近期在做发那科FANUC的通讯,会吧CC-LINK、Profibus-DP、Profinet I/O、DeviceNet、EtherNet/IP这些常用通讯做成文档发上来,大家喜欢的话可以关注 注:做对应的通讯,在机器人控制柜都需要安装对应的板卡以及软件功能 PLC项目已经归档,只需要恢复就可以看到。对应Profinet通讯的GSD文件也都在博文最后有连接 机器人柜子:R-30IB Mate 机器人主体:M-10IA 12 一、硬件介绍 机器人Profinet I/O通讯板卡:...

七兔自习室 2万+

netty对websocket协议的实现

websocket协议简单介绍与netty对websocket协议的内部实现逻辑

mahao25的博客 9277

docker安装的 n8n提示Your n8n server is configured to use a secure cookie, however you are either visiting

将原来的docker n8n进行删除后即可通过一下方式重新安装,如安装完n8n,提示。

满地找牙的博客 3366

Netty 教程 – 实现WebSocket通讯

2.Server Push 服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议;经过服务器的返回处理后连接握手成功,后面就可以进行TCP通讯,协议那样由用户自定义,还是需要遵循对应的应用协议规范…连线请求,然后服务器发出回应,这个过程通常称为。的一种新的网络协议,它实现了浏览器与服务器。

二师兄撒欢之地 2178

gtsam官方文档: The new IMU Factor学习笔记

gtsam官方文档:The new IMU Factor 本文为gtsam imu预积分文档学习笔记,为gtsam基于切向量实现的imu预积分的理论基础。 导航状态 定义导航状态为 Xbn={Rbn,Pbn,Vbn}X^n_b=\{R^n_b,P^n_b,V^n_b\}Xbn​={Rbn​,Pbn​,Vbn​} 上角标n:导航(navigation)坐标系 下角标b:载体(body)坐标系 下文均省略上下标 矢量场与微分方程 对于导航问题我们用如下微分方程描述 X˙(t)=F(t,X)\dot X(t)

南柯一梦的博客 1608

探索如何利用CST和ADS进行DDR的SIPI联合仿真

本文系统介绍了CST和ADS两款工具进行DDR信号完整性/电源完整性(SI/PI)联合仿真的方法。CST采用工作室协同方式,通过PCB布局导入、材料设置、模型分配等步骤,重点分析了电源阻抗优化和信号波形质量。ADS则利用SIPro、PIPro等专用工具,突出系统级验证和自动化优化功能。两者各有优势:CST擅长3D结构精确建模,ADS更适于快速系统验证。文章建议可根据项目需求混合使用两种工具,并提供了模型简化、频带选择等实用技巧。通过对比分析,为工程师选择仿真工具提供了决策参考。

一只豌豆象的博客 1149

Netty之通信协议和私有协议栈开发(三) 之 WebSocket协议开发

2021SC@SDUSC

May121812345的博客 2235

一文搞定离线环境下的RAG引擎部署

在人工智能浪潮下,技术已成为构建智能问答、文档分析和代码助手等应用的核心。然而,在许多企业场景中,出于数据安全和性能的考虑,服务器往往部署在中,并要求极致的推理效率。这给依赖外部资源的应用部署带来了巨大挑战。如何在这种严苛的环境下,完整、可靠地部署一套包含向量数据库、**高性能推理服务(vLLM)**和Python后台的复杂RAG系统呢?本文将为你提供一个,手把手教你如何使用 Docker 技术,将一套基于 Weaviate 和的 Python RAG 应用完整打包,并在离线环境中一键部署。

木鱼时刻的专栏 1241

LinkSwift 网盘直链下载助手:三步装好,八大网盘直链一键获取

一个 2GB 素材包在百度网盘、一套设计稿在阿里云盘、一份家庭备份在天翼云盘——浏览器下载只有几 KB/s,而公司电脑又装不了官方客户端。你缺的不是会员,而是一个能直接交给下载工具的干净直链。LinkSwift(网盘直链下载助手)是一款开源的浏览器用户脚本:装好后在网盘网页上点一下,即可解析出文件直链,再交给 IDM、Aria2 或终端继续下载。适合经常跨多个网盘取文件、习惯用第三方下载器的普通用

gitblog_00822的博客 1088

电脑硬件:电脑主板上的接口介绍,看完你就懂了

它们主要用于连接老式的键盘和鼠标,虽然速度和兼容性不如USB接口,但在某些特定场合依然发挥着重要作用。PCIe接口是主板上的扩展能力象征,可以连接各种扩展卡,如显卡、声卡、网卡等。电脑主板作为电脑硬件组成关键的部分,今天给大家分享一下电脑主板上有哪些接口,具体每一个接口的特点、使用场景,有需要的朋友可以来了解一下!它们不仅能连接鼠标、键盘、U盘、打印机,还能连接各种外设,如移动硬盘、游戏手柄等。:虽然现在用得越来越少,但在一些特定场合,如工业控制、老旧设备上,仍然需要使用PS/2接口。

IT技术分享社区 2785

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

使用 netty实现 websocket

WebSocket是一种计算机通信协议,用于在客户端和服务器之间建立持久性的全双工通信连接。它提供了一种在单个TCP连接上进行双向通信的方式,允许服务器主动向客户端发送数据,而不需要客户端首先发送请求。这与传统的HTTP请求-响应模型不同,后者需要客户端发送请求并等待服务器响应。双向通信:WebSocket允许服务器主动向客户端发送数据,而不仅仅是响应客户端的请求。这使得实时应用程序(如聊天应用程序、多人游戏等)的开发更加容易,因为服务器可以即时地将更新推送给客户端。

weixin_45318638的博客 2969

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

netty的websocket服务端开发

前两篇文章分析了node.js版本的socket.io的服务端与客户端的代码,其实他们socket.io就是在websocket的基础上进一步做了一层封装,添加了一些心跳,重连接。。。 这篇文章就先来看看在netty中是如何建立websocket服务端的吧,先来回顾一下websocket建立连接以及通信的过程: (1)客户端向服务端发送http报文格式的请求,而且是GET方法的请求,不过这里与

fjs的专栏 8788

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Netty-源码分析WebSocketClient客户端

WebSocketClient客户端使用Netty实现的源码分析 EventLoopGroup workerGroup = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); // (1) b.group(workerGroup); // (2) ...

大新博客 2021

WebSocket不同版本的三种握手方式以及一个Netty实现JAVA类

一、WebSocket不同版本的三种握手方式 WebSocket是HTML5中的新特性,应用也是非常的广泛,特别是用户WEB端与后台服务器的消息通讯,如阿里的WEBWW就是使用的WebSocket与后端服务器建立长连接进行的通讯。目前WebSocket还处于发展当中,就目前的发展过程而言,WebSocket现在不同的版本,有三种不同的握手方式: 1、基于Flash的WebSocket通讯,使用...

mmdev 252

WebSocket请求获取请求头Sec-WebSocket-Protocol,以及正确返回响应

modifyHandshake方法 public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { //获取请求头 request.getHeaders().get("Sec-WebSocket-Protocol").get(0); //当Sec-WebSocket-Protocol请求头不为空时,需要返回给前端相同的响

藥師的博客 1万+

Netty+WebSocket实现简单群聊

Netty+WebSocket实现简单群聊 这两天看了下WebSocket的RFC文档,对WebSocket协议有了基本的认识,顺便写了篇博客做点笔记  WebSocket 协议。   例子说明:每个网页一个websocket连接,点发送消息后,消息会发送给除了自己之外的其它在线的websocket客户端,简单实现群聊   服务端 采用Netty实现,Netty

莫名的拉风的博客 6330

WebSocket客户端java代码

Maven引入websoket的jar包: org.java-websocket Java-WebSocket 客户端代码: package com.cms.integration.common; import java.net.URI; import java.net.URISyntaxException; import org.java_websocket.clien

青衫烟雨客的专栏 1万+

Netty入门(六) WebSocket协议开发

WebSocket协议是和Http协议同地位的应用层协议,都是基于TCP协议之上,但是其是以Http协议为基础的。未了解决Http协议半双工通信模式且数据冗杂的缺点,HTML5提出了WebSocket协议,WebSocket协议是全双工通信,解决了客户端和服务端之间的实时通信问题。浏览器和服务器只需完成一次握手,两者之间就可以创建一个持久性的TCP连接,此后服务器和客户端通过此TCP连接进行双向实时通信。

这里是阿安的博客 3127

Netty之WebSocket开发

前言大家都知道在Http中有长连接这个说话,但是长连接,指的是在一次TCP连接中完成多个HTTP请求,也就是说我们的每个请求仍然存在header,可不要小看这些header,因为在大多数的情况下header都是重复的基本都是没有什么作用,这就是导致了HTTP协议就会有很大的开销。对于我们的推送一般是采用poling或者Comet。什么是polling呢?也就是我们所说的长轮询,是指客户端不断主动的向

lizhao007 1497
上一篇: 关闭/限制MYSQL用户远程访问的权限
下一篇: Oracle可以使用sysdate函数,mysql中使用sysdate函数要小心
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值