神了,WebSocket竟然可以这么设计!

WebSocket系列之基础知识以及设计思路 WebSockets 是一个可以创建和服务器间进行双向会话的高级技术。通过这个API你可以向服务器发送消息并接受基于事件驱动的响应,这样就不用向服务器轮询获取数据了。双向会话指的是客户端和服务端都能够通过WebSocket来进行数据的互相传递,即服务端可以给客户端推送数据,客户端也可以通过WebSocket来传递数据。例如,我们的一个聊天室功能就是一个典型的场景。对WebSocket的协议有了一个初步的了解,下面让我们看下,在具体的使用场景中,如何使用WebSocket。建立连接收到消息发送消息。 阅读详情

01 引言

长连接是业务项目中经常遇到的技术,往往用于数据向前端推送,如各种大屏、驾驶舱等实时数据的展示。单向推送可能会选择SSE,SSE因为AI时代的到来,逐步被大家熟知,而WebSocket作为经典的双向通讯,也经常被用来做数据推送。

今天聊一下,我发现的一种特殊的设计,可以单独将基于Netty的WebSocket单独部署,接入时,只需要引入API,初始化客户端即可完成对接。直接隔离了WebSocket服务端的编码。

02 普通应用

WebSocket的普通接入,需要编写WebSocket服务端。通过浏览器原生 API即可实现。

2.1 前端代码

浏览器原生的代码:

if ('WebSocket' in window) {
  const websocket = new WebSocket("ws://localhost:9090/testWs");
} else {
  alert('当前浏览器不支持 WebSocket');
}

websocket.onopen = function(event) {
  console.log('WebSocket 连接成功');
};

websocket.onmessage = function(event) {
  console.log('收到消息:', event.data);
};

websocket.onerror = function(error) {
  console.error('WebSocket 错误:', error);
};

websocket.onclose = function(event) {
  console.log('WebSocket 连接关闭');
};

// 发送消息
function sendMessage() {
  const message = document.getElementById('text').value;
  websocket.send(message);
}

// 关闭连接
function closeConnection() {
  websocket.close();
}

2.2 服务端代码

@Slf4j
@Component
public class WebSocketServer {

    @Getter
    private ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    public void start() throws InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workGroup = new NioEventLoopGroup();

        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(bossGroup, workGroup);
        serverBootstrap.channel(NioServerSocketChannel.class);
        serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>(){

            @Override
            protected void initChannel(SocketChannel socketChannel) throws Exception {
                ChannelPipeline pipeline = socketChannel.pipeline();
                pipeline.addLast(new HttpServerCodec());
                pipeline.addLast(new HttpObjectAggregator(65535));
                pipeline.addLast(new WebSocketServerProtocolHandler("/testWs"));
                // 自定义的handler,处理业务逻辑
                pipeline.addLast(new SimpleChannelInboundHandler<TextWebSocketFrame>() {

                    @Override
                    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
                        // 建立客户端
                        Channel channel = ctx.channel();
                        log.info("客户端建立连接:channelId={}", channel.id());
                        channelGroup.add(channel);
                    }

                    @Override
                    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
                        // 断开链接
                        Channel channel = ctx.channel();
                        log.info("客户端断开连接:channelId={}", channel.id());
                        channelGroup.remove(channel);
                    }

                    @Override
                    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
                        // 接受消息
                        Channel channel = ctx.channel();
                        log.info("收到来自通道channelId[{}]发送的消息:{}", channel.id(), msg.text());

                        // 广播通知所有的客户端
                        channelGroup.writeAndFlush(new TextWebSocketFrame("收到来自channelId[" + channel.id() + "]发送的消息:" + msg.text() + "123_"));
                    }
                });
            }
        });

        // 配置完成,开始绑定server,通过调用sync同步方法阻塞直到绑定成功
        ChannelFuture channelFuture = serverBootstrap.bind(9090).sync();
        log.info("Server started and listen on:{}",channelFuture.channel().localAddress());
        // 对关闭通道进行监听
        channelFuture.channel().closeFuture().sync();
    }
}

2.3 效果演示

