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

news/2024/12/20 14:26:36/

客户端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/news/1556659.html

相关文章

设计模式-创建者模式-单例模式(java版)

&#xff08;有的事情需要提前说明一下&#xff0c;哥们英语不好&#xff0c;在自己学习过程中写的代码有的可能会以中文命名&#xff0c;介意者出门左拐&#xff0c;不介意的继续往下看&#xff09; 定义&#xff1a;单例模式(Singleton Patern)是Java 中最简单的设计模式之一…

(有源码)基于springboot+vue的农产品直卖平台的设计与实现 P10076 计算机毕业设计

项目说明 本号所发布的项目均由我部署运行验证&#xff0c;可保证项目系统正常运行&#xff0c;以及提供完整源码。 如需要远程部署/定制/讲解系统&#xff0c;可以联系我。定制项目未经同意不会上传&#xff01; 项目源码获取方式放在文章末尾处 注&#xff1a;项目仅供学…

12月22日!蓝桥杯MWORKS新赛道「智能装备数字化建模大赛」总决赛暨颁奖典礼即将启幕

为强化装备数字化人才培养&#xff0c;推动装备数字化技术快速发展&#xff0c;第十六届蓝桥杯全国软件和信息技术专业人才大赛设置专项赛暨智能装备数字化建模大赛&#xff0c;使用MWORKS作为参赛软件。关于参赛软件授权、技术支持与培训等赛事服务均由MWORKS技术团队提供。 …

王佩丰24节Excel学习笔记——第十一讲:Vlookup函数

【以 Excel2010 系列学习&#xff0c;用 Office LTSC 专业增强版 2021 实践】 【本章小技巧】 掌握vlookup使用方法&#xff0c;选区的第一列一定是查询参数条件一。使用通配符查询。vlookup 限 255 位长度。掌握日常使用场景。使用vlookup模糊匹配查询个税 一、使用Vlookup函…

深度学习之目标检测篇——残差网络与FPN结合

特征金字塔多尺度融合特征金字塔的网络原理 这里是基于resnet网络与Fpn做的结合&#xff0c;主要把resnet中的特征层利用FPN的思想一起结合&#xff0c;实现resnet_fpn。增强目标检测backone的有效性。代码实现如下&#xff1a; import torch from torch import Tensor from c…

架构未来:深入探索最热门的编程语言开发框架

开发框架组件简介 开发框架是程序员用来加速开发并确保代码质量的基础组件之一。在不同的编程语言中&#xff0c;开发框架为开发人员提供了丰富的工具、库和最佳实践&#xff0c;帮助构建高效、可维护和安全的应用程序。本文将介绍几种常见编程语言的开发框架组件&#xff0c;…

web3跨链预言机协议-BandProtocol

项目简介 Band Protocol 项目最初于 2017年成立并建立在 ETH 之上。后于2020年转移到了 Cosmos 网络上&#xff0c;基于 Cosmos SDK 搭建了一条 Band Chain 。这是一条 oracle-specific chain&#xff0c;主要功能是提供跨链预言机服务。Cosmos生态上第一个&#xff0c;也是目…

「iOS」通过CoreLocation Framework深入了解MVC架构

「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构 文章目录 「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构前言CoreLocation了解根据需求建模设计属性方法设计协议传值Block传值KVONotification通知方式 总结参考文章 前言 在这个学期的前…