與ServerSocket對象相關的信息有兩個綁定端口和綁定IP地址綁定端口可以通過getLocalPort方法獲得綁定IP地址可以通過getInetAddress方法獲得
一getLocalPort方法
getLocalPort方法的返回值可分為以下三種情況
ServerSocket對象未綁定端口getLocalPort方法的返回值為
ServerSocket對象綁定了一個固定的端口getLocalPort方法返回這個固定端口
ServerSocket對象的綁定端口為getLocalPort方法返回一個隨機的端口(這類端口被稱為匿名端口)
getLocalPort方法的定義如下
public int getLocalPort()
getLocalPort方法主要是為這些匿名端口而准備的下面的代碼演示了ServerSocket對象產生隨機端口的過程
package server;
import *;
public class RandomPort
{
public static void main(String[] args) throws Exception
{
for (int i = ; i <= ; i++)
{
Systemoutprint(Random Port + i + );
Systemoutprintln(new ServerSocket()getLocalPort());
}
}
}
運行結果
主動模式
在主動模式中FTP服務器綁定了兩個端口和 (這兩個端口是默認值可以設成別的端口)其中端口負責客戶端和服務器之間的命令傳送一開始由客戶端主動連接服務端的端口並且向服務器發送相應的FTP命令另外一個端口是負責客戶端和服務端的數據傳送但要注意並不是客戶端主動連接服務端的端口而是在客戶端創建一個使用匿名端口的服務端連接(在Java中就是創建一個ServerSocket對象並且綁定端口是)然後客戶端通過端口將這個匿名端口通知服務端最後服務端主動連接客戶端的這個匿名端口(所以這種模式叫主動模式就是服務器主動連接客戶端)圖描述主動模式的工作原理
圖 主動模式的工作原理
從圖可以看出在主動模式中在傳送命令和數據時建立連接的過程是相反的也就是說在傳送命令時由客戶端主動連接服務器的端口而傳送數據時由服務器主動連接客戶端的匿名端口這種方式是FTP服務器最初的工作模式但這種模式有很大的局限性如客戶端通過代理上網而且未做端口映射在這種情況下服務端是無法主動和客戶端建立連接的因此這就產生的另一種模式被動模式
被動模式
被動模式和主動模式在傳送命令的方式上是一樣的它們的區別就在於數據的傳輸上被動模式在建立命令傳輸通道後服務端建立一個綁定到匿名端口的ServerSocket對象並通過命令傳輸通道將這個匿名端口通知客戶端然後由客戶端主動連接服務端的這個匿名端口這對於服務端就是被動的因此這種模式叫被動模式圖描述了被動模式的工作原理
圖
被動模式的工作原理
現在的大多數FTP客戶端軟件的默認工作模式都是被動模式因此這種模式可以克服防火牆等的限制並且客戶端不需要有固定IP但這種模式也有它的缺點這就是在服務端要為客戶開大量的端口(大多數FTP服務器開的端口范圍是 ~ 但有的服務器的范圍達到 ~ )這對於服務器來說存在著一定的安全隱患因此如果可能的話最好還是采用主動模式
二getInetAddress方法
getInetAddress可以得到ServerSocket對象綁定的IP地址如果ServerSocket對象未綁定IP地址返回getInetAddress方法的定義如下
public InetAddress getInetAddress()
下面的代碼演示了getInetAddress的使用方法
ServerSocket serverSocket = new ServerSocket();
serverSocketbind(new InetSocketAddress( ));
Systemoutprintln(serverSocketgetInetAddress()getHostAddress());
運行結果
三getLocalSocketAddress方法
這個方法其實是將getLocalPort和getInetAddress方法的功能集成到了一起也就是說使用getLocalSocketAddress方法可以同時得到綁定端口和綁定IP地址這個方法返回了一個SocketAddress對象SocketAddress類是一個抽象類要想分別得到端口和IP地址必須將SocketAddress對象轉換成InetSocketAddress對象(InetSocketAddress類是從SocketAddress類繼承的)getLocalSocketAddress方法的定義如下
public SocketAddress getLocalSocketAddress()
下面的代碼演示了getLocalSocketAddress的使用方法
ServerSocket serverSocket = new ServerSocket();
serverSocketbind(new InetSocketAddress( ));
Systemoutprintln(serverSocketgetLocalSocketAddress());
InetSocketAddress nsa = (InetSocketAddress)serverSocketgetLocalSocketAddress();
Systemoutprintln( nsagetAddress()getHostAddress());
Systemoutprintln( nsagetPort());
運行結果
/:
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26565.html