<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 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 銀河使者 閱讀(4778) 評論(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
    主站蜘蛛池模板: 色哟哟国产精品免费观看| 亚洲av日韩av综合| 好男人视频社区精品免费| 久久99精品免费一区二区| 亚洲avav天堂av在线网爱情| 国产AV无码专区亚洲AV毛网站| 日本特黄特色aa大片免费| 日韩吃奶摸下AA片免费观看| 无码少妇精品一区二区免费动态| 国产av无码专区亚洲av毛片搜| 亚洲剧场午夜在线观看| 亚洲视频手机在线| 亚洲国产精品无码久久一线| 在线亚洲精品福利网址导航| 亚洲阿v天堂在线2017免费| 国产又大又长又粗又硬的免费视频| 中文字幕免费高清视频| 日韩成人免费视频| 99re6在线精品视频免费播放| 亚洲免费在线视频| 57pao国产成视频免费播放| 99爱在线精品视频免费观看9| 99re在线这里只有精品免费| 国产成人精品一区二区三区免费| 亚欧免费无码aⅴ在线观看| 无码精品人妻一区二区三区免费看 | 一本一道dvd在线观看免费视频| 美女视频黄.免费网址 | 亚洲乱码精品久久久久..| 亚洲娇小性xxxx色| 大桥未久亚洲无av码在线| 十八禁的黄污污免费网站| a在线观看免费视频| 18禁免费无码无遮挡不卡网站 | 国产免费区在线观看十分钟| 日韩a级无码免费视频| 欧美好看的免费电影在线观看| 全亚洲最新黄色特级网站 | 久久精品网站免费观看| 在线A亚洲老鸭窝天堂| 亚洲精品天堂在线观看|