为了方便演示,我直接使用在线测试工具:

https://webfem.com/tools/ws/index.html

2.4 设计思想

设计如图:

这就是一个简单的点对点的一个设计。这样的设计本身没有什么问题,但是面对不同的业务系统都要接入WebSocket,我们就需要将服务端的代码复制一份,然后修改成适合自己业务项目的逻辑。

如果业务项目比较多,就会出现大量重复的代码,如我们公司就有20多个业务系统。从《代码重构》这本书中,就得知这是一种坏的味道,需要我们想办法优化。

如何来优化呢?按照阿里程序员的说话,没有什么是加一个中间层不能解决的,如果不能那就再加一层。

03 独特的设计

3.1 总览

如何通过中间层去解耦呢?

为了将WebSocket能够复用,就需要通过一个中间层能够作为一个传递者。既可以让用户直接连接WebSocket,也可以通过中间层直接推送消息。

我们来看看最终的设计流程:

3.2 流程分析

在流程分析执之前,我们需要说明引入的中间层。

  • Socket中间客户端
  • Socket服务

Socket中间客户端

Socket中间客户端作为一个jar传递于业务项目中,用来代替WebSocket直接推送消息给Socket客户端。同时也会将WebSocket服务的IP和端口暴露给客户端。

Socket中间客户端是基于Netty的Socket客户端,通过Bootstrap bootstrap = new Bootstrap()实例化,遵循TCP协议。详见代码。

Socket服务

为什么需要引入Socket服务呢?这也是小编之前非常疑惑的地方,直到自己搭建才知道为什么这么设计。

由于Socket中间客户端无法直接连接WebSocket,那么那就要一个完全基于TCP协议的Socket服务,就可以和Socket中间客户端建立连接。

而Socket服务和WebSocket位于同一个服务,就可以获取到WebSocket的所有通道(channel),就可以将消息推送给客户端了。

运行流程

  • ① 客户端通过业务项目暴露的WebSOcket的IP和端口给前端,前端用来建立WebSocket连接。当着这个主要针对H5。类似安卓或者IOS有支持TCP的SDK,就可以直接连接Socket服务了。
  • ② 随着业务项目启动建立与Socket服务的连接,等待随时给Socket服务发送消息。
  • ③ Socket服务接收到消息后,直接获取WebSocket的通道。然后通过通道可以推送消息。
  • ④ 获取到通道之后,就可以直接推送消息给前端了。

所以每次使用,只需要引入Jar,需要推送消息给客户端,只需要直接调用方法推送即可。

04 设计实现

4.1 WebSocket服务端

代码同2.2的代码

WebSocket服务的端口是9090

4.2 Socket服务端

@Slf4j
@Component
public class SockerServer {

    @Autowired
    private WebSocketServer webSocketServer;

    public void start() throws InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workGroup = new NioEventLoopGroup();

        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(bossGroup, workGroup);
        serverBootstrap.channel(NioServerSocketChannel.class);
        serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>(){

            @Override
            protected void initChannel(SocketChannel socketChannel) throws Exception {
                ChannelPipeline pipeline = socketChannel.pipeline();
                pipeline.addLast(new DelimiterBasedFrameDecoder(2048, Unpooled.copiedBuffer("_".getBytes())));
                pipeline.addLast(new StringDecoder(StandardCharsets.UTF_8));
                pipeline.addLast(new StringEncoder(StandardCharsets.UTF_8));
                // 自定义的handler,处理业务逻辑
                pipeline.addLast(new SimpleChannelInboundHandler<>() {

                    @Override
                    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
                        // 建立客户端
                        Channel channel = ctx.channel();
                        log.info("Socket客户端建立连接:channelId={}", channel.id());
                    }

                    @Override
                    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
                        // 断开链接
                        Channel channel = ctx.channel();
                        log.info("Socket客户端断开连接:channelId={}", channel.id());
                    }

                    @Override
                    protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
                        // 接受消息
                        Channel channel = ctx.channel();
                        log.info("Socket收到来自通道channelId[{}]发送的消息:{}", channel.id(), msg);
                        // 通过WebSocket将方法发送给客户端
                        webSocketServer.getChannelGroup().writeAndFlush(new TextWebSocketFrame("收到来自channelId[" + channel.id() + "]发送的消息:" + msg + "123_"));
                    }
                });
            }
        });

        // 配置完成,开始绑定server,通过调用sync同步方法阻塞直到绑定成功
        ChannelFuture channelFuture = serverBootstrap.bind(9091).sync();
        log.info("Server started and listen on:{}",channelFuture.channel().localAddress());
        // 对关闭通道进行监听
        channelFuture.channel().closeFuture().sync();
    }
}

