最近突然想到了一个可以绕开单位安全管控软件,让单位内部办公电脑连上外网的方法。大概是这个样子,让单位办公电脑与自己的外网电脑进行蓝牙配对,然后用配对成功的蓝牙进行网络数据交互。这里大家可能会想用一下蓝牙的网络共享功能,分分钟不就实现了,其实这里是有问题的,因为这样会在单位内部办公电脑上虚拟出一个网卡,马上会被单位安全管控软件识别,进而被网络管理员发现,至少我们单位是这样的,所以不能这样用,我这里用Java写了一个蓝牙数据通讯的程序,同时考虑到蓝牙数据通讯较慢,直接用浏览器访问太慢,又用Python爬了几个自己经常访问的网站,用爬虫只访问有用信息,减少蓝牙数据通讯的数据量,最后总体感觉相当不错。下面以办公电脑连接外网实现中英文翻译为例进行介绍。拓扑图如下:

蓝牙数据交换功能用Java语言实现,其中用到了[bluecove-2.1.1.jar]蓝牙功能操作包。客户端安装在内网电脑上(比如办公电脑),在接收到内网电脑访问外部网络访的Socket请求后,自动与外网电脑进行蓝牙连接,并将Socket通讯数据转为蓝牙通讯数据,镜像至外网,主要代码如下:

