04_ok_java_websocket_端口转发_将服务器的流端口转到本地

ops/2024/12/19 13:31:42/

客户端socket

package com.example.filedemo.controller;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Base64;
import java.util.Timer;
import javax.sound.sampled.*;
public class AudioWebSocketClient extends WebSocketClient {public AudioWebSocketClient(URI serverUri) {super(serverUri);}@Overridepublic void onOpen(ServerHandshake handshakedata) {System.out.println("Connected to the server.");}@Overridepublic void onMessage(String message) {// 处理接收到的消息System.out.println("Received message: " + message);}@Overridepublic void onClose(int code, String reason, boolean remote) {System.out.println("Disconnected from server: " + reason);}@Overridepublic void onError(Exception ex) {ex.printStackTrace();}// 将 byte[] 转换为 Base64 编码的字符串public static String byteArrayToString(byte[] byteArray) {// 使用 Base64 编码将字节数组转换为字符串return Base64.getEncoder().encodeToString(byteArray);}// 从 Base64 字符串解码为 byte[]public static byte[] stringToByteArray(String base64String) {// 使用 Base64 解码字符串为字节数组return Base64.getDecoder().decode(base64String);}public static void main(String[] args) throws Exception {//URI serverUri = new URI("ws://yourserverip:9395/dotcwsasr?lanid=0&userid=1121212&token=1234567890&sid=sid1001");URI serverUri = new URI("ws://127.0.0.1:8888");AudioWebSocketClient client = new AudioWebSocketClient(serverUri);client.connectBlocking();//字符串socket请求//        while (true) {//            client.send("Hello, WebSocket server!@@@@@@@@@@@@@@@@@@@@@@@@@");//        }//声音流socket请求
//        File file = new File("D:\\work\\20241213\\3.wav");
//        AudioInputStream audioInputStream = null;
//        try {
//            audioInputStream = AudioSystem.getAudioInputStream(file);
//        } catch (UnsupportedAudioFileException e) {
//            throw new RuntimeException(e);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//        AudioFormat format = audioInputStream.getFormat();
//        int bufferSize = 3200;
//        byte[] buffer = new byte[bufferSize];
//        int bytesRead;
//        while (true) {
//            try {
//                if (!((bytesRead = audioInputStream.read(buffer)) != -1)) {
//                    break;
//                } else {
//                    byte[] smallerBuffer = new byte[bytesRead];
//                    System.arraycopy(buffer, 0, smallerBuffer, 0, bytesRead);
//                    buffer = smallerBuffer;
//                    // String str = new String(buffer);
//                    client.send(byteArrayToString(buffer));
//                    // client.send(buffer);
//                }
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//        }
//        try {
//            audioInputStream.close();
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }//麦克风声音socket请求try {// 设置音频格式AudioFormat format = new AudioFormat(16000, 16, 1, true, false);DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);// 检查是否支持if (!AudioSystem.isLineSupported(info)) {System.out.println("Line not supported");return;}// 打开 TargetDataLineTargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);line.open(format);// 启动采集line.start();// 创建缓冲区byte[] buffer = new byte[3200]; // 每次读取 3200 字节,等同于 1600 采样点(16K 采样率,16-bit 单声道)while (true) {// 读取音频数据到缓冲区int bytesRead = line.read(buffer, 0, buffer.length);if (bytesRead > 0) {byte[] smallerBuffer = new byte[3200];System.arraycopy(buffer, 0, smallerBuffer, 0, bytesRead);buffer = smallerBuffer;client.send(byteArrayToString(buffer));}}} catch (LineUnavailableException e) {e.printStackTrace();}}
}

服务端socket