Socket服务的端口是9091

4.3 Socket中间客户端

@Slf4j
public class MockClient {

    @Getter
    private SocketChannel socketChannel;

    public void connect() throws InterruptedException {
        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        Bootstrap bootstrap = new Bootstrap();
        bootstrap.channel(NioSocketChannel.class);
        bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
        bootstrap.option(ChannelOption.SO_BACKLOG, 500);
        bootstrap.group(eventLoopGroup);

        bootstrap.handler(new ChannelInitializer() {
            @Override
            protected void initChannel(Channel channel) throws Exception {
                ChannelPipeline pipeline = channel.pipeline();
                pipeline.addLast(new DelimiterBasedFrameDecoder(2048, Unpooled.copiedBuffer("_".getBytes())));
                pipeline.addLast(new StringDecoder(StandardCharsets.UTF_8));
                pipeline.addLast(new StringEncoder(StandardCharsets.UTF_8));
                pipeline.addLast(new SimpleChannelInboundHandler<String>(){
                    @Override
                    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
                        log.info("client receive: {}", msg);
                    }
                });
            }
        });

        ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 9091).sync();
        this.socketChannel = (SocketChannel) channelFuture.channel();
    }
}

Socket只是用来发送消息的,所以不同处理接受的消息。注意这里的中间客户端连接的是Socket服务,端口是9091

4.4 配置启动

@Slf4j
@Component
public class StartConfig {

    @Autowired
    private WebSocketServer webSocketServer;
    @Autowired
    private SockerServer socketServer;