public class SocketServer {private String bluetoothRemoteUrl = null;public SocketServer() {}public void start() throws IOException {try (ServerSocket server = new ServerSocket(SocketConfig.SERVER_PORT,SocketConfig.SERVER_BACKLOG,InetAddress.getByName(SocketConfig.SERVER_ADDRESS))) {System.out.print("Socket通讯监听[" + SocketConfig.SERVER_ADDRESS + ":" + SocketConfig.SERVER_PORT + "]启动成功...");ExecutorService service = Executors.newFixedThreadPool(BluetoothConfig.SERVICE_POOL);System.out.println("服务线程池[" + BluetoothConfig.SERVICE_POOL + "]初始化成功...");Socket socket = null;BluetoothChannel channel = null;while(true) {try {socket = server.accept();System.out.println("客户端[" + socket.getInetAddress().getHostAddress() + "]已连接...");}catch(Exception e) {System.out.println("客户端连接错误[" + e.getMessage() + "]");if (socket != null) {socket.close();}continue;}System.out.print("开始与蓝牙服务[" + BluetoothConfig.REMOTE_UUID + "@" + BluetoothConfig.REMOTE_ADDRESS + "]建立连接...");try {if (StrUtil.isBlank(bluetoothRemoteUrl)) {bluetoothRemoteUrl = BluetoothTools.fetchRemoteUrl(BluetoothConfig.REMOTE_ADDRESS,new UUID(BluetoothConfig.REMOTE_UUID,true),ServiceRecord.NOAUTHENTICATE_NOENCRYPT,false);}channel = BluetoothTools.open(bluetoothRemoteUrl);System.out.println("已连接");}catch (Exception e) {System.out.println("连接错误[" + e.getMessage() + "]");if (socket != null) {socket.close();}if (channel != null) {channel.close();}continue;}service.execute(new SendService(socket,channel));service.execute(new RecvService(socket,channel));}}}

服务端安装在外网电脑,在接收到客户端蓝牙连接请求后,自动与代理服务器(或目标网站)进行Socket连接,并重新将蓝牙通讯数据转为Socket通讯数据,发送至代理服务器(或目标网站),然后接收代理服务器(或目标网站)响应,镜像至客户端,主要服务端代码如下:

public class BluetoothServer {public BluetoothServer() {}public void start() throws BluetoothStateException,IOException {LocalDevice bluetooth = LocalDevice.getLocalDevice();bluetooth.setDiscoverable(DiscoveryAgent.GIAC);StreamConnectionNotifier notifier = (StreamConnectionNotifier)Connector.open("btspp://localhost:" + BluetoothTools.genUuid(BluetoothConfig.SERVICE_UUID, true)+ ";name=" + BluetoothConfig.SERVICE_NAME);System.out.print("蓝牙[" + bluetooth.getFriendlyName() + "]"+ "通讯监听[" + BluetoothConfig.SERVICE_UUID + "@" + bluetooth.getBluetoothAddress() + "]启动成功...");ExecutorService service = Executors.newFixedThreadPool(BluetoothConfig.SERVICE_POOL);System.out.println("服务线程池[" + BluetoothConfig.SERVICE_POOL + "]初始化成功...");BluetoothChannel channel = null;RemoteDevice device = null;Socket socket = null;while(true) {try {channel = new BluetoothChannel(notifier.acceptAndOpen());device = RemoteDevice.getRemoteDevice(channel.getStreamConnection());System.out.println("客户端蓝牙[" + device.getFriendlyName(true) + "]"+ "[" + device.getBluetoothAddress() + "]已连接...");}catch (Exception e) {System.out.println("客户端蓝牙连接错误[" + e.getMessage() + "]");if (channel != null) {channel.close();}continue;}System.out.print("开始与目标服务器[" + SocketConfig.TARGET_ADDRESS + ":" + SocketConfig.TARGET_PORT + "]建立连接...");try {socket = new Socket();socket.connect(new InetSocketAddress(SocketConfig.TARGET_ADDRESS,SocketConfig.TARGET_PORT),SocketConfig.TARGET_COTIMEOUT);socket.setSoTimeout(SocketConfig.TARGET_SOTIMEOUT);System.out.println("已连接");}catch (Exception e) {System.out.println("连接错误[" + e.getMessage() + "]");if (socket != null) {socket.close();}if (channel != null) {channel.close();}continue;}service.execute(new SendService(socket,channel));service.execute(new RecvService(socket,channel));}}}

蓝牙数据流处理主要代码如下:

public class BluetoothChannel implements Closeable {private StreamConnection connection = null;private DataInputStream dInStrm = null;private DataOutputStream dOutStrm = null;private boolean closed = true;public BluetoothChannel(StreamConnection connection)throws IOException {this.connection = connection;this.dInStrm = connection.openDataInputStream();this.dOutStrm = connection.openDataOutputStream();this.closed = false;}public DataInputStream getDataInputStream() {return this.dInStrm;}public DataOutputStream getDataOutputStream() {return this.dOutStrm;}public boolean isClosed() {return this.closed;}@Overridepublic void close() throws IOException {dOutStrm.close();dInStrm.close();connection.close();closed = true;}}

数据接收主要代码下:

public class RecvService implements Runnable {private Socket socket = null;private BluetoothChannel channel = null;public RecvService(Socket socket,BluetoothChannel channel) {this.socket = socket;this.channel = channel;}@Overridepublic void run() {try {InputStream in = channel.getDataInputStream();OutputStream out = new DataOutputStream(socket.getOutputStream());int len = 0;byte[] data = new byte[CommonConfig.STREAM_BUFFER];try {while((len = in.read(data,0,CommonConfig.STREAM_BUFFER)) != -1) {out.write(data,0,len);out.flush();}} catch (IOException e) {}if (!channel.isClosed()) {channel.close();}if (!socket.isClosed()) {socket.close();}}catch (Exception e) {System.out.println("数据通讯处理错误[" + e.getMessage() + "]");e.printStackTrace();}}}

数据发送主要代码如下:

public class SendService implements Runnable {private Socket socket = null;private BluetoothChannel channel = null;public SendService(Socket socket,BluetoothChannel channel) {this.socket = socket;this.channel = channel;}@Overridepublic void run() {try {InputStream in = new DataInputStream(socket.getInputStream());OutputStream out = channel.getDataOutputStream();int len = 0;byte[] data = new byte[CommonConfig.STREAM_BUFFER];try {while ((len = in.read(data,0,CommonConfig.STREAM_BUFFER)) != -1) {out.write(data,0,len);out.flush();}}catch (IOException e) {}if (!socket.isClosed()) {socket.close();}if (!channel.isClosed()) {channel.close();}}catch (Exception e) {System.out.println("数据通讯处理错误[" + e.getMessage() + "]");e.printStackTrace();}}}

注:以上java程序只是实现通过蓝牙通讯实现内外网数据的镜像,没有代理功能,所以如果要实现对外网网站的访问还需要在外网电脑上安装代理服务器(可以使用目前较为流行的开源代理服务器nginx)。

中英文翻译应用为用Python写的一段爬虫程序,使用cmd命令行下打开(python lexi.py),自动识别中英文,输入中文翻译成英文,输入英文翻译成中文。主要用到了requests包。具体代码如下:

# -*- coding:utf-8 -*-import json
import reimport requestsheaders = {'accept':'application/json, text/plain, */*','accept-encoding':'gzip, deflate, br, zstd','accept-language':'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','connection':'keep-alive','cookie':'ABTEST=0|1746782609|v17; SUID=1551A20B3E50A20B00000000681DC991; wuid=1746782609372; SUV=1746782609241; SNUID=93D7248D8680B23602BCFFD687A0005C; translate.sess=4b4c4608-becd-44e0-987c-d4e520a81c55; SGINPUT_UPSCREEN=1746782613767; FQV=d0ca8207c4cbb93a9ca15fda8d652a86','host':'fanyi.sogou.com','origin':'http://fanyi.sogou.com','referer':'http://fanyi.sogou.com/text','sec-ch-ua':'"Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"','sec-ch-ua-mobile':'?0','sec-ch-ua-platform':'"Windows"','sec-fetch-dest':'empty','sec-fetch-mode':'cors','sec-fetch-site':'same-origin','content-type':'application/json; charset=utf-8','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0'
}
pattern = re.compile(pattern = r'<script>window\.__INITIAL_STATE__=(?P<data>.*?);\(function\(\){.*?</script>',flags = re.S)  #爬取翻译数据正则
proxies = {'http': 'http://xx.xx.xx.xx:xxxx'    #填写安装在内网的客户端地址
}def http_get(keyword,trans_to):response = requests.get(url = f'http://fanyi.sogou.com/text?keyword={keyword}&transfrom=auto&transto={trans_to}&model=general',headers = headers,proxies = proxies)response.encoding = 'utf-8'text = Noneif (response.status_code == 200):text = response.textresponse.close()return textdef chinese_to_english(json):print('词典释义:')for mean  in json['textTranslate']['translateData']['wordCard']['secondQuery']:print(f'  {mean['k']:<20}{mean['v']}')print('\n翻译结果:')print(f'  {json['textTranslate']['translateData']['sentencesData']['data']['trans_result'][0]['trans_text']}')def english_to_chinese(json):print('读音:')voices = json['voice']['from'].get('list')if (voices):for voice in voices:print(f'  {voice['abbr']}[{voice['phonetic']}]',end='')print('\n词典释义:')for mean in json['textTranslate']['translateData']['wordCard']['usualDict']:print(f'  {mean['pos']:<10}{mean['values'][0]}')print('\n翻译结果:')print(f'  {json['textTranslate']['translateData']['translate']['dit']}')def is_chinese_char(char):#根据Unicode编码范围,判断是否是中文字符if (char >= '\u4e00' and char <= '\u9fff') \or (char >= '\u3400' and char <= '\u4dbf') \or (char >= '\u20000' and char <= '\u2a6df') \or (char >= '\u3000' and char <= '\u303f'):return Trueelse:return Falsedef is_chinese_str(str):#统计字符串中的中文字符数count = sum(1 for c in str if is_chinese_char(c))if (len(str) / 2 <= count): #中文字符数占主导认为是中文(中文字符超过一半)return Trueelse:return Falseif (__name__ == '__main__'):print('翻译程序已启动...按[.]或[。]退出...')while (True):keyword = input('>')if ('.' == keyword or '。' == keyword): #按下 . 或 。 退出应用exit(0)if (is_chinese_str(keyword)):#通过正则提取翻译结果数据data = pattern.search(string = http_get(keyword = keyword, trans_to = 'en')).group('data')if (not data):print('响应数据异常')exit(10)chinese_to_english(json.loads(data))else:#通过正则提取翻译结果数据data = pattern.search(string = http_get(keyword = keyword, trans_to = 'zh-CHS')).group('data')if (not data):print('响应数据异常')exit(10)english_to_chinese(json.loads(data))

整个程序效果如下:

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

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

相关文章

硬件面经-具身机器人通用技术要求

目录 简介 场景 技术面试 设计知识点 总结 简介 最近机器人特别的火。所以收集了一些关于机器人的面试及要求 场景 目前具身机器人赛道可谓是十分火热,全国大大小小崛起了几十家具身机器人公司,国外比较出名的有波士顿动力,特斯拉等,国内目前比较火的就是宇树,众擎…

DeepSeek生成HTML5图片拼接工具

让DeepSeek生成一个HTML5图片拼接工具&#xff0c;给的提示词如下 提示词(prompt) 帮我生成一个可以将两张图片拼接到一起的程序 支持横向拼接和竖向拼接&#xff0c;可以用html5实现功能吗&#xff1f; DeepSeek大概20秒左右就做好了&#xff0c;而且像这么简单的功能的话也没…

Java面试复习指南:Java基础、面向对象编程与并发编程

Java面试复习指南&#xff1a;Java基础、面向对象编程与并发编程 1. Java基础 概念解析: Java是一种面向对象的编程语言&#xff0c;具有跨平台的特性。 核心原理: JVM负责Java程序的跨平台运行&#xff0c;通过字节码来实现。 高频面试问题: Java如何实现跨平台&#xff…

LeeCode2566替换一个数字后的最大差值

项目场景&#xff1a; 给你一个整数 num 。你知道 Danny Mittal 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。 请你返回将 num 中 恰好一个 数字进行替换后&#xff0c;得到的最大值和最小值的差为多少。 注意&#xff1a; 当 Danny 将一个数字 d1 替换成另一个数字 …

李宏毅2025《机器学习》第三讲-AI的脑科学

在之前的课程中探讨了如何利用大模型构建AI Agent,本科将暂时放下应用层面的探索,拿起“手术刀”和“显微镜”,深入剖析LLM的“大脑”,带您踏上一场“AI脑神经科学”的旅程。课程不讨论模型的训练过程,而是假设我们拥有一个已经训练好的、功能完备的LLM。我们的目标是:理…

CVPR 2025 | 微米级光影CT精度!复旦腾讯优图开源Real-IAD D³数据集

【导读】 本文介绍了复旦联合腾讯优图发布高精度多模态数据集Real-IAD D&#xff0c;并基于此数据集提出了一种创新的多模态融合检测方法&#xff0c;数据集已被CVPR 2025收录&#xff0c;并开源。>>更多资讯可加入CV技术群获取了解哦~ 目录 一、Real-IAD D的创新之处…

解决mysql左连接加where就不会保留左表中的全部数据的问题

在SQL中使用MySQL的LEFT JOIN操作时,如果加入了WHERE条件,确实会影响结果集的完整性,特别是如果你在WHERE条件中使用了JOIN的另一张表中的字段作为过滤条件。这是因为当你在WHERE子句中加入了对JOIN另一张表的过滤条件时,实际上你是在执行一个INNER JOIN(内连接)而非LEFT…

算法与数据结构:动态规划DP

文章目录 动态规划算法全面解析一、核心思想与基本概念二、动态规划与其他算法的区别三、动态规划的解题步骤四、经典案例解析1. **斐波那契数列&#xff08;Fibonacci&#xff09;**2. **0-1背包问题&#xff08;0-1 Knapsack&#xff09;**3. **最长公共子序列&#xff08;LC…

Coilcraft电感上的横线是什么意思?电感有方向么?

通常我们会认为电容、电感、电阻这几类无源器件没有方向性&#xff0c;在布局和贴片时可以任意方向放置&#xff0c;也不会在PCB上增加丝印标识说明其方向。与此相互印证的是&#xff0c;电容表面无丝印&#xff0c;无法识别方向&#xff1b;电阻表面一般只有包含阻值大小的数字…

通过Docker挂载nginx并修改页面

1&#xff1a;通过docker创建nginx&#xff1a; 首先关闭原来的Docker&#xff08;防止端口号冲突&#xff09; sudo nginx -s stop 直接启动 Nginx 进程 sudo nginx 启动nginx&#xff1a; docker run -di --namemynginx -p 80:80 nginx cd /etc/nginx docker run -d …

力扣1124. 表现良好的最长时间段

这一题我看到数据范围是10^4&#xff0c;暗自窃喜能用双重循环&#xff0c;看题目是典型的前缀和哈希。不过需要一个转换将大于8小时的转化为1&#xff0c;其他都为-1&#xff0c;方便计算&#xff0c;之前的题目中也有这种方法。 那这样就简单了 class Solution { public:int…

EDA2算法速通(编者崩溃版)

这个内容是用来回忆一下EDA2涉及的算法和解题的主要步骤&#xff1a; 有疑问或发现错误可以私信来讨论 高级综合概述 柏拉图优化&#xff1a;这个是来判断是否有哪些节点能完全被其他节点优化掉。比如&#xff08;1,2&#xff09;这个节点就可以完全优化&#xff08;3,4&…

雷池waf配置第三方登录-钉钉配置详细教程

雷池waf配置第三方登录-钉钉配置详细教程 前往钉钉开放平台https://open.dingtalk.com/ 选择一个登录方式登录钉钉开放平台 选择一个自己所管理的组织 登录成功后点击我的后台 选择应用开发 在钉钉应用下点击创建应用 填写应用名称和应用描述后点击保存 点击网页…

神经网络中的均方误差(Mean Squared Error)详解

引言 在机器学习和神经网络领域&#xff0c;损失函数&#xff08;Loss Function&#xff09;是衡量模型预测值与真实值之间差异的关键指标。均方误差&#xff08;Mean Squared Error, MSE&#xff09;作为一种经典的损失函数&#xff0c;因其简单性、可解释性和数学上的优良性…

day036-lsyncd实时同步服务与网站存储架构

文章目录 1. 实时同步工具2. lsyncd 实时同步服务2.1 环境准备2.2 rsync准备2.2.1 服务端检查2.2.2 客户端检查2.2.3 备份测试 2.3 配置lsyncd2.3.1 安装软件2.3.2 编写配置文件 2.4 测试 3. 案例-网站存储架构3.1 rsync服务配置3.1.1 服务端配置3.1.2 客户端配置 3.2 lsyncd服…

React Native WebView键盘难题:如何让输入框不被键盘遮挡?

写在前面 “明明点击了输入框&#xff0c;键盘却把内容顶得不见踪影&#xff01;” —— 这可能是React Native开发者使用WebView时最头疼的问题之一。 想象一下&#xff1a;你的App内嵌了一个网页表单&#xff0c;用户兴奋地准备填写信息&#xff0c;结果键盘弹出后&#xf…

Web攻防-XSS跨站浏览器UXSS突变MXSSVueReactElectron框架JQuery库写法和版本

知识点&#xff1a; 1、Web攻防-XSS跨站-浏览器&转换-UXSS&MXSS 2、Web攻防-XSS跨站-框架和库-VUE&React&Electron&JQuery 分类&#xff1a; 1、框架或三方库的XSS(Vue、React、Electron、JQuery) 2、浏览器或插件的XSS(UXSS) 3、客户端预览内核的XSS(MXS…

PyTorch 中torch.clamp函数使用详解和实战示例

torch.clamp 是 PyTorch 中的一个非常有用的函数&#xff0c;它可以将张量的每个元素限制在一个指定的范围内&#xff0c;超出范围的元素将被裁剪为边界值。 函数签名&#xff1a; torch.clamp(input, minNone, maxNone, outNone)参数说明&#xff1a; input&#xff1a;输入…

详解Redis数据库和缓存不一致的情况及解决方案

数据库与缓存不一致是分布式系统中常见问题&#xff0c;本质是数据在缓存层和存储层出现版本差异。 一、并发写操作导致不一致&#xff08;最常见&#xff09; 场景描述 线程A更新数据库 → 线程B更新数据库 → 线程B更新缓存 → 线程A更新缓存 结果&#xff1a;缓存中存储的…

湖北理元理律师事务所:企业债务危机的“急诊科”式应对方案

当企业陷入债务危机时&#xff0c;传统“头痛医头”的应对往往加速死亡。本方案基于企业债务重组实务&#xff0c;提炼出 “止血-清创-修复”三阶急救体系&#xff0c;助力企业守住生存底线。 第一阶段&#xff1a;精准止血&#xff08;0-30天关键期&#xff09; 目标&#x…