解决内网拉取企微会话存档代理问题的一种办法

问题:客户的服务都是内网的,不能直接访问外网;访问外网的话需要走kong网关才能出去。

会话存档官网说可以使用socket5http方式拉取会话存档;我这边尝试了直接使用kong网关的ip和端口配置进去,是访问不了的

我后面就又尝试了使用nginxsquid 做正向代理的方式使用http方式访问,也是没有成功;这两种做代理服务器为什么不能成功,没有理解;有知道的朋友可以告诉我一下,有成功使用这两个做代理服务器拉取消息成功的朋友可以分享下经验。

搞一个socket5的代理服务器是可以成功,我没有试过,但是问过踩过坑的人说这种方式可行。

如果懒得麻烦再搭一个代理服务器,那就可以自己动手写一个简单的代理服务器搞定它。

大概的交互流程如下:
在这里插入图片描述

下面是全部的代码,拷过去,调一调应该就能用了

ForwardProxyApplication

import xxx.ProxyService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.annotation.Resource;@SpringBootApplication
public class ForwardProxyApplication implements CommandLineRunner {@Resourceprivate ProxyService proxyService;public static void main(String[] args) {SpringApplication.run(ForwardProxyApplication.class, args);}@Overridepublic void run(String... args) throws Exception {proxyService.start(args);}
}

ProxyConfig

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;@Configuration
public class ProxyConfig {@Value("${socket.port}")public Integer socketPort;@Value("${proxy.host}")public String proxyHost;@Value("${proxy.port}")public Integer proxyPort;
}

ProxyService