package com.example.filedemo.controller;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.java_websocket.server.WebSocketServer;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;import java.net.InetSocketAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Base64;
public class WebSocketForwardingServer extends WebSocketServer {private WebSocketClient remoteWebSocket;// 远程 WebSocket 地址private String remoteWsUrl = "ws://YOURSERVERIP:9395/dotcwsasr?lanid=0&userid=123322&token=1234567890&sid=sid1001";public WebSocketForwardingServer(int port) {super(new InetSocketAddress(port));}// 将 byte[] 转换为 Base64 编码的字符串public static String byteArrayToString(byte[] byteArray) {// 使用 Base64 编码将字节数组转换为字符串return Base64.getEncoder().encodeToString(byteArray);}// 从 Base64 字符串解码为 byte[]public static byte[] stringToByteArray(String base64String) {// 使用 Base64 解码字符串为字节数组return Base64.getDecoder().decode(base64String);}@Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {System.out.println("Client connected: " + conn.getRemoteSocketAddress());// 建立连接到远程 WebSocketconnectToRemoteWebSocket(conn);}@Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {System.out.println("Client disconnected: " + conn.getRemoteSocketAddress());}// 用于控制连接过程// 需要从远程 WebSocket 获取数据的地址private static final String REMOTE_WEBSOCKET_URL = "ws://yourserverip:9395/dotcwsasr?lanid=0&userid=13606060253&token=1234567890&sid=sid1001";@Overridepublic void onMessage(WebSocket webSocket, String s) {remoteWebSocket.send(stringToByteArray(s));}@Overridepublic void onError(WebSocket conn, Exception ex) {ex.printStackTrace();}@Overridepublic void onStart() {System.out.println("onStart-------------------------- start  ");}// 连接到远程 WebSocket 服务private void connectToRemoteWebSocket(WebSocket clientWebSocket) {try {remoteWebSocket = new WebSocketClient(new URI(remoteWsUrl)) {private WebSocket[] connections;public WebSocket[] getConnections() {return connections;}@Overridepublic void onOpen(ServerHandshake handshakedata) {System.out.println("Connected to remote WebSocket server");}@Overridepublic void onMessage(String message) {clientWebSocket.send(message);}@Overridepublic void onClose(int code, String reason, boolean remote) {System.out.println("Remote WebSocket closed: " + reason);}@Overridepublic void onError(Exception ex) {ex.printStackTrace();}};remoteWebSocket.connectBlocking();} catch (URISyntaxException e) {e.printStackTrace();} catch (InterruptedException e) {throw new RuntimeException(e);}}static WebSocketForwardingServer server = new WebSocketForwardingServer(8888);public static void main(String[] args) {int port = 8888;  // 设置本地 WebSocket 服务器的端口server.start();System.out.println("Server started on port: " + port);}
}

POM

		<dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency>

http://www.ppmy.cn/ops/143191.html

相关文章

【论文笔记】CLIP-guided Prototype Modulating for Few-shot Action Recognition

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: CLIP-guided Prototype Mo…

Docker Desktop 4.37.0版本支持 命令行启动了

更新日志 Docker Desktop 4.37.0版本 支持命令行了&#xff0c;参考&#xff1a;https://docs.docker.com/desktop/release-notes/ 如下图所示 命令 点上图中的command line 可以看到相关的命令&#xff0c;如下图&#xff1a; 示例 以start为例&#xff0c;如下图所示&…

Nginx反向代理与负载均衡应用实践

Nginx反向代理与负载均衡应用实践 1.1 集群简介 简单地说 &#xff0c;集群就是指一组&#xff08;若干个&#xff09;相互独立的计算机 &#xff0c;利用高速通信网络组成的一 个较大的计算机服务系统 &#xff0c;每个集群节点&#xff08;即集群中的每台计算机&#xff09;…

uniapp小程序样式穿透

<script> export default {options: { styleIsolation: shared }, //加上这句小程序样式穿透也会有效果 }; </script><style lang"scss" scoped> ::v-deep .u-cell__body {background-color: #2a6ff6; } </style>

详细描述一下 Elasticsearch 更新和删除文档的过程。

1、删 除 和 更 新 也 都 是 写 操 作 &#xff0c; 但 是 Elasticsearch 中的 文 档 是 不 可 变 的 &#xff0c; 因 此 不 能被 删 除 或 者 改 动 以 展 示 其 变 更 &#xff1b; 2、磁盘 上 的 每 个 段 都 有 一 个 相 应 的 .del 文件 。当删 除 请 求 发 送 后 &#…

【设计模式】如何用C++实现观察者模式【发布订阅机制】

【设计模式】如何用C实现观察者模式【发布订阅机制】 一、问题背景 代码质量影响生活质量。最近工作中频繁接触各种设计模式&#xff0c;深刻体会到优秀的设计模式不仅能显著降低后续维护的压力&#xff0c;还能提升开发效率。观察者模式作为一种降低耦合度、提高扩展性的利器…

DNS协议 是什么?说说DNS 完整的查询过程?

DNS协议简介 DNS(Domain Name System,域名系统) 是一个用于将人类可读的域名(如www.example.com)转换为计算机可以理解的IP地址(如192.0.2.1)的协议。DNS类似于一个“电话簿”,它将域名和相应的IP地址关联起来,从而使得网络通信更加方便。每当你访问一个网站时,背后…

Leetcode 每日一题9.回文数

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是:回文数的解法 目录 ​编辑 问题描述 输入输出格式 示例 约束条件 进阶挑战 解决方案 问题分析 过题图片 字符串转换法 数学方法 算法解释 题目链接 结论 问题描述 给定一个整数 x&#xff0c;我们需要…