2016-02-28 71 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