    @PostConstruct
    public void init() {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.execute(() -> {
            log.info("websocket init ....");
            try {
                webSocketServer.start();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        executorService.execute(() -> {
            log.info("socket init ....");
            try {
                socketServer.start();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
    }
}

这个就是独立部署的Socket服务配置,两个服务分别使用多线程启动。

4.5 模拟数据推送

@Test
void contextLoads() throws Exception {
    MockClient mockClient = new MockClient();
    mockClient.connect();
    SocketChannel socketChannel = mockClient.getSocketChannel();

    new Timer().schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("send msg...");
            socketChannel.writeAndFlush("foo test..._");
        }
    }, 0, 2000);

    System.in.read();
}

每个2s发送一次消息。

4.6 客户端

客户端同样用在线测试工具代替。

4.7 演示

05 小结

这就完成了WebSocket的解耦。关于Socket消息的编解码,有很多注意点,在搭建过程中,总会不成功, 需要根据连接的协议选择不同的编解码,才能正确的接受和发送信息。这些留到后面的文章继续介绍。

量子通信:初识量子城域网 对量子城域网的概念、作用、拓扑、建设内容等进行了较为全面的初步介绍。 阅读详情

相关推荐

【AWS】创建aws云服务器EC2实例

本文介绍了如何创建aws的EC2云服务器,并介绍了如何使用Xshell远程连接上云服务器

Marcos921的博客 2500

初识Websocket

什么是Websocket WebSocket是一种通信协议,可在单个TCP连接上进行全双工通信。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。 Websocket是一种通信协议,与HTTP不同,HTTP只能实现单项通信,也就是客...

Sumshine12.5 1760

芯片硅前验证技术与驱动工程师实战指南

硅前验证是芯片开发流程中的关键环节,通过pre-silicon simulation等技术手段在流片前验证设计正确性。其核心技术包括软件仿真、FPGA原型验证和硬件仿真器解决方案,涉及Linux驱动开发、芯片架构理解和波形分析等核心技能。作为连接芯片设计与系统集成的桥梁,硅前验证能早期发现设计缺陷,节省数百万美元流片成本。以Cadence Palladium为代表的硬件仿真器,通过专用服务器系统实现比纯软件方案快100-1000倍的仿真速度,为驱动工程师提供完整的外设模型验证环境。掌握硅前验证技术可显著提升

weixin_42522857的博客 321

WebSocket

定义一个配置类用来注册WebSocket 的bean能扫描 @ServerEndpoint 的配置, 不然在客户端连接的时候会一直连不上。服务器长期维护长连接需要一定的成本 各个浏览器支持程度不一 WebSocket 是长连接,受网络限制比较大,需要处理好重连。既然WebSocket支持双向通信,功能看似比HTTP强大,那么我们是不是可以基于WebSocket开发所有的业务功能?WebSocket并不能完全取代HTTP,它只适合在特定的场景下使用。WebSocket 是基于 TCP 的一种新的。

qq_51239179的博客 162

信息化建设项目前期方案编制4:如何画好四张图

这里探讨以下具体的总体设计操作层面的工作。总体设计主要是完成四张图,总体架构(逻辑架构)、应用架构、网络拓扑、系统部署图。对于一些单一的系统,往往总体架构和应用架构可以合一。网络拓扑画好了,系统部署图也可以省略。有些项目还会在这之外,有所谓的技术架构图。对应用系统、数据存储等各个部分各自用的主要技术、服务等,给出总体设计图。但通常来说,这四张图在一个中等规模(200~500万,软件...

Leonardo的博客 4635

数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享

数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享

weixin_37584728的博客 3450

WebSocket的基本概念及单工、半双工和全双工的区别与联系

1.单工: 数据传输只允许在一个方向上的传输,只能一方来发送数据,另一方来接收数据并发送。2.半双工:数据传输允许两个方向上的传输,但是同一时间内,只可以有一方发送或接受消息。WebSocket是一种在单个TCP连接上进行全双工通信的协议。3.全双工:同时可进行双向传输。例如:websocket。

weixin_45875986的博客 701

RT-Thread必考面试题及参考答案

RT-Thread的设备驱动模型遵循层次化的结构,设计简洁且易于扩展。它主要由设备注册、设备操作和设备控制三部分组成。设备驱动模型允许开发者为不同的硬件设备编写驱动程序,这些驱动程序可以被RT-Thread内核统一管理和调度。在RT-Thread中,设备被抽象成一系列标准的接口,包括打开、关闭、读取、写入、控制等操作,这些操作封装在结构体中。设备驱动程序需要实现这些接口,然后通过调用函数注册设备,使其对系统可见。这种模型不仅简化了驱动开发,还提高了代码的可移植性和可维护性。

大模型大数据攻城狮的专栏 1823

websocket协议简介

概念介绍 单工通信:数据传输只允许在一个方向上传输,只能一方发送数据,另一方接收数据并发送。 半双工:数据传输允许两个方向上的传输,但在同一时间内,只可以有一方发送或接收数据。 全双工:同时可进行双向数据传输。 websocket与http图解 websocket与HTTP 相同点 1、都是一样基于TCP协议,都是可靠性传输协议 2、都是应用层协议 不同点 1、websocket是双向通信协议,模拟socket协议,可以双向发送或接受信息。HTTP是单向的。 2、都是需要握手进行建立连接的,但H

new9232的博客 1万+

uniapp(全端兼容) - 最新详细实现支付键盘功能组件,从底部弹出数字键盘输入支付密码进行付款交互效果,自定义支付密码键盘仿微信、支付宝支付键盘,1~9密码数字键盘,电商支付(详细示例代码复制运行

uniapp,微信小程序,自定义数字键盘,输入支付密码的键盘组件,uniapp小程序如何实现从底部弹出输入支付密码自定义键盘功能,uniapp小程序密码支付键盘组件插件,自定义数字键盘输入页面,怎么封装底部弹窗自定义数字键盘用于输入支付密码,uniapp小程序仿类似电商支付密码输入模态框,uniapp微信小程序平台实现自定义支付密码键盘,uniapp 密码支付,数字键盘,安全键盘,交易键盘,交易密码,交易密码输入框,uniapp自定义支付键盘: uniapp自定义支付键盘,uniapp小程序端实现键盘输入支

✅ 精选推荐文章 2904

HTML音乐爱心3D旋转相册完整源码

HTML音乐爱心3D旋转相册完整源码

LilyCoder的博客 1379

WebSocket 与 HTTP 有什么区别:从单向请求到全双工实时通信

只有客户端能主动发起请求,服务器只能被动响应。这种“一问一答”的模式,在需要实时推送的场景(聊天、股票行情、游戏、协作编辑)中显得力不从心。传统解决方案(轮询、长轮询)要么浪费资源,要么延迟高。WebSocket应运而生——它在单个 TCP 连接上建立全双工通道,让服务器也能主动“说话”。本文从协议设计、连接方式、通信模式、适用场景等角度,全面对比 WebSocket 与 HTTP。维度HTTPWebSocket通信模式半双工(客户端→服务器,一问一答)全双工(双方随时互发消息)连接持久性。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2756

基于Proximal Policy Optimization的无人机姿态控制系统的研究及Matlab实现

本文简要介绍了基于Proximal Policy Optimization算法的无人机姿态控制系统,并使用Matlab实现了一个简化版的代码。PPO算法的特点在于能够解决强化学习中的部分可观察性问题,同时还能保持策略网络更新的稳定性。本文将介绍基于Proximal Policy Optimization(PPO)算法的无人机姿态控制系统,并使用Matlab进行简化版实现。无人机姿态控制是指通过调整飞行器各部件的参数,使其保持特定角度、方向和位置的状态。本文将实现无人机的横滚姿态控制,并将其作为实现的示例。

m0_47037246的博客 715

常用设计模式+集成websocket

【代码】常用设计模式+集成websocket。

Sun的个人博客 6953

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Websocket——化神篇

众所周知,Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现,这种机制对于信息变化不是特别频繁的应用尚可,但对于实时要求高、海量并发的应用来说显得捉襟见肘,尤其在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是 Web 应用经常面临的问题,比如金融证券的实时信息,Web 导航应用中的地理位置获取,社交网络的实时消息推送等。当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。

卷心菜是俺的博客 1466

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【项目设计】基于WebSocket的Web聊天室

基于WebSocket实现的类QQ群组聊天室,实现了用户注册,用户登陆,获取频道列表,获取历史消息及推送消息功能,项目已经部署到服务器,里面附有链接,感兴趣的同学可以点击访问哟!

X_H学Java的博客 6231

假人有限元模型

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

利用Postman和Apipost进行WebSocket调试和文档设计

Apipost最新版本推出的WebSocket“调试与设计模块”不仅能够轻松处理 WebSocket 的调试问题,还在很大程度上优化了Websocket 的文档设计流程,真正实现了调试与文档设计的一体化。 Apipost 的 WebSocket 调试支持「支持将消息分组」,我们可以轻松建立连接、发送消息并查看响应。无论是测试消息推送、实时聊天,还是模拟客服对话,Apipost 都能提供直观的调试界面,帮助我们快速定位问题。从而可以轻松建立连接、

yxcici的博客 1341

WebSocket怎么设计连接

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于需要实时交互的场景(如聊天、实时数据推送、在线游戏等)。设计一个高效、稳定的 WebSocket 连接需要从。根据业务需求选择合适的库和架构,平衡性能和开发成本。

m0_61600773的博客 913

神了,WebSocket 竟然可以这么设计:把服务端“拆出去”,业务系统只引 Jar 就能推送

本文提出了一种创新的WebSocket设计方案,通过将WebSocket服务端拆分为独立推送网关,使业务系统只需引入SDK即可实现消息推送。该架构包含WebSocket网关、TCP Socket服务和业务侧SDK三个核心组件,业务系统通过TCP连接将消息投递给网关,由网关统一管理WebSocket连接和消息推送。这种设计解决了多系统重复开发WebSocket服务的问题,实现了连接管理、鉴权、心跳等功能的统一治理,降低了运维成本。文章还详细阐述了生产环境需要完善的要点,包括消息协议、路由能力、鉴权安全、可靠性

IT枫斗者的博客 616

websocket 设计

之前没有做web开发,认为web上进行数据传输只依赖http. 后来同事用到websocket, 才知道web上也能用socket. 那为什么出现了websocket? 大家都知道,http是无状态的。一个请求对应一个响应。请求必须由client端发起,如果server端主动向client发送数据怎么办呢? 1. client轮询向serve发送请求,比如每一秒就发送一次请求,查看ser

chaoyue1216的专栏 1126

WebSocket系列之二进制数据设计与传输

概述 通过前三篇博客,我们能够了解在通过WebSocket发送数据之前,我们需要传递的数据是如何变成ArrayBuffer二进制数据的;在我们收到二进制数据之后,我们又如何将其变成了JavaScript中的常见数据类型。 本文作为WebSocket系列的第四篇内容,将会用一个简单的IM聊天应用把整个WebSocket传输二进制数据类型的内容连接起来,让用户对整个WebSocket传输二进制数据的方法有个了解。 本文的主要内容如下: 如何设计一个二进制协议 WebSocket如何发送二进

weixin_42899690的博客 6930

WebSocket4Net API详解:掌握IWebSocket接口与核心类设计

WebSocket4Net是一款流行的.NET WebSocket客户端库,为开发者提供了高效、可靠的WebSocket通信能力。本文将深入解析其核心API设计,帮助新手快速掌握IWebSocket接口与关键类的使用方法。 ## 📌 核心接口IWebSocket:定义通信规范 IWebSocket接口是WebSocket4Net的核心抽象,位于[src/WebSocket4Net/IWebS

gitblog_00537的博客 761

websocket 二进制 java_WebSocket系列之二进制数据设计与传输

概述通过前三篇博客,我们能够了解在通过WebSocket发送数据之前,我们需要传递的数据是如何变成ArrayBuffer二进制数据的;在我们收到二进制数据之后,我们又如何将其变成了JavaScript中的常见数据类型。本文作为WebSocket系列的第四篇内容,将会用一个简单的IM聊天应用把整个WebSocket传输二进制数据类型的内容连接起来,让用户对整个WebSocket传输二进制数据的方法有...

weixin_36454202的博客 1867

好的WebSocket设计

您是否想开发一次可以被许多其他地方使用的软件? 您是否希望Android,IOS或台式机支持您的功能? 在设计开始时,您需要考虑这些事情。 您可能首先想到的是使用html5进行开发。 html5支持WebSocket标准,这是一个很好的新特性,并且许多广泛的浏览器都支持WebSocket标准。 对于某种广播要求,我们可以使用一些客户端插件与服务器进行有效通信。 对于诸如注释之类的轻...

IT与开发人员的地盘 347

一文让你全面认识WebSocket压测!

01 WebSocket是什么? 「WebSocket」是一种在单个TCP连接上进行全双工通信的协议。

公众号【伤心的辣条】资料领取~ 3594

gosumemory核心功能解析:WebSocket API与内存读取原理详解

gosumemory是一款跨平台的osu!内存读取工具,支持Linux和Windows系统,能够实时获取游戏数据并通过WebSocket API提供给前端应用。本文将深入解析其两大核心功能:高效的内存读取机制和灵活的WebSocket数据推送服务,帮助开发者快速掌握这款工具的工作原理。 ## 一、跨平台内存读取技术揭秘 ### 1.1 Windows系统内存读取实现 在Windows平台上,

gitblog_00296的博客 960
上一篇: 你的网站SSL证书又要过期了?这个工具能让你永久告别焦虑
下一篇: J人程序员的用屏技巧:软硬结合,让编码效率起飞
智_永无止境
博客等级 码龄10年 803粉丝 403原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

智_永无止境

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

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

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

打赏作者

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

抵扣说明:

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

余额充值