Netty:在messageReceived中获取远程IP地址
Posted
技术标签:
【中文标题】Netty:在messageReceived中获取远程IP地址【英文标题】:Netty: getting remote ip address in messageReceived 【发布时间】:2012-08-05 14:25:49 【问题描述】:在我的班级(扩展 SimpleChannelHandler)中,我试图获取最初发送消息的 ip。
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent ev) throws Exception
String host = ((InetSocketAddress)ctx.getChannel().getRemoteAddress()).getAddress().getHostAddress();
int port = ((InetSocketAddress)ctx.getChannel().getRemoteAddress()).getPort();
LOG.debug(String.format("host:%s port:%d", host, port));
..
这将打印 ip 10.0.0.1(网关),而不是正确的客户端地址 (10.52.45.4)。
有什么方法可以获取我正在尝试的 ip,还是网络配置有问题?
【问题讨论】:
使用较新的 netty 4.1.5((InetSocketAddress )ctx.channel().remoteAddress()).getAddress().getHostAddress();
对语法进行了轻微更新
【参考方案1】:
我猜你看到了网关 ip,因为网关做了某种 NAT。如果是这样,您唯一的机会就是在您的协议中包含源 IP 地址并从那里提取它。
【讨论】:
好像是这样。我决定最好按照您的建议进行操作,并将源 IP(或本例中的 id)包含在协议中。谢谢。【参考方案2】:以 10.0.0 开头的 IP 地址是内部 IP 地址,您可能将它连接到同一个 WiFi 路由器上的某个东西。要获得 10.52.45.4 ip,您必须在路由器外部进行连接。 (不要忘记端口转发)
【讨论】:
以上是关于Netty:在messageReceived中获取远程IP地址的主要内容,如果未能解决你的问题,请参考以下文章
确定一个 netty 客户端。 ctx.Write(obj) 和 ctx.channel().Write(obj) 的区别
Azure 函数无法将参数“messageReceiver”绑定到类型“Microsoft.Azure.ServiceBus.Core.MessageReceiver”