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执行事件是顺序而且高效

为啥 Netty 从 UDP 消息中只给我 768 个字节

确定一个 netty 客户端。 ctx.Write(obj) 和 ctx.channel().Write(obj) 的区别

Azure 函数无法将参数“messageReceiver”绑定到类型“Microsoft.Azure.ServiceBus.Core.MessageReceiver”

Azure 服务总线触发函数 - 绑定到 MessageReceiver

MessageReceiver