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