1. 程式人生 > >JAVA Socket模擬簡單通訊例項(一)

JAVA Socket模擬簡單通訊例項(一)

什麼是Sokcet?

    Socket就是套接字,說白了就是連結的一端。建立網路通訊的雙方,都有一個socket,每一個socket都儲存有一個此次通訊需要的資料,例如對方的網路地址,埠號等。

    有了網路地址,就可以在網路中找到那個需要連線的機器,有了埠號,就知道連結對方機器的哪一塊進行資料傳輸。於是,網路連結就可以產生,流就得以建立,資料就可以進行傳輸。

    socket是一個橋樑,連結了網路通訊中的傳輸層與應用層。如圖,(圖片來源百度百科)


    傳輸層規定了傳輸的規範。常用的有TCP和UDP協議。TCP可靠,開銷大,UDP不可靠,開銷小。

    應用層規定的被傳輸資料的規範,最最常用的也就是現在所見的網頁——來自於CSDN伺服器,通過TCP協議傳輸到瀏覽器,按照HTTP協議協議寫的請求與回覆。

    注:HTTP協議不一定是基於TCP的,一般是使用TCP協議的80埠進行通訊的。但不使用不可靠的UDP進行通訊。

規範原件原文

    
“HTTP communication usually takes place over TCP/IP connections. The default port is TCP 80 , but other ports can be used.
 This does not preclude HTTP from being implemented on top of any other protocol on the Internet,
 or on other networks. HTTP only presumes a reliable transport; any protocol that provides such guarantees can be used;
 the mapping of the HTTP/1.1 request and response structures onto the transport data units of the protocol in question is outside the scope
of this specification.”——RFC2616

    “HTTP通訊通常發生在TCP/IP連線上。預設埠是TCP 80,但可以使用其他埠。這並不妨礙HTTP在Internet上或其他網路上的任何其他協議之上實現。
HTTP是需要一個可靠的傳輸;任何提供此類擔保協議可以使用;對映的HTTP / 1.1請求和響應的結構上的協議資料單元的傳輸問題範圍之外的。
本規範RFC2616。”

Java Socket

        java有關socket的內容都在java.net包中。api文件中這麼描述。文件中描述的很詳細,不在贅述。

         java.net 包可以大致分為兩個部分:

        低階 API,用於處理以下抽象:

            地址,也就是網路識別符號,如 IP 地址。

            套接字,也就是基本雙向資料通訊機制。

            介面,用於描述網路介面。 

        高階 API,用於處理以下抽象:

            URI,表示統一資源識別符號。

            URL,表示統一資源定位符。

            連線,表示到 URL 所指向資源的連線。

地址

在整個 java.net API 中,地址或者用作主機識別符號或者用作套接字端點識別符號。

InetAddress 類是表示 IP(Internet 協議)地址的抽象。它擁有兩個子類:

    用於 IPv4 地址的 Inet4Address。
    用於 IPv6 地址的 Inet6Address。

但是,在大多數情況下,不必直接處理子類,因為 InetAddress 抽象應該覆蓋大多數必需的功能。
關於 IPv6

並非所有系統都支援 IPv6 協議,而當 Java 網路連線堆疊嘗試檢測它並在可用時透明地使用它時,還可以利用系統屬性禁用它。在 IPv6 不可用或被顯式禁用的情況下,Inet6Address 對大多數網路連線操作都不再是有效引數。雖然可以保證在查詢主機名時 java.net.InetAddress.getByName 之類的方法不返回 Inet6Address,但仍然可能通過傳遞字面值來建立此類物件。在此情況下,大多數方法在使用 Inet6Address 呼叫時都將丟擲異常。
套接字

套接字是在網路上建立機器之間的通訊連結的方法。java.net 包提供 4 種套接字:

    Socket 是 TCP 客戶端 API,通常用於連線遠端主機。
    ServerSocket 是 TCP 伺服器 API,通常接受源於客戶端套接字的連線。
    DatagramSocket 是 UDP 端點 API,用於傳送和接收資料包
    MulticastSocket 是 DatagramSocket 的子類,在處理多播組時使用。

使用 TCP 套接字的傳送和接收操作需要藉助 InputStream 和 OutputStream 來完成,這兩者是通過 Socket.getInputStream() 和 Socket.getOutputStream() 方法獲取的。
介面

NetworkInterface 類提供 API 以瀏覽和查詢本地機器的所有網路介面(例如,乙太網連線或 PPP 端點)。只有通過該類才可以檢查是否將所有本地介面都配置為支援 IPv6。
高階 API

java.net 包中的許多類可以提供更加高階的抽象,允許方便地訪問網路上的資源。這些類為:

    URI 是表示在 RFC 2396 中指定的統一資料識別符號的類。顧名思義,它只是一個識別符號,不直接提供訪問資源的方法。
    URL 是表示統一資源定位符的類,它既是 URI 的舊式概念又是訪問資源的方法。
    URLConnection 是根據 URL 建立的,是用於訪問 URL 所指向資源的通訊連結。此抽象類將大多數工作委託給底層協議處理程式,如 http 或 ftp。
    HttpURLConnection 是 URLConnection 的子類,提供一些特定於 HTTP 協議的附加功能。

建議的用法是使用 URI 指定資源,然後在訪問資源時將其轉換為 URL。從該 URL 可以獲取 URLConnection 以進行良好控制,也可以直接獲取 InputStream。

下面是一個示例:

URI uri = new URI("http://java.sun.com/");
URL url = uri.toURL();
InputStream in = url.openStream();
協議處理程式
如上所述,URL 和 URLConnection 都依賴於協議處理程式,所以協議處理程式必須存在;否則將丟擲異常。此為與 URI 的主要不同點,URI 僅標識資源,所以不必訪問協議處理程式。因此,儘管可能利用任何種類的協議方案(例如,myproto://myhost.mydomain/resource/)建立 URI,但類似的 URL 仍將試圖例項化指定協議的處理程式;如果指定協議的處理程式不存在,則丟擲異常。

預設情況下,協議處理程式從預設位置動態載入。但是,通過設定 java.protocol.handler.pkgs 系統屬性也可能增加搜尋路徑。例如,如果將其設定為 myapp.protocols,則 URL 程式碼將首先嚐試(對於 http 而言)載入 myapp.protocols.http.Handler,然後,如果失敗,則嘗試從預設位置載入 http.Handler。

注意,處理程式類必須為抽象類 URLStreamHandler 的子類。