在
Java
类中,
get
ter和
set
ter方法占了很大的比重。由于
Java
中没有定义属性的关键字;因此,
get
ter和
set
ter方法用于获得和设置
Java
类的属性值;
如
getName
和
setName方法用于设置name属性的值
。如果某个属性只有
get
ter方法,那这个属性是只读的;如果只有
set
ter方法,那么这个属性是只写的。在
Socket
类中也有很多这样的属性来获得和
Socket
相关的信息,以及对
Socket
对象的状态进行设置。
一、
用于获得信息的
getter
方法
我们可以从Socket
对象中获得3
种信息。
1. 服务器信息
对于客户端来说,服务器的信息只有两个:IP
和端口。Socket
类为我们提供了3
个方法来得到这两个信息。
(1) public InetAddress getInetAddress()
这个方法返回一个InetAddress
对象。通过这个对象,可以得到服务器的IP
、域名等信息。
Socket socket
=
new
Socket(
"
www.ptpress.com.cn
"
,
80
);
System.out.println(socket.getInetAddress().getHostAddress());
System.out.println(socket.getInetAddress().getHostName());
System.out.println(socket.getInetAddress().getHostAddress());
System.out.println(socket.getInetAddress().getHostName());
(2) public int getPort()
这个方法可以以整数形式获得服务器的端口号。
Socket socket
=
new
Socket(
"
www.ptpress.com.cn
"
,
80
);
System.out.println(socket.getInetAddress().getPort());
System.out.println(socket.getInetAddress().getPort());
(3) public SocketAddress getRemoteSocketAddress()
这个方法是将getInetAddress
和getPort方法
结合在了一起;利用这个方法可以同时得到服务器的IP
和端口号。但这个方法返回了一个SocketAddress
对象,这个对象只能作为connect
方法的参数用于连接服务器;而要想获得服务器的IP
和端口号,必须得将SocketAddress
转换为它的子类InetSocketAddress
。
Socket socket
=
new
Socket(
"
www.ptpress.com.cn
"
,
80
);
System.out.println(((InetSocketAddress)socket.getRemoteSocketAddress()).getHostName());
System.out.println(((InetSocketAddress)socket.getRemoteSocketAddress()).getPort());
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 socket
=
new
Socket();
socket.connect( new InetSocketAddress( " www.ptpress.com.cn " , 80 ));
System.out.println(socket.getLocalAddress().getHostAddress());
System.out.println(socket.getLocalAddress().getHostName());
socket.connect( new InetSocketAddress( " www.ptpress.com.cn " , 80 ));
System.out.println(socket.getLocalAddress().getHostAddress());
System.out.println(socket.getLocalAddress().getHostName());
(2) public int getLocalPort()
通过这个方法可以得到Socket
对象所绑定的本机的一个端口号;如果未绑定端口号,则返回一个从1024
到65,535
之间的随机数。因此,使用这个方法可能每次得到的端口号不一样。
Socket socket
=
new
Socket();
// 如果使用下面的bind方法进行端口绑定的话,getLocalPort方法将返回100
// socket.bind(new InetSocketAddress("127.0.0.1", 100));
socket.connect( new InetSocketAddress( " www.ptpress.com.cn " 80 ));
System.out.println(socket.getLocalPort())
// 如果使用下面的bind方法进行端口绑定的话,getLocalPort方法将返回100
// socket.bind(new InetSocketAddress("127.0.0.1", 100));
socket.connect( new InetSocketAddress( " www.ptpress.com.cn " 80 ));
System.out.println(socket.getLocalPort())
(3) public SocketAddress getLocalSocketAddress()
这个方法和getRemoteSocketAddress
方法类似,也是同时得到了本地IP
和Socket
对象所绑定的端口号。如果要得到本地IP
和端口号,必须将这个方法的返回值转换为InetSocketAddress
对象。
Socket socket
=
new
Socket(
"
www.ptpress.com.cn
"
,
80
);
System.out.println(((InetSocketAddress)socket.getLocalSocketAddress()).getHostName());
System.out.println(((InetSocketAddress)socket.getLocalSocketAddress()).getPort());
System.out.println(((InetSocketAddress)socket.getLocalSocketAddress()).getHostName());
System.out.println(((InetSocketAddress)socket.getLocalSocketAddress()).getPort());
3. 用于传输数据的输入、输出流
输入、输出流在前面的章节已经被多次用到。在这里让我们来简单回顾一下。
(1) public InputStream getInputStream() throws IOException
用于获得从服务器读取数据的输入流。它所得以的流是最原始的源。为了操作更方便,我们经常使用InputStreamReader
和BufferedReader
来读取从服务器传过来的字符串数据。
Socket socket
=
new
Socket(
"
www.ptpress.com.cn
"
,
80
);
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
System.out.println(bufferedReader.readLine());
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
System.out.println(bufferedReader.readLine());
(2) public OutputStream getOutputStream() throws IOException
用于获得向服务器发送数据的输出流。输出流可以通过OutputStreamWriter
和BufferedWriter
向服务器写入字符串数据。
Socket socket
=
new
Socket(
"
www.ptpress.com.cn
"
,
80
);
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write( " 你好 " );
bufferedWriter.flush();
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write( " 你好 " );
bufferedWriter.flush();
注意:在使用OutputStream的write方法输出数据后,必须使用flush方法刷新输出缓冲区,以便将输出缓冲区中的数据发送出去。如果要输出字符串,使用OutputStreamWriter和BufferedWriter都可以;它们的write方法都可以直接使用字符串作为参数来输出数据。而这一点与相应的InputStreamReader和BufferedReader不同;它们中只有BufferedReader有readLine方法,因此,必须使用BufferedReader才能直接读取字符串数据。
本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/214439
,如需转载请自行联系原作者