netty trojan

参考代码:https://github.com/kdyzm/trojan-client-netty
参考博客:
github代码作者的博客:https://blog.kdyzm.cn/post/71
trojan-go介绍:https://p4gefau1t.github.io/trojan-go/developer/trojan/
trojan协议介绍:https://trojan-gfw.github.io/trojan/protocol

使用

配置文件

在这里插入图片描述

查看是否生效

在这里插入图片描述

研究

责任链

在哪将数据发送到远程?

channelRead:48, TrojanClient2DestInboundHandler (com.kdyzm.trojan.client.netty.inbound)
invokeChannelRead:379, AbstractChannelHandlerContext (io.netty.channel)
invokeChannelRead:365, AbstractChannelHandlerContext (io.netty.channel)
fireChannelRead:357, AbstractChannelHandlerContext (io.netty.channel)
channelRead:1410, DefaultChannelPipeline$HeadContext (io.netty.channel)
invokeChannelRead:379, AbstractChannelHandlerContext (io.netty.channel)
access$600:61, AbstractChannelHandlerContext (io.netty.channel)
run:370, AbstractChannelHandlerContext$7 (io.netty.channel)
safeExecute:164, AbstractEventExecutor (io.netty.util.concurrent)
runAllTasks:472, SingleThreadEventExecutor (io.netty.util.concurrent)
run:500, NioEventLoop (io.netty.channel.nio)
run:989, SingleThreadEventExecutor$4 (io.netty.util.concurrent)
run:74, ThreadExecutorMap$2 (io.netty.util.internal)
run:30, FastThreadLocalRunnable (io.netty.util.concurrent)
run:842, Thread (java.lang)

发送流程

4-1线程 添加监听
com.kdyzm.trojan.client.netty.inbound.http.HttpProxyInboundHandler#proxyConnect
责任链:HttpServerCodec->HttpProxyInboundHandler
责任链初始化:com.kdyzm.trojan.client.netty.server.NettyServerInitializer#initChannel
主要目的:
1、创建客户端
2、向客户端添加监听(会在2-1线程中执行监听内容)。客户端创建完成后将服务端的责任链修改为TrojanClient2DestInboundHandler

2-1线程 添加任务 io.netty.channel.AbstractChannelHandlerContext#invokeChannelRead(io.netty.channel.AbstractChannelHandlerContext, java.lang.Object)
责任链:无(当责任链所属线程不是当前运行的线程时,会抛给所属线程)
主要目的:向服务端发送任务

4-1线程 添加任务
com.kdyzm.trojan.client.netty.inbound.TrojanClient2DestInboundHandler#channelRead
责任链:TrojanClient2DestInboundHandler
责任链初始化:com.kdyzm.trojan.client.netty.inbound.http.HttpProxyInboundHandler#proxyConnect
在这里插入图片描述
主要目的:调用客户端发送数据
在这里插入图片描述

接收流程

责任链:SslHandler->TrojanDest2ClientInboundHandler
责任链初始化:com.kdyzm.trojan.client.netty.inbound.http.HttpProxyInboundHandler#proxyConnect
在这里插入图片描述

主要目的:将客户端接收到的结果通过服务端返回给调用者

发收时线程切换?发的时候的切换为啥要那么复杂?是否可以优化?
每次请求都创建新的客户端与远程建立链接,这么做有点麻烦,是否可以让客户端与远程一致保持连接?这样代码逻辑应该会更清晰,不会出现"发送数据时线程反复切换"的情况。

发送协议

结合trojan协议规则分析代码实现

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

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

相关文章

2014年第三届数学建模国际赛小美赛A题吹口哨解题全过程文档及程序

2014年第三届数学建模国际赛小美赛 A题 吹口哨 原题再现: 哨子是一种小装置,当空气被迫通过开口时会发出声音。哨声的巨大而引人注目,使其对警察和体育裁判来说至关重要。当救生员、迷路的露营者或犯罪受害者使用它们时,它们可以…

创建springboot项目

SpringBoot 就相当于不需要配置文件的SpringSpringMVC。 常用的框架和第三方库都已经配置好了。 maven安装配置 管理项目依赖库的 maven的安装教程网上有很多,这里简单记录一下。 官网下载maven后并解压。 在其目录下添加一个目录repository 然后在conf目录下…

怎么制作有时效的文件二维码?二维码加密、有效期的设置技巧

在制作文件二维码的时候,如何设置文件的有效期呢?一般将文件生成二维码查看能够避免在微信或者QQ云端保存有时间限制的问题,而且扫码阅读文件或者下载文件也更加的方便。那么如果我们想要做一个文件类型的二维码,但是想要设置或者…

QT QString中mid()、left()、right()函数

