2016-02-28 72 views
0

我學習socket編程,並在書中的示例所示:爲什麼客戶端套接字將localhost作爲參數?

// SimpleClient.java: A simple client program. 
import java.net.*; 
import java.io.*; 
public class SimpleClient { 
    public static void main(String args[]) throws IOException { 
    // Open your connection to a server, at port 1254 
    Socket s1 = new Socket(「localhost」,1254); 
    // Get an input file handle from the socket and read the input 
    InputStream s1In = s1.getInputStream(); 
    DataInputStream dis = new DataInputStream(s1In); 
    String st = new String (dis.readUTF()); 
    System.out.println(st); 
    // When done, just close the connection and exit 
    dis.close(); 
    s1In.close(); 
    s1.close(); 
    } 
} 

我的問題是,在行新的Socket(「localhost」的,1254),爲什麼地址,而不是服務器的IP本地主機,地址?

+1

因爲服務器必須在本地主機上運行。 – EJP

回答

0

對於這個特定的程序很難說完全是爲什麼。通常的原因是因爲服務器可能甚至沒有另一個IP地址。如果它是本地的,則通過"localhost""127.0.0.1"訪問它即使根本沒有NIC也能保證工作。

另一個可能的原因是安全性。您的機器可能有多個NIC,但服務器可能配置爲僅在回送接口上進行偵聽,因此只接受本地連接。如果根本不打算用於外部使用,這通常是最好的選擇,因爲潛在的攻擊者將很難通過它甚至沒有聽到的界面連接它!他們必須首先使用其他方式打入系統。

-1

您可以對服務器的名稱,而不是 「localhost」 的

客戶端的Socket =新的Socket(服務器,端口);

-2

除非服務器和客戶端在同一主機上運行,​​否則不能使用localhost

如果它們在同一主機上運行,​​則客戶端應使用的IP或主機名取決於服務器進程的使用情況。如果要使服務器進程可用於網絡,通常將其設置爲偵聽所有網絡接口上的連接。在這種情況下,客戶端使用本地主機還是外部IP地址並不重要,它可以以任何方式連接到服務器。

如果您不希望其他主機能夠訪問服務器進程,則只能使其使用回送接口。通過這種方式,只有本地運行的客戶端纔可以連接,而他們唯一能做到的方式是使用localhost或環回IP地址。

+0

當然重要。如果客戶端未在本地主機上運行,​​則必須使用外部IP地址。 – EJP

+0

我假設服務器和客戶端運行在同一主機上。限定符添加。現在的措辭是否足夠清楚? – Joni

+0

否。'客戶端使用本地主機還是外部IP地址'保持爲假並不重要。 – EJP