代理服务器搭建(代理服务器怎么弄)

简介

爱因斯坦说:所有的伟大都来源于简单的细节。Netty为我们提供了这样一个强大的eventloop和通道。通过有效利用这些简单的东西,我们可以得到非常强大的应用,比如我们今天要讲的代理。

代理和反向代理

我相信只要程序员听说过nginx服务器,这个超级优秀的nginx的一个很重要的功能就是充当反向代理。然后有朋友问。有反向代理,就一定有正向代理。那么他们两个有什么区别呢?

先说正面代理。比如最近流量明星受到重创。虽然被打压过,但明星就是明星,一般人是看不到的。如果有人需要找明星谈话,需要先通过明星的经纪人,有些经纪人会把话转达给明星。这个经纪人就是货代。我们通过一个转发代理来访问被访问的对象。

那么什么是反向代理呢?比如现在有很多人工智能。如果我们和智能机器人A对话,然后A把我们的对话转移到我们背后隐藏的人,这个人用他的智慧回答我们的对话,交给智能机器人A输出。最后实现人工智能。这个过程称为反向代理。

netty实现代理的原理

那么如何在netty中实现这个代理服务器呢?

首先,我们首选的代理服务器是一个服务器,所以我们需要使用ServerBootstrap在netty中创建一个服务器:

EventLoopGroup boss group = new NioEventLoopGroup(1);EventLoopGroup worker group = new NioEventLoopGroup();请尝试{ server bootstrap b = new server bootstrap();b.group(bossGroup,workerGroup)。通道(NioServerSocketChannel.class)。处理程序(新的LoggingHandler(LogLevel。信息))。childHandler(新的SimpleDumpProxyInitializer(REMOTE _ HOST,REMOTE_PORT))。childOption(ChannelOption。AUTO_READ,false)。bind(LOCAL_PORT)。同步()。频道()。closeFuture()。sync();在这个本地服务器中,我们传入ProxyInitializer。在这个处理程序初始化器中,我们传入自定义处理程序:

public void init channel(socket channel ch){ ch . pipeline()。addLast(新的LoggingHandler(LogLevel。INFO)、新SimpleDumpProxyInboundHandler(remote host,remote port));}在自定义处理程序中,我们使用Bootstrap创建一个客户端,用于连接到要代理的远程服务器。我们将这个客户机的创建放在channelActive方法中:

//打开出站连接Bootstrap b = new Bootstrap();b . group(inbound channel . event loop())。频道(ctx.channel()。getClass())。处理程序(新的SimpleDumpProxyOutboundHandler(inboundChannel))。选项(ChannelOption。AUTO_READ,false);channel future f = b . connect(remote host,remote port);然后,在客户端建立连接后,它可以从inboundChannel读取数据:

outbound channel = f . channel();f . addlistener(future-& gt;{if (future.isSuccess()) {//连接建立后,读取inboundChannel.read()中的入站数据;} else {//关闭入站通道inbound channel . Close();} });因为是代理服务,所以需要将inboundChannel读取的数据转发给outboundChannel,所以我们需要在channelRead中这样写:

公共通道read(最终通道处理程序上下文CTX,对象msg){//读取inboundChannel中的消息,并写入出站通道if(outbound channel . is active()){ outbound channel . writeandflush(msg)。add listener((channelfuturelistener)future-->;{ if(future . is success()){//flush成功,读取下一条消息ctx.channel()。read();} else { future.channel()。close();} });} } outbound channel写入成功后,继续读取inboundChannel。

同样,对于客户端的outboundChannel,也有一个处理程序。在这个处理程序中,我们需要将outboundChannel读取的数据写回inboundChannel:

公共通道read(最终通道处理程序上下文CTX,对象消息){//读取outboundChannel中的消息,并将它们写入inboundChannel: inbound channel。writeandflush (msg)。add listener((channelfuturelistener)future-->;{ if(future . is success()){ CTX . channel()。read();} else { future.channel()。close();} });inboundChannel写入成功后,继续outboundChannel的读取。

这样简单的代理服务器就完成了。

实战

如果我们将本地端口8000代理到www.163.com的端口80会发生什么?运行我们的程序,访问http://localhost:8000,我们将看到以下页面:

代理服务器搭建(代理服务器怎么弄)

为什么没有像我们想的那样显示正常页面?这是因为我们的代理之后的域名是localhost,而不是普通的www.163.com,所以服务器不知道我们的请求并报告错误。

总结

本文中代理服务器之间简单的转发请求无法处理上述场景,那么如何解决上述问题呢?敬请期待我的后续文章!

关于本文的示例,请参考:learn-netty4

本文已被http://www.flydean.com/35-netty-simple-proxy/.收录

最通俗的解读,最深刻的干货,最简洁的教程,还有很多你不知道的小技巧等着你去发现!

欢迎关注我的微信官方账号:“程序那些事”,懂技术更懂你!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。系信息发布平台,仅提供信息存储空间服务。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

本文来自网络,若有侵权,请联系删除,作者:马同,如若转载,请注明出处:

发表回复

登录后才能评论