netty编程之实现websocket客户端并发送二进制消息

写在前面

源码。
本文看下netty如何实现websocket客户端并发送二进制消息。
ws的server端参考这篇文章。

1:正文

抽象类AbstractWebsocketClient定义了发送二进制数据的方法:

public abstract class AbstractWebsocketClient implements Closeable {/*** 发送消息.<br>** @param message 发送文本*/public void send(String message) throws MyException {Channel channel = getChannel();if (channel != null) {channel.writeAndFlush(new TextWebSocketFrame(message));return;}throw new MyException("连接已经关闭");}/*** 发送消息.<br>** @param message 二进制消息*/public void sendBinary(byte[] message) throws MyException {
//        System.out.println("AbstractWebsocketClient.sendBinary: 发送二进制数据:" + message.length);Channel channel = getChannel();if (channel != null) {
//            channel.writeAndFlush(new TextWebSocketFrame(message));ByteBuf byteBuf = Unpooled.directBuffer(message.length);byteBuf.writeBytes(message);
//            channel.writeAndFlush(new BinaryWebSocketFrame(message));channel.writeAndFlush(new BinaryWebSocketFrame(byteBuf));return;}throw new MyException("连接已经关闭");}
}    

方法sendBinary就是发送二进制数据,接着测试:

package com.dahuyou.netty.ws.client;//import lombok.extern.slf4j.Slf4j;import org.omg.PortableServer.THREAD_POLICY_ID;import java.io.File;
import java.io.FileInputStream;
import java.net.URISyntaxException;//@Slf4j
public class Test {public static void main(String[] args) throws Exception {WebsocketClient websocketClient = new WebsocketClient("ws://127.0.0.1:9898/chat");
//        try (WebsocketClient websocketClient = new WebsocketClient("ws://127.0.0.1:9898/chat")) {// 连接websocketClient.connect();// 发送消息
//            websocketClient.send("xxxxxxxxxxxxxxxxx");//            String fileName=FunasrWsClient.wavPath;
//        String fileName = "d:\\test\\ttsmaker-file-2024-9-19-18-51-21.wav";String fileName = "d:\\test\\ttsmaker-file-2024-9-29-11-28-50.wav";String suffix = fileName.split("\\.")[fileName.split("\\.").length - 1];
//            sendJson(mode, strChunkSize, chunkInterval, wavName, true,suffix);File file = new File(fileName);int sendChunkSize = 1920;int chunkSize = sendChunkSize;byte[] bytes = new byte[chunkSize];int readSize = 0;try (FileInputStream fis = new FileInputStream(file)) {
//                if (FunasrWsClient.wavPath.endsWith(".wav")) {
//                    fis.read(bytes, 0, 44); //skip first 44 wav header
//                }fis.read(bytes, 0, 44); //skip first 44 wav headerreadSize = fis.read(bytes, 0, chunkSize);while (readSize > 0) {// send when it is chunk sizeif (readSize == chunkSize) {
//                        send(bytes); // send buf to serverwebsocketClient.sendBinary(bytes);} else {// send when at last or not is chunk sizebyte[] tmpBytes = new byte[readSize];for (int i = 0; i < readSize; i++) {tmpBytes[i] = bytes[i];}
//                        send(tmpBytes);websocketClient.sendBinary(tmpBytes);}readSize = fis.read(bytes, 0, chunkSize);Thread.sleep(200);}// 发送空白音
//            while (readSize > 0) {for (;;) {websocketClient.sendBinary(new byte[chunkSize]);Thread.sleep(200);}//            Thread.sleep(10000000);} catch (Exception e) {e.printStackTrace();}// 阻塞一下,否则这里客户端会调用close方法Thread.sleep(10);
//        } catch (URISyntaxException | MyException | InterruptedException e) {
            log.error("发生异常,原因:{}", e.getMessage(), e);
//            System.out.println("发生异常,原因:{}" +  e.getMessage() + " e:" + e);
//        }}
}

ttsmaker-file-2024-9-29-11-28-50.wav。
我这里是通过读取一个音频文件实现二进制数据读取的,实际情况下你可以根据具体情况来修改即可。
运行:
在这里插入图片描述
你的ws server端write回什么内容这里就会输出什么内容,所以不必纠结我这里输出的信息,能通即可!!!

写在后面

文章只给出了关键点,具体的大家还是看源码哈!

参考文章列表

【netty客户端】通过netty实现封装websocket客户端。

netty编程之基于websocket接收二进制数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/435094.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Immich部署与访问】自托管媒体文件备份服务 Immich 本地化部署与远程访问存储数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 本篇文章介绍如何在本地搭建lmmich图片管理软件&#xff0c;并结合cpolar内网穿透实现公网远程访问到局域网内的lmmich&#…

【C++】STL详解之string类

目录 什么是STL STL的版本 STL的六大组件 STL的缺陷 一.string的定义方式 二. string的插入 1.使用push_back进行尾插 2.使用insert插入 三.string的拼接 四.string的删除 1.使用pop_back进行尾删 2.使用erase进行删除 五.string的查找 1.使用find正向搜索第一个…

Python 将数据写入 excel(新手入门)

一、场景分析 假设有如下一组列表数据&#xff1a; 写一段 python脚本 将这组数据写入一个新建的 excel&#xff0c;表头是 【序号】、【姓名】、【性别】、【年龄】 student_list [{name:小林, gender:男, age:10}, {name:小红, gender:女, age:11}, {name:小王, gender:男…

了解输出电源优先级

主要又SUB&#xff0c;SBU以及USB三种模式。 调试10kW逆变器存在的输出电源优先级的问题&#xff0c;当优先级为SUB时&#xff0c;利用电压源模拟电池&#xff0c;当电池电压超过58.4V&#xff0c;即过压&#xff0c;在接入市电&#xff0c;市电继电器仍然闭合&#xff0c;仍然…

JS加密=JS混淆?(JS加密、JS混淆,是一回事吗?)

JS加密、JS混淆&#xff0c;是一回事吗&#xff1f; 是的&#xff01;在国内&#xff0c;JS加密&#xff0c;其实就是指JS混淆。 1、当人们提起JS加密时&#xff0c;通常是指对JS代码进行混淆加密处理&#xff0c;而不是指JS加密算法&#xff08;如xor加密算法、md5加密算法、…

TCP三次握手四次挥手详解

TCP三次握手建立连接的过程&#xff1a; 一次握手&#xff1a;客户端发送带有 SYN&#xff08;seqx&#xff09;标志的数据包到服务端&#xff0c;然后客户端进入 SYN_SEND 状态&#xff0c;等待服务端的确认。二次握手&#xff1a;服务端收到 SYN 包后&#xff0c;发送带有 S…

深度解读 2024 Gartner DevOps 魔力象限

上周 Gartner 刚发布了 2024 年度的 DevOps 魔力象限。我们也第一时间来深度解读一下这份行业里最权威的报告。 和2023年对比 23 年入围 14 家厂商&#xff0c;24 年入围 11 家。4 家厂商从报告中消失&#xff0c;分别是 Bitrise, Codefresh, Google Cloud Platform (GCP), VM…

数据库软题3-专门的集合运算

一、投影&#xff08;筛选列&#xff09; 题1 题2 二、选择(筛选行) 三、连接 3.自然连接 题1-自然连接的属性列数&#xff08;几元关系&#xff09;和元组数 解析&#xff1a; 题2-自然连接的属性列数&#xff08;几元关系&#xff09;和元组数 自然连接后的属性个数 A列…

Angular与Vue的全方位对比分析

一、框架概述 Angular Angular是由Google开发和维护的一款开源JavaScript框架。它采用TypeScript编写&#xff0c;具有一套完整的开发工具和规范。Angular遵循MVC&#xff08;Model - View - Controller&#xff09;或更确切地说是MVVM&#xff08;Model - View - ViewModel&a…

WEB服务器——Tomcat

服务器是可以使用java完成编写&#xff0c;是可以接受页面发送的请求和响应数据给前端浏览器的&#xff0c;而在开发中真正用到的Web服务器&#xff0c;我们不会自己写的&#xff0c;都是使用目前比较流行的web服务器。 如&#xff1a;Tomcat 1. 简介 Tomcat 是一个开源的轻量…

无人机飞手入伍当兵技术优势分析

随着现代战争形态的不断演变&#xff0c;无人机技术在军事领域的应用日益广泛&#xff0c;成为提升军队作战能力的重要手段。对于无人机飞手而言&#xff0c;其专业技能和实战经验在入伍当兵后能够转化为显著的技术优势&#xff0c;为国防事业贡献重要力量。以下是从专业技能优…

cpu路、核、线程、主频、缓存

路&#xff1a;主板插口实际插入的 CPU 个数&#xff0c;也可以理解为主板上支持的CPU的数量。每个CPU插槽可以插入一个物理处理器芯片。例如&#xff0c;一台服务器可能有2路或4路插槽&#xff0c;这意味着它最多可以安装2个或4个物理处理器。 核&#xff1a;单块 CPU 上面能…

Llama微调以及Ollama部署

1 Llama微调 在基础模型的基础上&#xff0c;通过一些特定的数据集&#xff0c;将具有特定功能加在原有的模型上。 1.1 效果对比 特定数据集 未使用微调的基础模型的回答 使用微调后的回答 1.2 基础模型 基础大模型我选择Mistral-7B-v0.3-Chinese-Chat-uncensored&#x…

sql-labs靶场

第一关&#xff08;get传参&#xff0c;单引号闭合&#xff0c;有回显&#xff0c;无过滤&#xff09; ?id-1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schemasecurity) -- 第二关&#xff08;get传参&#xff0c;无闭…

SpringBoot(Java)实现MQTT连接(本地Mosquitto)通讯调试

1.工作及使用背景 工作中需要跟收集各种硬件或传感器数据用于Web展示及统计计算分析&#xff0c;如电表、流量计、泵、控制器等物联网设备。 目前的思路及解决策略是使用力控或者杰控等组态软件实现数据的转储&#xff08;也会涉及收费问题&#xff09;&#xff0c;通过组态软件…

C++ -- 异常

C中的异常是用于处理程序执行过程中出现的错误情况。通过异常处理&#xff0c;程序可以在遇到错误时优雅地处理这些问题&#xff0c;而不是直接崩溃。 C语言处理错误的方式 C语言传统的处理错误的方式主要有两种&#xff1a; 终止程序&#xff1a;使用如assert这样的宏来检查…

RTX 5090、5080规格完整曝光,来看来看

近日&#xff0c;科技圈内再掀波澜&#xff0c;有知名博主独家揭秘了英伟达即将推出的RTX 5090与RTX 5080两款高端显卡的详尽规格&#xff0c;预示着显卡市场即将迎来新一轮的性能飞跃与定位分化。 据最新披露的信息&#xff0c;这两款显卡均采用了先进的PG144/145-SKU30 PCB设…

如何借助Java批量操作Excel文件?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 | 问题背景 在操作Excel的场景中&#xff0c;通常会有一些针对Excel的批量操作&#xff0c;批量的意思一般有两种&#xff1a; 对批量的Excel文件进行操作。如导入多个Excel文件…

若依--Request.js

编写一个request.js的基本类&#xff0c;封装一些信息&#xff0c;比如请求地址、响应时间、携带的token参数等等。 //创建一个axios实列这里的 import.meta.env.VITE_APP_BASE_API 表示这个基础 URL 的值来自于环境变量。通常&#xff0c;这种做法用于将不同环境&#xff08;…

vue3结合 vue-router和keepalive实现路由跳转保持滚动位置不改变(超级简易清晰)

1.首先我们在路由跳转页面设置keepalive(Seeall是我想实现结果的页面) 2. 想实现结果的页面中如果不是全屏实现滚动而是有单独的标签实现滚动效果