随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0
数据加载中……

Java网络编程从入门到精通(17):Socket类的getter和setter方法(1)

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(16):客户端套接字(Socket)的超时

    Java类中,getter和setter方法占了很大的比重。由于Java中没有定义属性的关键字;因此,getter和setter方法用于获得和设置Java类的属性值;getNamesetName方法用于设置name属性的值。如果某个属性只有getter方法,那这个属性是只读的;如果只有setter方法,那么这个属性是只写的。在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());


(2) public int getPort()

这个方法可以以整数形式获得服务器的端口号。

Socket socket = new Socket("www.ptpress.com.cn"80);
System.out.println(socket.getInetAddress().getPort());

    (3) public SocketAddress getRemoteSocketAddress()

这个方法是将getInetAddressgetPort方法结合在了一起;利用这个方法可以同时得到服务器的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());

注意:以上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());

(2) public int getLocalPort()

通过这个方法可以得到Socket对象所绑定的本机的一个端口号;如果未绑定端口号,则返回一个从102465,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())

   (3) public SocketAddress getLocalSocketAddress()

这个方法和getRemoteSocketAddress方法类似,也是同时得到了本地IPSocket对象所绑定的端口号。如果要得到本地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());

3. 用于传输数据的输入、输出流

输入、输出流在前面的章节已经被多次用到。在这里让我们来简单回顾一下。

(1) public InputStream getInputStream() throws IOException

用于获得从服务器读取数据的输入流。它所得以的流是最原始的源。为了操作更方便,我们经常使用InputStreamReaderBufferedReader来读取从服务器传过来的字符串数据。

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());

(2) public OutputStream getOutputStream() throws IOException

用于获得向服务器发送数据的输出流。输出流可以通过OutputStreamWriterBufferedWriter向服务器写入字符串数据。

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的write方法输出数据后,必须使用flush方法刷新输出缓冲区,以便将输出缓冲区中的数据发送出去。如果要输出字符串,使用OutputStreamWriter和BufferedWriter都可以;它们的write方法都可以直接使用字符串作为参数来输出数据。而这一点与相应的InputStreamReader和BufferedReader不同;它们中只有BufferedReader有readLine方法,因此,必须使用BufferedReader才能直接读取字符串数据。

下一篇:Java网络编程从入门到精通(18):Socket类的getter和setter方法(2)





Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2009-05-29 09:43 银河使者 阅读(4765) 评论(3)  编辑  收藏 所属分类: java 原创网络编程

评论

# re: Java网络编程从入门到精通(17):Socket类的getter和setter方法(1)  回复  更多评论   

(2) public int getPort()

这个方法可以以整数形式获得服务器的端口号。

Socket socket = new Socket("www.ptpress.com.cn", 80);
System.out.println(socket.getInetAddress().getPort());

InetAddress没有getPort方法,应该是socket.getPort().
2009-06-22 14:42 | 半兽人

# re: Java网络编程从入门到精通(17):Socket类的getter和setter方法(1)  回复  更多评论   

@半兽人
我没说InetAddress有getPort方法,仔细看文章,明明是Socket的方法
2009-06-22 14:52 | 银河使者

# re: Java网络编程从入门到精通(17):Socket类的getter和setter方法(1)[未登录]  回复  更多评论   

(1) public InetAddress getInetAddress()

这个方法返回一个InetAddress对象。通过这个对象,可以得到服务器的IP、域名等信息。

对于这段话感觉描述的不严谨,也可能是我的理解有问题,使用中出现了错误。写程序测试发现
SerSocket ss = new SerSocket(1111);
Socket s = ss.accept();
InetAddress ia = s.getInetAddress();
得到的InetAddress对象的话,得到的是客户端的IP,并不是服务器的IP。
查看api,发现这个方法的解释是
Returns the address to which the socket is connected.
Returns:
the romete IP address to which this socket is connected,or null if the socket is not connected.
2014-08-11 14:07 | abc

只有注册用户登录后才能发表评论。


网站导航: