Netty服務器:客戶端IP不變,端口卻變化的原因是什么?

Netty服務器:客戶端IP不變,端口卻變化的原因是什么?

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
喜歡就支持一下吧
點贊5 分享