import xxx.config.ProxyConfig;
import xxx.thread.ProxyHandleThread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Objects;@Service
public class ProxyService {private static final Logger logger = LoggerFactory.getLogger(ProxyService.class);@Resourceprivate ProxyConfig proxyConfig;public void start(String[] args) {ServerSocket ss = null;try {ss = new ServerSocket(proxyConfig.socketPort);logger.info("Server running at http://0.0.0.0:{}", proxyConfig.socketPort);} catch (IOException e1) {e1.printStackTrace();}while (true) {try {assert ss != null;Socket socket = ss.accept();socket.setSoTimeout(1000 * 60);String line = "";InputStream is = socket.getInputStream();String tempHost = "", host;int port = 80;String type = null;OutputStream os = socket.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));int temp = 1;StringBuilder sb = new StringBuilder();while ((line = br.readLine()) != null) {logger.info(line + "-----------------");if (temp == 1) {  type = line.split(" ")[0];if (type == null) continue;}temp++;String[] s1 = line.split(": ");if (line.isEmpty()) {break;}for (int i = 0; i < s1.length; i++) {if (s1[i].equalsIgnoreCase("host")) {tempHost = s1[i + 1];}}sb.append(line).append("\r\n");line = null;}sb.append("\r\n"); if (tempHost.split(":").length > 1) {port = Integer.parseInt(tempHost.split(":")[1]);}host = tempHost.split(":")[0];Socket proxySocket = null;if (host != null && !host.equals("")) {// todo 这里最重要的host = proxyConfig.proxyHost;port = proxyConfig.proxyPort;proxySocket = new Socket(host, port);proxySocket.setSoTimeout(1000 * 60);OutputStream proxyOs = proxySocket.getOutputStream();InputStream proxyIs = proxySocket.getInputStream();if (Objects.requireNonNull(type).equalsIgnoreCase("connect")) {  os.write("HTTP/1.1 200 Connection Established\r\n\r\n".getBytes());os.flush();} else {proxyOs.write(sb.toString().getBytes(StandardCharsets.UTF_8));proxyOs.flush();}new ProxyHandleThread(is, proxyOs).start(); //监听客户端传来消息并转发给服务器new ProxyHandleThread(proxyIs, os).start(); //监听服务器传来消息并转发给客户端}} catch (IOException e) {e.printStackTrace();}}}
}

ProxyHandleThread

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketTimeoutException;public class ProxyHandleThread extends Thread {private final InputStream input;private final OutputStream output;public ProxyHandleThread(InputStream input, OutputStream output) {this.input = input;this.output = output;}@Overridepublic void run() {try {BufferedInputStream bis = new BufferedInputStream(input);byte[] buffer = new byte[1024];int length = -1;while ((length = bis.read(buffer)) != -1) {output.write(buffer, 0, length);length = -1;}output.flush();try {Thread.sleep(5000);     //不能执行完了,就把线程关掉,不然双方交互的数据还没有处理完,这里写了个睡眠 5s,可以酌情考虑} catch (InterruptedException e) {e.printStackTrace();}} catch (SocketTimeoutException e) {try {input.close();output.close();} catch (IOException e1) {e1.printStackTrace();}} catch (IOException e) {e.printStackTrace();} finally {try {input.close();output.close();} catch (IOException e) {e.printStackTrace();}}}
}

没有搞定的,可以加好友一起聊聊,请备注csdn加我的
在这里插入图片描述

感谢 https://blog.csdn.net/jumprn/article/details/90173852

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

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

相关文章

飞桨EasyDL-Mac本地部署离线SDK-Linux集成Python

前言&#xff1a;本文对使用飞桨EasyDL桌面版实现本地部署物体检测做一下说明 一、训练模型 如何使用飞桨EasyDL桌面版这里就不再赘述&#xff0c;直接参照官方文档进行物体检测模型训练。 飞桨EasyDL桌面版-用零代码开发实现物体检测https://ai.baidu.com/ai-doc/EASYDL/Tl2…

常识判断 --- 科技常识

目录 力与热 光和声 航空成就 垃圾分类 百科知识 血型 二十四节气歌 春雨惊春清谷天 夏满忙夏暑相连 秋处露秋寒霜降 冬雪雪冬小大寒 力与热 光和声 航空成就 垃圾分类 百科知识 血型

【算法系列篇】哈希表

文章目录 前言1. 两数之和1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 判断是否为字符重排2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 存在重复元素3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 存在重复元素II4.2 题目要求4.2 做题思路4.3 Java代码实现 5. 字母异位词分…

ThreeJS-3D教学三:平移缩放+物体沿轨迹运动

我们在项目中会有一些这样的需求&#xff0c;我们可视化一个场景&#xff0c;需要俯视、平移、缩放&#xff0c;方便观察场景中的数据或者模型&#xff0c;之所以把这个案例拿出来 1、这是个很实用的需求&#xff0c;我相信很多人会用到 2、我自己认为在实际案例中我们可以学习…

[NOIP2011 提高组] 选择客栈

[NOIP2011 提高组] 选择客栈 题目描述 丽江河边有 n n n 家很有特色的客栈&#xff0c;客栈按照其位置顺序从 1 1 1 到 n n n 编号。每家客栈都按照某一种色调进行装饰&#xff08;总共 k k k 种&#xff0c;用整数 0 ∼ k − 1 0 \sim k-1 0∼k−1 表示&#xff09;&am…

利用EasyX绘制国旗

所谓国庆&#xff0c;举国同庆 今天我就来分享一下利用图形库来制作一个比例版缩小的五星红旗&#xff08;尽量精确了&#xff09; 需要利用到前边的知识note2基本图形的绘制 进入正题 五星红旗的长和高之比为三比二 创建一个长为960像素&#xff0c;宽为640像素的窗体 更…

Vue3.0跨端Web SDK访问微信小程序云储存,文件上传路径不存在/文件受损无法显示问题(已解决)

整理需求&#xff1a; 需要vue3.0作为pc端的后台管理来连接微信小程序客户端需要Web SDK的引入&#xff0c;实现vue3.0接入云开发环境需要以云环境作为线上服务器&#xff0c;将vue3.0上传的本地文件通过云环境进入云储存&#xff0c;并将文件在云端生成云端快捷访问路径及htt…

排序---P1781 宇宙总统

思路&#xff1a; 当我们要对这些超大数进行比较排序时&#xff0c;如果我们用int或long基本数据类型时&#xff0c;会超出能承载的范围&#xff0c;因此我们选择用引用数据类型&#xff1a;BigDecimal或BigInteger。 区别在于基本数据类型直接比较大小&#xff0c;而是调用这…

【吞噬星空】连播两集,尼赫鲁对徐欣动手,罗峰修分身强势复仇

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析吞噬星空资讯。 吞噬星空动画第四季定档之后&#xff0c;官方真的是太宠粉了&#xff0c;每天都会公布全新预告情报&#xff0c;无论是外星人物角色&#xff0c;亦或者宇宙星球建模&#xff0c;那都是相当的炸裂。如今更…

python操作.xlsx文件

from openpyxl import load_workbook from openpyxl.styles import Font,colors, Alignment from openpyxl.styles import Border, Side #打开已经存在的Excel workbook load_workbook(filenameC:\\Users\\yh\\Documents\\测试.xlsx) #创建表&#xff08;sheet&#xff09;,插…

ubuntu下源码编译方式安装opencv

基础条件 ubuntu 20.04 opencv 3.4.3 opencv 源码编译的安装步骤 第一步&#xff0c; 首先clone源码 git clone https://github.com/opencv/opencv.git第二步&#xff0c;依赖包&#xff0c;执行下面的命令 sudo apt-get install build-essential sudo apt-get install cmak…

基于Springboot实现餐厅点餐系统演示【项目源码+论文说明】分享

基于Springboot实现餐厅点餐系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff…

【新的小主机】向日葵远程控制ubuntu

向日葵远程控制ubuntu 一、简介二、问题及解决方法2.1 向日葵远程连接Ubuntu22主机黑屏&#xff1f;2.2 Ubuntu如何向日葵开机自启&#xff1f;2.3 无显示器情况下&#xff0c;windows远程桌面连接Ubuntu? 三、美化桌面3.1 安装/解压3.2 设置 四、安装docker容器及部署微服务4…

【考研数学】高等数学第七模块 —— 曲线积分与曲面积分 | 3. 对面积的曲面积分(第一类曲面积分)

文章目录 二、曲面积分2.1 对面积的曲面积分&#xff08;第一类曲面积分&#xff09;2.1.1 问题引入 —— 曲面的质量2.1.2 对面积的曲面积分定义及性质2.1.3 对面积的曲面积分的计算法 写在最后 二、曲面积分 2.1 对面积的曲面积分&#xff08;第一类曲面积分&#xff09; 2…

LIMS实验室信息管理系统源码 基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体

LIMS 是一个集现代化管理思想与基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体&#xff0c;以实验室业务和管理工作为核心&#xff0c;遵循实验室管理国际规范&#xff0c;实现对实验室全方位管理的信息管理系统。 LIMS将样品管理、数据管理…

基于51单片机NEC协议红外遥控发送接收仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

基于51单片机NEC协议红外遥控发送接收仿真设计 讲解视频1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机NEC协议红外遥控发送接收仿真设计 51单片机红外发送接收仿真设计( proteus仿真程序原理图报告讲解视频…

阿里云RDS关系型数据库详细介绍_多版本数据库说明

阿里云RDS关系型数据库大全&#xff0c;关系型数据库包括MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;阿里云百科分享阿里云RDS关系型数据库大全&#xff1a; 目录 阿里云RDS关系型数据库大全 …

德国云安全协作软件提供商【Rencore】完成800万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于德国慕尼黑的云安全协作软件提供商Rencore今日宣布已完成800万美元融资。 本轮融资由UVC Partners领投。 该公司打算利用这笔资金进一步投资于其云协作治理产品的增长。 Rencore由Matthi…

小谈设计模式(12)—迪米特法则

小谈设计模式&#xff08;12&#xff09;—迪米特法则 专栏介绍专栏地址专栏介绍 迪米特法则核心思想这里的“朋友”指当前对象本身以参数形式传入当前对象的对象当前对象的成员变量直接引用的对象目标 Java程序实现程序分析 总结 专栏介绍 专栏地址 link 专栏介绍 主要对目…

EasyEdge 智能边缘控制台通过sdk发布应用

离线部署SDK生成 模型部署完成后会出现下载SDK的按钮&#xff0c;点击按钮下载SDK并保存好SDK。 进入EasyDL官网的技术文档 安装智能边缘控制台 跟着教程&#xff0c;完成安装&#xff1a;点此链接 树莓派4b是Linux arm64的架构&#xff0c;点击对应的链接进行下载。 下载完成…