java Socket編程

來源:互聯網
上載者:User

標籤:ams   code   編程   news   音頻   建立   connect   邏輯   列印流   

一、網路編程概述

網路編程是指編寫運行在多個裝置(電腦)的程式,這些裝置都通過網路連接起來。

java.net包中 J2SE 的 API 包含有類和介面,它們提供低層次的通訊細節。你可以直接使用這些類和介面,來專註於解決問題,而不用關注通訊細節。

java.net包中提供了兩種常見的網路通訊協定的支援:

  • TCP:TCP 是傳輸控制通訊協定的縮寫,它保障了兩個應用程式之間的可靠通訊。通常用於互連網協議,被稱 TCP / IP。

TCP協議是連線導向的通訊協定,即在傳輸資料前先在發送端和接收端建立邏輯串連,然後再傳輸資料,它提供了兩台電腦之間可靠無差錯的資料轉送。在TCP串連中必須要明確用戶端與伺服器端,由用戶端向服務端發出串連請求,每次串連的建立都需要經過“三向交握”。第一次握手,用戶端向伺服器端發出串連請求,等待伺服器確認,第二次握手,伺服器端向用戶端回送一個響應,通知用戶端收到了串連請求,第三向交握,用戶端再次向伺服器端發送確認資訊,確認串連。

  • UDP:UDP 是使用者資料包通訊協定的縮寫,一個不需連線的協議。提供了應用程式之間要發送的資料的資料包。

UDP是無串連通訊協定,即在資料轉送時,資料的發送端和接收端不建立邏輯串連。簡單來說,當一台電腦向另外一台電腦發送資料時,發送端不會確認接收端是否存在,就會發出資料,同樣接收端在收到資料時,也不會向發送端反饋是否收到資料。

由於使用UDP協議消耗資源小,通訊效率高,所以通常都會用於音頻、視頻和普通資料的傳輸例如視頻會議都使用UDP協議,因為這種情況即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響。
而Socket通訊端正是使用TCP提供了兩台電腦之間的通訊機會。

二、Socketsocket概念

網路上的兩個程式通過一個雙向的通訊串連實現資料的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的串連。Socket是TCP/IP協議的一個十分流行的編程介面,一個Socket由一個IP地址和一個連接埠號碼唯一確定。但是,Socket所支援的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯絡的。在Java環境下,Socket編程主要是指基於TCP/IP協議的網路編程。

socket通訊過程

用戶端程式建立一個通訊端,並嘗試串連伺服器的通訊端。

當串連建立時,伺服器會建立一個 Socket 對象。用戶端和伺服器現在可以通過對 Socket 對象的寫入和讀取來進行通訊。

java.net.Socket 類代表一個通訊端,並且 java.net.ServerSocket 類為伺服器程式提供了一種來監聽用戶端,並與他們建立串連的機制。

以下步驟在兩台電腦之間使用通訊端建立TCP串連時會出現:

  • 伺服器執行個體化一個 ServerSocket 對象,表示通過伺服器上的連接埠通訊。
  • 伺服器調用 ServerSocket 類的 accept() 方法,該方法將一直等待,直到用戶端串連到伺服器上給定的連接埠。
  • 伺服器正在等待時,一個用戶端執行個體化一個 Socket 對象,指定伺服器名稱和連接埠號碼來請求串連。
  • Socket 類的建構函式試圖將用戶端串連到指定的伺服器和連接埠號碼。如果通訊被建立,則在用戶端建立一個 Socket 對象能夠與伺服器進行通訊。
  • 在伺服器端,accept() 方法返回伺服器上一個新的 socket 引用,該 socket 串連到用戶端的 socket。

串連建立後,通過使用 I/O 流在進行通訊,每一個socket都有一個輸出資料流和一個輸入資料流,用戶端的輸出資料流串連到伺服器端的輸入資料流,而用戶端的輸入資料流串連到伺服器端的輸出資料流。

TCP 是一個雙向的通訊協定,因此資料可以通過兩個資料流在同一時間發送.以下是一些類提供的一套完整的有用的方法來實現 socket。

服務端
  1. 建立ServerSocket對象,綁定監聽連接埠
  2. 通過accept()方法監聽用戶端請求
  3. 串連建立後,通過輸入資料流讀取用戶端發送的請求資訊
  4. 通過輸出資料流向用戶端發送鄉音資訊
  5. 關閉相關資源

程式碼範例:

/*** 基於TCP協議的Socket通訊,實現使用者登入,服務端*///1、建立一個伺服器端Socket,即ServerSocket,指定綁定的連接埠,並監聽此連接埠    ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某個連接埠//2、調用accept()方法開始監聽,等待用戶端的串連    Socket socket = serverSocket.accept();//3、擷取輸入資料流,並讀取用戶端資訊    InputStream is = socket.getInputStream();    InputStreamReader isr =newInputStreamReader(is);    BufferedReader br =newBufferedReader(isr);    String info =null;    while((info=br.readLine())!=null){     System.out.println("我是伺服器,用戶端說:"+info);    }    socket.shutdownInput();//關閉輸入資料流//4、擷取輸出資料流,響應用戶端的請求    OutputStream os = socket.getOutputStream();    PrintWriter pw = new PrintWriter(os);    pw.write("歡迎您!");    pw.flush();//5、關閉資源    pw.close();    os.close();    br.close();    isr.close();    is.close();    socket.close();    serverSocket.close();    
用戶端
  1. 建立Socket對象,指明需要已連線的服務器的地址和連接埠號碼
  2. 串連建立後,通過輸出資料流想伺服器端發送請求資訊
  3. 通過輸入資料流擷取伺服器響應的資訊
  4. 關閉響應資源

