本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:Java网络编程从入门到精通(16):客户端套接字(Socket)的超时
在Java类中,getter和setter方法占了很大的比重。由于Java中没有定义属性的关键字;因此,getter和setter方法用于获得和设置Java类的属性值;如getName和setName方法用于设置name属性的值。如果某个属性只有getter方法,那这个属性是只读的;如果只有setter方法,那么这个属性是只写的。在Socket类中也有很多这样的属性来获得和Socket相关的信息,以及对Socket对象的状态进行设置。
一、用于获得信息的getter方法
我们可以从Socket对象中获得3种信息。
1. 服务器信息
对于客户端来说,服务器的信息只有两个:IP和端口。Socket类为我们提供了3个方法来得到这两个信息。
(1) public InetAddress getInetAddress()
这个方法返回一个InetAddress对象。通过这个对象,可以得到服务器的IP、域名等信息。
System.out.println(socket.getInetAddress().getHostAddress());
System.out.println(socket.getInetAddress().getHostName());
(2) public int getPort()
这个方法可以以整数形式获得服务器的端口号。
System.out.println(socket.getInetAddress().getPort());
(3) public SocketAddress getRemoteSocketAddress()
这个方法是将getInetAddress和getPort方法结合在了一起;利用这个方法可以同时得到服务器的IP和端口号。但这个方法返回了一个SocketAddress对象,这个对象只能作为connect方法的参数用于连接服务器;而要想获得服务器的IP和端口号,必须得将SocketAddress转换为它的子类InetSocketAddress。
System.out.println(((InetSocketAddress)socket.getRemoteSocketAddress()).getHostName());
System.out.println(((InetSocketAddress)socket.getRemoteSocketAddress()).getPort());
注意:以上3个方法都可以在调用Socket对象关闭后调用。它们所获得的信息在Socket对象关闭后仍然有效。如果直接使用IP连接服务器时,getHostName和getHostAddress的返回值是一样的;都是服务器的IP。
2. 本机信息
与服务器信息一样,本机信息也有两个:本地IP和绑定的本地端口号。这些信息也可以通过3个方法来获得。
(1) public InetAddress getLocalAddress()
这个方法返回了本机的InetAddress对象。通过这个方法可以得到本机的IP和机器名。当本机绑定了多个IP时,Socket对象使用哪一个IP连接服务器,就返回哪个IP。如果本机使用ADSL上网,并且通过Socket对象连接到Internet上的某一个IP或域名上(如www.ptpress.com.cn),则getLocalAddress将返回“ADSL连接”所临时绑定的IP;因此,我们可以通过getLocalAddress得到ADSL的临时IP。
socket.connect( new InetSocketAddress( " www.ptpress.com.cn " , 80 ));
System.out.println(socket.getLocalAddress().getHostAddress());
System.out.println(socket.getLocalAddress().getHostName());