在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、域名等信息.
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()
這個方法是將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()); |
注意:以上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()); |
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()); |
(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的write方法輸出數據后,必須使用flush方法刷新輸出緩衝區,以便將輸出緩衝區中的數據發送出去.如果要輸出字元串,使用OutputStreamWriter和BufferedWriter都可以;它們的write方法都可以直接使用字元串作為參數來輸出數據.而這一點與相應的InputStreamReader和BufferedReader不同;它們中只有BufferedReader有readLine方法,因此,必須使用BufferedReader才能直接讀取字元串數據.
[火星人 ] Java網路編程從入門到精通(17):Socket類的getter和setter方法(1)已經有608次圍觀