Java網(wǎng)絡(luò)編程從入門到精通(17):Socket類的getter和setter方法(1)
本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!
上一篇:Java網(wǎng)絡(luò)編程從入門到精通(16):客戶端套接字(Socket)的超時(shí)
在Java類中,getter和setter方法占了很大的比重。由于Java中沒有定義屬性的關(guān)鍵字;因此,getter和setter方法用于獲得和設(shè)置Java類的屬性值;如getName和setName方法用于設(shè)置name屬性的值。如果某個(gè)屬性只有getter方法,那這個(gè)屬性是只讀的;如果只有setter方法,那么這個(gè)屬性是只寫的。在Socket類中也有很多這樣的屬性來獲得和Socket相關(guān)的信息,以及對Socket對象的狀態(tài)進(jìn)行設(shè)置。
一、用于獲得信息的getter方法
我們可以從Socket對象中獲得3種信息。
1. 服務(wù)器信息
對于客戶端來說,服務(wù)器的信息只有兩個(gè):IP和端口。Socket類為我們提供了3個(gè)方法來得到這兩個(gè)信息。
(1) public InetAddress getInetAddress()
這個(gè)方法返回一個(gè)InetAddress對象。通過這個(gè)對象,可以得到服務(wù)器的IP、域名等信息。
System.out.println(socket.getInetAddress().getHostAddress());
System.out.println(socket.getInetAddress().getHostName());
(2) public int getPort()
這個(gè)方法可以以整數(shù)形式獲得服務(wù)器的端口號。
System.out.println(socket.getInetAddress().getPort());
(3) public SocketAddress getRemoteSocketAddress()
這個(gè)方法是將getInetAddress和getPort方法結(jié)合在了一起;利用這個(gè)方法可以同時(shí)得到服務(wù)器的IP和端口號。但這個(gè)方法返回了一個(gè)SocketAddress對象,這個(gè)對象只能作為connect方法的參數(shù)用于連接服務(wù)器;而要想獲得服務(wù)器的IP和端口號,必須得將SocketAddress轉(zhuǎn)換為它的子類InetSocketAddress。
System.out.println(((InetSocketAddress)socket.getRemoteSocketAddress()).getHostName());
System.out.println(((InetSocketAddress)socket.getRemoteSocketAddress()).getPort());
注意:以上3個(gè)方法都可以在調(diào)用Socket對象關(guān)閉后調(diào)用。它們所獲得的信息在Socket對象關(guān)閉后仍然有效。如果直接使用IP連接服務(wù)器時(shí),getHostName和getHostAddress的返回值是一樣的;都是服務(wù)器的IP。
2. 本機(jī)信息
與服務(wù)器信息一樣,本機(jī)信息也有兩個(gè):本地IP和綁定的本地端口號。這些信息也可以通過3個(gè)方法來獲得。
(1) public InetAddress getLocalAddress()
這個(gè)方法返回了本機(jī)的InetAddress對象。通過這個(gè)方法可以得到本機(jī)的IP和機(jī)器名。當(dāng)本機(jī)綁定了多個(gè)IP時(shí),Socket對象使用哪一個(gè)IP連接服務(wù)器,就返回哪個(gè)IP。如果本機(jī)使用ADSL上網(wǎng),并且通過Socket對象連接到Internet上的某一個(gè)IP或域名上(如www.ptpress.com.cn),則getLocalAddress將返回“ADSL連接”所臨時(shí)綁定的IP;因此,我們可以通過getLocalAddress得到ADSL的臨時(shí)IP。
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()
通過這個(gè)方法可以得到Socket對象所綁定的本機(jī)的一個(gè)端口號;如果未綁定端口號,則返回一個(gè)從1024到65,535之間的隨機(jī)數(shù)。因此,使用這個(gè)方法可能每次得到的端口號不一樣。
// 如果使用下面的bind方法進(jìn)行端口綁定的話,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()
這個(gè)方法和getRemoteSocketAddress方法類似,也是同時(shí)得到了本地IP和Socket對象所綁定的端口號。如果要得到本地IP和端口號,必須將這個(gè)方法的返回值轉(zhuǎn)換為InetSocketAddress對象。
System.out.println(((InetSocketAddress)socket.getLocalSocketAddress()).getHostName());
System.out.println(((InetSocketAddress)socket.getLocalSocketAddress()).getPort());
3. 用于傳輸數(shù)據(jù)的輸入、輸出流
輸入、輸出流在前面的章節(jié)已經(jīng)被多次用到。在這里讓我們來簡單回顧一下。
(1) public InputStream getInputStream() throws IOException
用于獲得從服務(wù)器讀取數(shù)據(jù)的輸入流。它所得以的流是最原始的源。為了操作更方便,我們經(jīng)常使用InputStreamReader和BufferedReader來讀取從服務(wù)器傳過來的字符串?dāng)?shù)據(jù)。
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
用于獲得向服務(wù)器發(fā)送數(shù)據(jù)的輸出流。輸出流可以通過OutputStreamWriter和BufferedWriter向服務(wù)器寫入字符串?dāng)?shù)據(jù)。
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write("你好");
bufferedWriter.flush();
注意:在使用OutputStream的write方法輸出數(shù)據(jù)后,必須使用flush方法刷新輸出緩沖區(qū),以便將輸出緩沖區(qū)中的數(shù)據(jù)發(fā)送出去。如果要輸出字符串,使用OutputStreamWriter和BufferedWriter都可以;它們的write方法都可以直接使用字符串作為參數(shù)來輸出數(shù)據(jù)。而這一點(diǎn)與相應(yīng)的InputStreamReader和BufferedReader不同;它們中只有BufferedReader有readLine方法,因此,必須使用BufferedReader才能直接讀取字符串?dāng)?shù)據(jù)。
下一篇:Java網(wǎng)絡(luò)編程從入門到精通(18):Socket類的getter和setter方法(2)
《Android開發(fā)完全講義(第2版)》(本書版權(quán)已輸出到臺灣)
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 銀河使者 閱讀(4783) 評論(3) 編輯 收藏 所屬分類: java 、 原創(chuàng) 、網(wǎng)絡(luò)編程