前言
需求的出发点是这样,一个netty代理服务,里面有netty服务端 ServerBootstrap接收外部客户端连接,netty客户端 Bootstrap去连接外部服务端,但代理服务和服务端网络不一定可达,所以netty的客户端有时候就需要连一个跳板机去转发报文到外部服务。
这个跳板机也是netty实现的socks代理服务器,搭建流程可参考此文
netty系列之:从零到壹,搭建一个SOCKS代理服务器
注意,所以这篇讲的是我netty服务里的客户端Bootstrap,怎么走到socks代理服务器
使用
给客户端的通道加Socks5ProxyHandler处理器,就能直接转发到代理服务器,再到目标服务器.
Socks5里用户名和密码可以不填可以填,Socks4里不支持帐号密码
pipeline.addFirst("socks5CLientProxy", new Socks5ProxyHandler(
new InetSocketAddress(proxyIp, proxyPort)
, proxyUsername, proxyPassword));
源码浅析
版本
netty-handler-proxy模块现在国内网上资料较少,在我目前看来,在基于Netty程序的服务中,能提供给客户端(Bootstrap创建的)代理能力。
版本的话暂时是从netty-all 4.1.75.Final带过来的,最新的4.1.89我对比,netty-handler-proxy部分是没变化的
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.75.Final</version>
</dependency>
子模块的id
<artifactId>netty-handler-proxy</artifactId>
目录结构

| 类名 | 说明 |
|---|---|
| ProxyHandler | 代理处理器的抽象类 |
| Socks4ProxyHandler | socks4的代理处理器实现 |
| Socks5ProxyHandler | socks5的代理处理器实现 |
| HttpProxyHandler | http的代理处理器实现 |
| ProxyConnectionEvent | 代理连接事件,看起来本身没什么实现 |
| ProxyConnectException | 代理连接异常类 |
| HttpProxyHandler | http的代理处理器实现 |
ProxyHandler
本身就是一个通道处理器

在重写的连接方法中,使用了目标服务器和代理服务器的信息,代理服务器地址就是初始化socks5那些实现类的时候,写在构造方法的

有添加编解码器的接口,socks5进行了实现

socks5的实现,添加了socks5的解码器,编码器

Socks5ProxyHandler
socks5的引用很多都是依赖artifactId是netty-codec-socks里的,这个依赖也是netty的sockd代理程序实现的主要依据

从发送连接命令的方法,可以看出,报文中携带了目标服务器的地址

socks5代理服务
我们把这个地址对应到socks代理服务,就可以看到使用的地方,就是代理服务发送给目标服务器信息的时候

待续
浅写一下netty客户端代理的使用和几个服务串起来的方式,有空再补充更多

242

被折叠的 条评论
为什么被折叠?



