Netty服務端如何穩定獲取客戶端IP地址,即使客戶端端口每次連接都變化?

Netty服務端如何穩定獲取客戶端IP地址,即使客戶端端口每次連接都變化?

Netty服務端:如何可靠獲取客戶端IP地址,即使端口動態變化?

在使用Netty構建Java服務端時,獲取客戶端IP地址和端口號至關重要,例如用于連接管理。然而,客戶端IP保持不變,端口卻每次連接都變化的情況,常常困擾開發者。本文將分析此問題,并提供解決方案。

代碼示例展示了Netty服務端獲取并存儲客戶端IP和端口的邏輯:通過channel.remoteAddress()獲取客戶端地址,并將其存儲在remoteAddressChannelMap中。

/**  * 客戶端連接時執行  * 1. 打印連接信息  * 2. 存儲客戶端IP和連接通道到remoteAddressChannelMap  */ @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception {     Channel channel = ctx.channel();     InetSocketAddress remoteAddress = (InetSocketAddress) channel.remoteAddress();     System.err.println("新客戶端連接:"+ channel.remoteAddress());     // 提取IP地址,忽略端口號     String clientIp = remoteAddress.getAddress().getHostAddress();     remoteAddressChannelMap.put(clientIp, channel);     System.out.println("remoteAddressChannelMap size: " + remoteAddressChannelMap.size()); }

代碼運行后,客戶端IP地址不變,但端口號每次都不同。這并非代碼錯誤,而是操作系統動態分配端口的正常行為。

客戶端IP地址由網絡配置決定,而端口號則由操作系統動態分配,連接斷開后釋放。因此,即使netstat命令在連接前未顯示端口占用,連接建立后該端口即被占用。這是為了保證多個應用同時進行網絡通信。 只有在連接保持期間使用netstat才能看到端口占用情況。

上述代碼修改后的版本,直接提取IP地址,避免了端口號變化帶來的問題,從而實現了穩定獲取客戶端IP地址的目的。

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享