Java網絡編程從入門到精通(17):Socket類的getter和setter方法(1) – JAVA編程語言程序開發技術文章

在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才能直接讀取字符串數據。


 

發佈留言