mid函数原型: QString QString::mid(int position, int n -1) const 返回一个从position开始,长度为n的QString 类型的子串。position不能超出字符串长度,否则返回null;当从position开始的子串长度不够n或n为-1(缺省…

list集合

List集合 List集合的概述 有序集合(也称之为序列),用户可以精确的控制列表中的每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素 与 Set 集合不同,列表通常允许重复的元素 List 集合的特点 有…

Redis分布式缓存之主从哨兵分片集群

Redis主从 数据同步原理 Redis哨兵 Redis分片集群 集群伸缩:在集群中插入或删除某个节点 集群故障转移

vue2、vue3状态管理之vuex、pinia

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、状态管理之vuex1.1 State调用:1.2 Mutation在vuex中定义:在组件中使用: 1.3 Action在vuex中定义:将上面的减…

性能测试-jemeter:安装 / 基础使用

一、理解jemeter 官网-Apache JMeter-Apache JMeter™ JMeter是一款开源的性能测试工具,主要用于模拟大量用户并发访问目标服务器,以评估服务器的性能和稳定性。 JMeter可以执行以下任务序号用途描述1性能测试通过模拟多个用户在同一时间对服务器进行…

【Graylog】通过Pipelines在Graylog生成IP地理位置信息

序 在当今数字化时代,随着网络攻击的不断增加和全球化的用户活动,了解IP地址的地理位置信息变得越来越重要。对于网络安全和营销策略来说,掌握IP地址的地理信息可以带来许多好处。 接下里将介绍如何通过Graylog的Pipelines功能,…

linux开放tomcat 8080端口

1、查看8080是否开放 firewall-cmd --query-port8080/tcp查看已开启的端口 firewall-cmd --list-ports开启防火墙 systemctl start firewalld2、永久开放8080端口 firewall-cmd --zonepublic --add-port8080/tcp --permanent3、重加载(重启防火墙) …

如何开发一个类似美团小程序商家入驻

上线类似美团的小程序可以推动商业生态系统的优化和升级。小程序可以连接商家、用户和平台,促进信息流通和交易,提高整个生态系统的效率和效益。今天,我们分享如何开发一个类似美团小程序商家入驻的平台。大家点个关注点个赞,我们…

本地登陆页面:对本地搜索词进行排名的策略

位置着陆页没有得到足够的尊重。 你用你的姓名、地址、电话号码和工作时间来设置它们。也许您嵌入了用于行车路线的 Google 地图。 也许你写了一些没人会读的副本,如果你有多个位置,你在每一页上重复相同的副本,只是更改位置名称。 如果你…

408数据结构错题知识点拾遗

个人向错题相关部分整理,涵盖真题、模拟、课后习题等。 408相关: 408数据结构错题知识点拾遗 408数据结构常考算法基础训练等待完善 408计算机组成原理错题知识点拾遗408操作系统错题知识点拾遗等待完善408计算机网络错题知识点拾遗 408计算机网络各层协…

DRF从入门到精通五(路由组件、认证组件、权限组件、频率组件及认证、权限源码分析)

文章目录 一、路由组件REST framework提供了两个routeraction装饰器 二、认证组件(Authentication)三、权限组件(Permissions)内置权限类 四、频率组件(Throttling)五、权限组件源码分析六、认证组件源码分析 一、路由组件 对于视图集ViewSetMixin,我们除了可以自己…

JavaWeb的Servlet的入门和使用方法

1 什么是Servlet Servlet是Server Applet的简称,是用Java编写的是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输…

Elasticsearch:无需搜索 “Christmas” 即可找到有关圣诞节的书籍

随着假期的临近,我期待着变得舒适,拿起一本新书,享受轻松的时光。 但是使用搜索栏在线发现图书并不像看起来那么容易......大多数零售搜索引擎仅依赖于关键字搜索,当我们确切地知道我们正在寻找什么书名时,这很好&…

Servlet见解2

4 创建servlet的三种方式 4.1 实现Servlet接口的方式 import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException;WebServlet("/test1") public class Servlet1 implements Servlet {Overridepublic void init(ServletConf…

【前端技术】Vite vs Webpack

✨专栏介绍 在当今数字化时代,Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序,就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术,以及各种框架、库和工具…

克魔助手工具下载、注册和登录指南

下载安装克魔助手 摘要 本文介绍了如何下载安装克魔助手工具,以及注册和登录流程。通过简单的步骤,用户可以轻松获取并使用该工具,为后续的手机应用管理操作做好准备。 引言 克魔助手是一款免费的手机管理工具,通过该工具用户…

Python实现张万森下雪了的效果

写在前面 即将步入婚宴殿堂的女主林北星,遭遇了男友展宇的毁约,生活和工作也变得一团糟。与此同时,她被时光老人带回了十八岁的高三时光,重新开启了自己的人生。林北星摆脱了展宇的束缚,认真准备高考,想要…