Java通訊端編程

來源:互聯網
上載者:User

標籤:

實現了基於TCP的Java Socket編程執行個體代碼:簡單實現了伺服器和用戶端的通訊端編程,並傳遞簡單的字串。(在伺服器聲明通訊端時需要綁定伺服器的連接埠,連接埠為臨界資源只能一個通訊端使用。伺服器編程時調用accept()方法,伺服器進入等待串連狀態。)

Java中TCP/IP服務端串連建立的源碼實現(socket->bind->listen->accept):

(1)在進行通訊端編程的時候,首先我們要建立一個服務端,並在服務端建立通訊端,為通訊端綁定介面,然後監聽用戶端可能發來的串連建立請求。這一套流程均在ServerSocket的構造時完成(這裡需要說明的是Java中的Socket和ServerSocket均是實現的java.io.Closeable介面。下面我們來看下建構函式中是如何?連接埠的綁定和串連的監聽的: 

public ServerSocket(int port) throws IOException {        this(port, 50, null);    }

  對於只有連接埠輸入的建構函式來說,我們複用另一個建構函式:ServerSocket(int port, int backlog, InetAddress bindAddr)。其中port是綁定的連接埠號碼,backlog是最大串連並發數,預設為50。bindAddr是被綁定的當地IP地址。

public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {        setImpl();        if (port < 0 || port > 0xFFFF)            throw new IllegalArgumentException(                       "Port value out of range: " + port);        if (backlog < 1)          backlog = 50;        try {            bind(new InetSocketAddress(bindAddr, port), backlog);        } catch(SecurityException e) {            close();            throw e;        } catch(IOException e) {            close();            throw e;        }    }
View Code

  我們可以看到在這個建構函式中有bind(new InetSocketAddress(bindAddr, port), backlog)這句代碼,這就是用來進行IP地址和連接埠綁定的,我們在使用通訊端時可以只設定連接埠,則IP地址預設為null。進入到bind方法中:

public void bind(SocketAddress endpoint, int backlog) throws IOException {       ......        try {            SecurityManager security = System.getSecurityManager();            if (security != null)                security.checkListen(epoint.getPort());            getImpl().bind(epoint.getAddress(), epoint.getPort());            getImpl().listen(backlog);            bound = true;        } catch(SecurityException e) {            bound = false;            throw e;        } catch(IOException e) {            bound = false;            throw e;        }    }

  被我省略的代碼主要是進行安全檢查的工作,查看連接埠是否已經關閉或被佔用,傳進來的地址是否合法等,並提供了相應的處理方法。而try包裹的就是核心的東西了。這裡涉及到SecurityManager、SocketImpl類,目前並不瞭解。不過我們可以看到的bind和listen欄位應該就是通訊端準備進入阻塞狀態的代碼了(因為後面還要調用accept,所以我猜測到這一步並沒有進入阻塞狀態)。

  後面的accept方法又涉及到不知道的類,我等查碩就先不找虐了,先寫到這,後面看熟了再總結。

(2)至於服務通訊端寫好後,用戶端是如何進行串連的,其實也是在構造階段就完成的(socket->connect),下面列出相關源碼,以後在做分析。(connect是主動建立串連的方法,這說明每個類型的請求都需要編程一個通訊端,用戶端與服務端在這時是多對一的關係)

public Socket(String host, int port)        throws UnknownHostException, IOException    {        this(host != null ? new InetSocketAddress(host, port) :             new InetSocketAddress(InetAddress.getByName(null), port),             (SocketAddress) null, true);    }

   其中host是IP地址,port是連接埠號碼。

private Socket(SocketAddress address, SocketAddress localAddr,                   boolean stream) throws IOException {        setImpl();        // backward compatibility        if (address == null)            throw new NullPointerException();        try {            createImpl(stream);            if (localAddr != null)                bind(localAddr);            connect(address);        } catch (IOException | IllegalArgumentException | SecurityException e) {            try {                close();            } catch (IOException ce) {                e.addSuppressed(ce);            }            throw e;        }    }
View Code

  見到connect方法足矣,就不往下跟蹤了。

Java通訊端編程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.