Java Netty服務器:客戶端IP地址不變,端口號卻變化的原因分析
在使用Netty構建Java服務器時,獲取客戶端IP地址和端口號至關重要。然而,開發者經常遇到一個問題:客戶端IP地址保持不變,但端口號每次連接都不同。本文將對此進行深入分析。
問題描述:
Netty服務器端獲取客戶端IP和端口號,并將其存儲在map中。開發者發現,客戶端IP地址一致,但端口號每次連接都變化,這令人困惑,因為命令行工具未顯示任何進程占用這些端口。
以下代碼片段展示了Netty服務器端如何獲取客戶端IP地址和端口號:
/** * 當有客戶端與服務器連接時執行此方法 * 1.打印提示信息 * 2.將客戶端IP和連接通道存儲到remoteAddressChannleMap */ @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { Channel channel = ctx.channel(); // 客戶端建立連接時,保存其IP和通道 channel.remoteAddress().toString():/127.0.0.1:12173 InetSocketAddress remoteAddress = (InetSocketAddress) channel.remoteAddress(); System.err.println("有新的客戶端與服務器發生連接。客戶端地址:" + channel.remoteAddress()); remoteAddressChannelMap.put(remoteAddress.toString().substring(1), channel); System.out.println("remoteAddressChannleMap 的 size:" + remoteAddressChannleMap.size()); // channelGroup.add(channel); }
原因解釋:
客戶端IP地址不變是正常的,因為它由網絡配置決定,除非網絡配置改變。
端口號變化的原因是:客戶端與服務器建立連接時,會動態選擇一個可用端口。操作系統負責管理這些端口,為每個新連接分配一個未被占用的端口。這并非程序占用端口,而是操作系統在客戶端層面分配的臨時端口,用于本次連接。因此,命令行工具未顯示進程占用這些端口是正常的。 如果連接仍然存在,使用netstat命令應該能看到這些臨時端口被操作系統占用。連接斷開后,這些端口會被釋放。
因此,客戶端IP地址不變,端口號每次連接都變化是操作系統正常行為,并非程序錯誤。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END