Netty4.X 获取客户端IP

原创 laukinghaozi 2014-09-20 17:21:57 评论(0) 8514人阅读

最近使用netty-4.0.23.Final 版本编写服务端代码,有个获取客户端代码的小需求,以前使用servlet开发时很机械的就:

1
2
3
4
5
6
String ipAddr= "0.0.0.0" ;
if  (reqest.getHeader( "X-Forwarded-For" ) ==  null ) {
     ipAddr = reqest.getRemoteAddr(); 
} else {     
     ipAddr = req.getHeader( "X-Forwarded-For" );
}

ps:X-Forwarded-For 是使用了代理(如nginx)会附加在HTTP头域上的。

理解好HTTP协议基础知识很重要这里不陈述。

Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序,支持多种协议,当然也支持HTTP协议。

启动Netty服务的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public  void  start()  throws  Exception {
     EventLoopGroup bossGroup =  new  NioEventLoopGroup( 1 );
     EventLoopGroup workerGroup =  new  NioEventLoopGroup();
     try  {
          ServerBootstrap bootstrap =  new  ServerBootstrap();
          bootstrap.option(ChannelOption.SO_BACKLOG,  1024 );
          bootstrap.group(bossGroup, workerGroup)
                   .channel(NioServerSocketChannel. class )
                   .handler( new  LoggingHandler(LogLevel.INFO))
                   .childHandler( new  ServerHandlerInitializer());
          Channel ch = bootstrap.bind( 8080 ).sync().channel();
          System.err.println( "Open your web browser and navigate to "
                            + ( "http" ) +  "://127.0.0.1:8080/" );
          ch.closeFuture().sync();
         catch  (Exception e) {
                 e.printStackTrace();
         finally  {
           bossGroup.shutdownGracefully();
           workerGroup.shutdownGracefully();
         }
  }
  public  class  ServerHandlerInitializer  extends  ChannelInitializer<SocketChannel> {
     @Override
     protected  void  initChannel(SocketChannel channel)  throws  Exception {
         ChannelPipeline p = channel.pipeline();
         p.addLast( new  HttpRequestDecoder());
         p.addLast( new  HttpResponseEncoder());
         p.addLast( new  ServerHandler());
     }
}

看出NioServerSocketChannel类的源码可以知道是对java.nio.channels.ServerSocketChannel重新封装,所以在获取客户端IP时调用remoteAddress()强转成java.net.InetSocketAddress即可获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  class  ServerHandler  extends  SimpleChannelInboundHandler<HttpObject> {
     @Override
     public  void  channelRead0(ChannelHandlerContext ctx, HttpObject msg)
             throws  Exception {
         if  (msg  instanceof  HttpRequest) {
             HttpRequest mReq = (HttpRequest) msg;
             String clientIP = mReq.headers().get( "X-Forwarded-For" );
             if  (clientIP ==  null ) {
                 InetSocketAddress insocket = (InetSocketAddress) ctx.channel()
                         .remoteAddress();
                 clientIP = insocket.getAddress().getHostAddress();
             }
         }
     }
}

这样我们就可以获取到客户端的IP了。

Netty获取客户端IP相关推荐

  1. netty获取玩家chanel_Netty4.X 获取客户端IP

    最近使用netty-4.0.23.Final 版本编写服务端代码,有个获取客户端代码的小需求,以前使用servlet开发时很机械的就:String ipAddr="0.0.0.0" ...

  2. Netty获取真实IP

    本文参考:https://www.jianshu.com/p/cc8d592582c9 感谢分享 Netty获取真实IP netty想要获取客户端请求的IP有两种方法: 一.通过ChannelHand ...

  3. c# 获取客户端IP地址方法

    客户端ip: Request.ServerVariables.Get("Remote_Addr").ToString();  客户端主机名: Request.ServerVaria ...

  4. JS获取客户端IP地址、MAC和主机名的7个方法汇总

    今天在搞JS(javascript)获取客户端IP的小程序,上网搜了下,好多在现在的系统和浏览器中的都无效,很无奈,在Chrome.FireFox中很少搞到直接利用ActiveX获取IP等的JS脚本. ...

  5. 如何在PHP中获取客户端IP地址[重复]

    本文翻译自:How to get the client IP address in PHP [duplicate] This question already has an answer here: ...

  6. ASP.NET Core 中使用负载均衡时获取客户端 IP

    在使用负载均衡的情况下,通过 context.Connection.RemoteIpAddress 获取到的是负载均衡的 IP 地址,需要通过 X-Forwarded-For 请求头才能获取到客户端的 ...

  7. ASP.NET获取客户端IP及MAC地址

    ASP.NET获取客户端IP及MAC地址 2008-12-01 14:50 ASP.NET获取客户端IP及MAC地址很多时候非常必要的,像做投票.留言.评论 等系统的时候防止别人恶意操作,导致数据的虚 ...

  8. JAVA CXF、XFIRE、AXIS webservice获取客户端IP

    2019独角兽企业重金招聘Python工程师标准>>> import javax.annotation.Resource; import javax.servlet.http.Htt ...

  9. 深入分析几种PHP获取客户端IP的情况

    深入分析几种PHP获取客户端IP的情况 http://mount.blog.51cto.com/764124/528084 2011-03-27 16:13:29 标签:代理服务器 客户端 文章 PH ...

最新文章

  1. Reference resources
  2. OnInitDialog()函数
  3. WAT中Security选项卡无法连接到数据库解决办法
  4. Ubuntu 取消 Apache及MySQL等自启动
  5. 百度工程师控制公司服务器“挖矿”:4个月赚10万 判刑3年
  6. 学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
  7. 在使用flask下载文件时会出现的一个文件下载不到的问题
  8. Devexpress VCL Build v2014 vol 14.1.4 发布
  9. iOS应用内付费(IAP)开发步骤列表
  10. [THUWC2017] 在美妙的数学王国畅游
  11. jenkins无法连接仓库:Command “/usr/bin/git ls-remote -h -- https://gitee.com/xxx.git HEAD“ returned
  12. 测试一下你真的理解数据库左连接了吗?
  13. You can't specify target table 'sdb_goods' for update in FROM clause
  14. 32bit GM命令
  15. Android系统安装Linux 系统的ubuntu版本
  16. OJ一元二次方程的根*易错点
  17. 【老生谈算法】matlab实现方位角计算源码——方位角计算
  18. 七夕情人节表白网页制作【雪花爱心】
  19. plt.legend 图例放在外面 子图会挤在一起 子图压缩 压扁
  20. android模拟器mac版本下载,MaxMac电脑版怎么下载 安卓模拟器电脑版下载地址

热门文章

  1. linear-gradient 实现切角效果
  2. dell最新计算机如何U盘引导,2018戴尔最新版电脑bios设置u盘启动教程
  3. Unity检测IOS刘海屏
  4. linux图形编程前的基本操作
  5. 【每日新闻】诺基亚展示未来工厂:5G自动化机器人与人类和谐共处
  6. pysptk, 语音信号处理工具包( SPTK )的python 封装器
  7. 深度学习(李沐)—————Softmax回归
  8. python对txt文本文件边读边写,同时读取和写入的方式修改文件
  9. 推荐一个小程序ui库Wux Weapp
  10. linux-文件系统管理10-关于存储介质的那些事儿