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

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

@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即可获取。public class ServerHandler extends SimpleChannelInboundHandler {

@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了。

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

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

相关文章

html高度没有滚动条,Div扩展了页面高度,但没有滚动条

我在页面左侧有一个div用于导航链接。点击标题可展开链接的子集。我将此div设置为页面高度的100%,以便列占据页面的整个左侧。当所有子类别都展开时,会出现问题。 div的内容在页面底部运行,但不添加滚动条。Div扩展了页面高度&…

es 删除重复数据_怎么标识并删除SPSS数据库里的“重复个案”?

背景:测试学生体质数据时,由于部分学生第1次测试成绩不合格,让他们进行了补测。但是,录入数据时,没有替换,造成这部分学生有2个体测成绩,现在需要找到这些重复个案并删除较差的成绩。1. 数据概览…

计算机视觉sci需要什么水平论文,计算机视觉博士一般几篇论文_林达华博士_林达华视觉...

2019年,计算机视觉领域,你推荐哪些综述性的文章?...期待更多CVer在FGIA领域作出有影响力的工作,更多FGIA信息可参见也欢迎相关领域同学进入 旷视南京研究院 参与相关课题的研究...如何读一篇优秀的计算机论文?转载一个…

上海大学计算机考研试题,08-09上海大学计算机考研试卷.doc

08-09上海大学计算机考研试卷第 页 共 页 第 页 共 页第 页 共 页 第 页 共 页上海大学2008~2009学年 秋季学期研究生答题卷课程名称:计算机视觉基础 课程编号: 0座机电话号码 学 分: 4 考试日期: 2008年11月23日应试人…

python logging模块的作用及应用场景_Python常用模块功能简介(三)logging

logging基本介绍先介绍一下我们为什么要使用日志,平常我们编写程序为了验证程序运行与debug,通常会使用print函数来对一些中间结果进行输出验证,在验证成功后再将print语句注释或删除掉。这样做在小型程序中还比较灵活,但是对于大…

计算机科技文献中 CAM,计算机辅助设计、制造(CAD、CAM)和《机械制图》 课程的结合、探索与实践研究...

王建臣摘要:随着我国科学技术的迅猛发展,计算机技术也随之得到大范围推广,并迎来跨越式的发展,在机械行业中,管理、设计、制造都已经逐渐换装计算机来进行。计算机机械制图作为机械专业的基础课程,肩负着培…

docker linux 快速开窗口_Linux搭建docker环境并简单实用

记录生活:配置阿里云镜像源docker YUM[rootcentos-linux ~]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2[rootcentos-linux ~]# sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装…

清华计算机接口原理,微机原理与接口技术课后习题答案清华大学

微机原理与接口技术课后习题答案清华大学 微机原理与接口技术课后部分习题参考答案 第一章 2. 第 3项任务,根据状态标志位的状态决定转移方向。 3. 程序存储是将要执行的程序的全部指令存储到存储器中,程序控制指程序开始执行后,通过指令流控…

vf求计算机系统当前日期的年份数,计算机二级VF常用函数列表

数值函数:1.绝对值和符号函数格式:ABS()SIGN()例如:ABS(-5)5,ABS(4)4,SIGN(8)1,SIGN(-3)-1,SIGN(0)02.求平方根表达式格式:SQRT()例如:SQRT(16)4,它与开二分之一次方等同。3.圆周率函数格式:PI()4.求整数函…

element走马灯自动_详细element-ui的走马灯carousel轻松实现自适应全屏banner详细过程...

div部分CSS部分.bannerImg{width: 100%;height: inherit;min-height: 600px;min-width: 1400px;}vue.JS部分var vm new Vue({el : #apptwo,data : {bannerHeight:"",BannerImg:["${request.contextPath}/statics/BCHimg/b6.png","${request.contextP…

4n35光耦引脚图_光耦继电器的主要特点以及输入特性!先进光半导体

光耦合器是一种电光电转换设备,可将电信号作为介质传输。它由两部分组成:光源和光接收器。发光源和光接收器被组装在同一气密壳体中,并通过透明绝缘体彼此隔开。发光源的引脚为输入端子,光接收器的引脚为输出端子,公共…

系统流畅度测试软件,如何通过FPS显示快速测试自己手机流畅度

对于手机流畅度测试除了系统自带的功能能测试手机流畅度之外,那么就没有其它方法能测试手机流畅度了么?那么接下来由小编为大家推荐一款小工具FPS显示(FPS Meter),你可以通过它快速的测试自己手机流畅度,接下来一起看看吧&#xf…

中软国际软件测试培训中心,中软国际准员工培养计划C++开发/软件测试方向开班典礼...

2010年8月31日上午9点半,中软国际准员工培养计划—C开发/软件测试方向开班典礼在无锡ETC隆重举行。开班典礼在热烈的掌声中拉开了序幕。典礼由教务部经理陈晨老师主持,首先她对近20名学员的到来表示欢迎,并对本次学习班顺利开班表示祝贺。中软…

django filter查询多选_动态filter查询数据Django实现方法

这是我在学习Django时看到的关于动态filter查询数据Django实现方法。当时很受用,解决了我在工作中遇到的一个问题。可能有朋友会需要,转来玩蛇网python学习平台和大家一同分享下。在平时用Djangoa工作时,需要处理像是对多个字段进行查询找结果…

二本考北航计算机经历,我(来自二本学校)考上北航的一些经历

大家很想知道二本考上是怎麽考上北航的吧!我就把我的一点经历告诉大家吧。本人由于高考发挥的不好来到了一所很不入流的二本学校。所以我决定利用考研的机会进入理想大学。跟大家一样我也是从大三下学期开始准备考研的,由于本人英语还可以,所…

pytorch 命令行运行_PyTorch简介与相关安装

PyTorch简介PyTorch的前身是Torch,Torch是一个有大量机器学习算法支持的科学计算框架,灵活度很高,是一个与NumPy类似的张量(Tensor)操作库。但是Torch采用的是小众的编程语言Lua,因此流行度很低,于是就有了PyTorch的出…

软件测试用例分享ppt,分享:测试用例设计方法.ppt

分享:测试用例设计方法.ppt还剩122页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,很抱歉,此页已超出免费预览范围啦!如果喜欢就下载吧,价低环保!内容要点&#xff…

python 命名空间冲突_python-命名空间

通俗的来说,Python中所谓的命名空间可以理解为一个容器。在这个容器中可以装许多标识符。不同容器中的同名的标识符是不会相互冲突的。理解python的命名空间需要掌握三条规则:第一,赋值(包括显式赋值和隐式赋值)产生标识符,赋值的…

修改tomcat服务器图标,修改tomcat小猫图标,设置项目的favicon图标

JAVA设计模式之模板模式在阎宏博士的一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...从scheduler is shutted down看程序员的英文水平我有个windows服务程序,今天重点在测试…

golang 安全的tcp server_Go 语言使用 TCP_NODELAY 控制发包流量

编写健壮且高性能的网络服务需要付出大量的努力。提高服务性能的方式有很多种,比如优化应用层的代码,更进一步,还可以看看垃圾回收器,操作系统,网络传输,以及部署我们服务的硬件是否有优化空间。TCP/IP 协议…