熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java網絡編程從入門到精通(15):為什麼要使用SocketAddress來管理網絡地址

2013-11-23 19:04:31  來源: Java核心技術 

  在使用Socket來連接服務器時最簡單的方式就是直接使用IP和端口但Socket類中的connect方法並未提供這種方式而是使用SocketAddress類來向connect方法傳遞服務器的IP和端口雖然這種方式從表面上看要麻煩一些但它會給我們帶來另外一個好處那就是網絡地址的重用

  所謂網絡地址的重用表現在兩個方面

   通過建立一個SocketAddress對象可以在多次連接同一個服務器時使用這個SocketAddress對象

   在Socket類中提供了兩個方法getRemoteSocketAddress和getLocalSocketAddress通過這兩個方法可以得到服務器和本機的網絡地址而且所得到的網絡地址在相應的Socket對象關閉後任然可以使用下面是這兩個方法的聲明

   public SocketAddress getRemoteSocketAddress()
public SocketAddress getLocalSocketAddress()

  不管在使用Socket類連接服務器時是直接使用IP和端口還是使用SocketAddress這兩個方法都返回SocketAddress形式的網絡地址當Socket對象未連接時這兩個方法返回null但要注意的是只有在Socket對象未連接時這兩個方法才返回null而當已經連接成功的Socket對象關閉後仍可使用這兩個方法得到相應的網絡地址

  雖然上面曾多次提到SocketAddress但SocketAddress只是個抽象類它除了有一個默認的構造方法外其它的方法都是abstract的因此我們必須使用SocketAddress的子類來建立SocketAddress對象在JDK中J只為我們提供了IP網絡地址的實現類InetSocketAddress這個類是從SocketAddress繼承的我們可以通過如下的方法來建立SocketAddress對象

   SocketAddress socketAddress = new InetSocketAddress(host ip);

  下面的代碼演示了如何通過SocketAddress來共享網絡地址

   package mynet;

import *;

public class MySocketAddress
{
    public static void main(String[] args)
    {
        try
        {
            Socket socket = new Socket( );
            SocketAddress socketAddress = socketgetRemoteSocketAddress();
            socketclose();
            Socket socket = new Socket();
            // socketbind(new InetSocketAddress( ));
            nnect(socketAddress);
            socketclose();
            InetSocketAddress inetSocketAddress = (InetSocketAddress) socketAddress;
            Systemoutprintln(服務器域名:
                            + inetSocketAddressgetAddress()getHostName());
            Systemoutprintln(服務器IP:
                            + inetSocketAddressgetAddress()getHostAddress());
            Systemoutprintln(服務器端口: + inetSocketAddressgetPort());
            InetSocketAddress inetSocketAddress = (InetSocketAddress) socket
                            getLocalSocketAddress();
            Systemoutprintln(本地IP:
                            + inetSocketAddressgetAddress()getLocalHost()
                                            getHostAddress());
            Systemoutprintln(本地端口: + inetSocketAddressgetPort());
        }
        catch (Exception e)
        {
            Systemoutprintln(egetMessage());
        }
    }
}

  輸出結果

  服務器域名

  服務器IP

  服務器端口

  本地IP

  本地端口

  如果多次運行例程本地端口的值可能在每次都不一樣這是因為在socket在連接時並未使用bind來綁定本地的端口而這個本地端口是由系統在中隨機選取的因此在每次運行程序時這個本地端口不一定相同


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26231.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.