参考代码: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协议规则分析代码实现