程式碼範例:

//用戶端//1、建立用戶端Socket,指定伺服器位址和連接埠    Socket socket =newSocket("localhost",10086);//2、擷取輸出資料流,向伺服器端發送資訊    OutputStream os = socket.getOutputStream();//位元組輸出資料流    PrintWriter pw =newPrintWriter(os);//將輸出資料流封裝成列印流    pw.write("使用者名稱:admin;密碼:123");    pw.flush();    socket.shutdownOutput();//3、擷取輸入資料流,並讀取伺服器端的響應資訊    InputStream is = socket.getInputStream();    BufferedReader br = new BufferedReader(new     InputStreamReader(is));    String info = null;    while((info=br.readLine())!null){        System.out.println("我是用戶端,伺服器說:"+info);}//4、關閉資源    br.close();    is.close();    pw.close();    os.close();    socket.close();
三、有關源碼解析(1)ServerSocket類

伺服器應用程式通過使用 java.net.ServerSocket 類以擷取一個連接埠,並且偵聽用戶端請求。

構造方法
public ServerSocket(int port) throws IOException建立綁定到特定連接埠的伺服器通訊端。public ServerSocket(int port, int backlog) throws IOException利用指定的 backlog(串連隊列的最大長度,隊列滿時拒絕下一個串連) 建立伺服器通訊端並將其綁定到指定的本地連接埠號碼。public ServerSocket(int port, int backlog, InetAddress address) throws IOException使用指定的連接埠、偵聽 backlog 和要綁定到的本地 IP 位址建立伺服器(用戶端IP)。public ServerSocket() throws IOException建立非綁定伺服器通訊端。
常用方法
public int getLocalPort()返回此通訊端在其上偵聽的連接埠。public Socket accept() throws IOException偵聽並接受到此通訊端的串連。public void setSoTimeout(int timeout)通過指定逾時值啟用/禁用 SO_TIMEOUT,以毫秒為單位。public void bind(SocketAddress host, int backlog)將 ServerSocket 綁定到特定地址(IP 位址和連接埠號碼)。
(2)Socket類

java.net.Socket 類代表用戶端和伺服器都用來互相溝通的通訊端。用戶端要擷取一個 Socket 對象通過執行個體化 ,而 伺服器獲得一個 Socket 對象則通過 accept() 方法的傳回值。

Socket提供給了外部兩種執行個體化方式,分別為連線導向的Socket執行個體,面向非串連的Socket執行個體。 其核心在於是否調用了本地的connect()方法。

構造方法
public Socket(String host, int port) throws UnknownHostException, IOException.建立一個流通訊端並將其串連到指定主機上的指定連接埠號碼。public Socket(InetAddress host, int port) throws IOException建立一個流通訊端並將其串連到指定 IP 位址的指定連接埠號碼。public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.建立一個通訊端並將其串連到指定遠程主機上的指定遠程連接埠。(localAddress:the local address the socket is bound to)public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.建立一個通訊端並將其串連到指定遠程地址上的指定遠程連接埠。public Socket()通過系統預設類型的 SocketImpl 建立未串連通訊端。
常用方法
public void connect(SocketAddress host, int timeout) throws IOException將此通訊端串連到伺服器,並指定一個逾時值。public InetAddress getInetAddress()返回通訊端串連的地址。public int getPort()返回此通訊端串連到的遠程連接埠。public int getLocalPort()返回此通訊端綁定到的本地連接埠。public SocketAddress getRemoteSocketAddress()返回此通訊端串連的端點的地址,如果未串連則返回 null。public InputStream getInputStream() throws IOException返回此通訊端的輸入資料流。public OutputStream getOutputStream() throws IOException返回此通訊端的輸出資料流。public void close() throws IOException關閉此通訊端。
(3)InetAddress類
static InetAddress getByAddress(byte[] addr)在給定原始 IP 位址的情況下,返回 InetAddress 對象。static InetAddress getByAddress(String host, byte[] addr)根據提供的主機名稱和 IP 位址建立 InetAddress。static InetAddress getByName(String host)在給定主機名稱的情況下確定主機的 IP 位址。String getHostAddress() 返回 IP 位址字串(以文本表現形式)。String getHostName() 擷取此 IP 位址的主機名稱。static InetAddress getLocalHost()返回本地主機。String toString()將此 IP 位址轉換為 String。

UDP的socket編程應該是使用DatagramSocket類

之後會和大家分享學習一些與Socket有關類的更加詳細的內容

java Socket編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.