java中的網絡通訊編程之TCP篇

java中的網絡通訊編程分爲兩種,一、TCP(傳輸控制協議)方式。二、UDP(用戶數據報協議)方式。java

一、TCP(傳輸控制協議)方式
編程

使用這種網絡通訊方式的時候,須要創建專門的虛擬鏈接,而後才能進行可靠的數據傳輸,若是數據傳輸失敗,則客戶端會自動重發該數據。服務器

二、UDP(用戶數據報協議)方式。網絡

這種方式就像是手機之間發送短信,無需創建專門的連接,可是傳輸也是不可靠的,若是短信發送失敗的話,則服務端是收不到數據的。socket

這兩種方式都是常常用到的,重要的數據通常都是採用tcp的方式來進行傳輸,大量的非重要數據能夠採用udp的方式來進行傳輸,因爲tcp須要創建鏈接並以及確認傳輸是否正確,因此它比udp要多花費一些時間,並且傳輸時,產生的數據量要比udp方式要大一些。tcp

總結一些tcp和udp的區別學習

UDP是一種不可靠的傳輸協議,它不能保證每次傳輸的數據包都是按次序到達的。spa

TCP是一種可靠的傳輸協議,它確保接受方徹底正確的接收了發送方發送的全部數據。.net

UDP傳輸數據的時候有大小限制,每一個數據報大小不能超過64KB。線程

TCP則沒有限制,它們在socket之間按照統一的格式,傳多少都沒問題。

UDP不須要創建鏈接就能夠傳輸數據,由於它所傳輸的數據報中都已經包含接收方完整的地址

TCP則否則,它必須創建連接,在socket之間傳輸必需要創建鏈接,全部它比UDP多了一個創建鏈接的時間。

UDP操做簡單,TCP生命力強。


客戶端網絡編程

一、創建鏈接

創建鏈接的時候須要指定鏈接到服務器的ip地址和端口號,創建完成後就會造成一條虛擬鏈接,後面的交換數據就會經過這條鏈接來進行。

二、交換數據

交換鏈接的時候嚴格按照請求的響應模型,客戶端將請求數據發送給服務端,服務端根據請求的數據做出相應的響應,將數據按照相應模型反饋給客戶端。

三、關閉鏈接

當數據交換完成後,就會斷開鏈接,釋放端口、內存等資源。

步驟2能夠根據業務邏輯的須要,重複進行。


服務端網絡編程

一、監聽端口

服務端所要作的就是監聽本地的某個端口,這個端口就是服務端開放給客戶端的端口。

二、獲取鏈接

當服務端鏈接到服務端的時候,就會獲取一個鏈接,鏈接中包含客戶端的ip地址等信息,交換數據的時候就是經過此連接進行交換數據。每個鏈接都是由一個專門的線程獨立處理該鏈接。

三、交換數據

服務端的交換數據的過程和客戶端的不一樣,服務端是先接受來自客戶端的數據,在進行相應的邏輯處理後,將獲得的數據發送給客戶端。

四、關閉鏈接

交換完成後,就會關閉這個鏈接,同時釋放其所監聽的端口、內存等資源。


舉例說明:

客戶端
1) 創建Socket鏈接 
Socket socket1 = new Socket(「http://blog.csdn.net/jessonlv」,80);


2)按照「請求-響應」模型進行網絡數據交換
在Java語言中,數據傳輸功能由Java IO實現,也就是說只須要從鏈接中得到輸入流和輸出流便可,而後將須要發送的數據寫入鏈接對象的輸出流中,在發送完成之後從輸入流中讀取數據便可。示例代碼以下:
 OutputStream os = socket1.getOutputStream(); //得到輸出流
 InputStream is = socket1.getInputStream();     //得到輸入流
這裏得到的只是最基本的輸出流和輸入流對象,還能夠根據前面學習到的IO知識,使用流的嵌套將這些得到到的基本流對象轉換成須要的裝飾流對象,從而方便數據的操做。

3)關閉網絡鏈接
 socket1.close();

public class Constants {  
  
    public static void main(String[] args) {  
        ServerSocket serverSocket = null;  
        Socket socket = null;  
        OutputStream os = null;  
        InputStream is = null;  
        // 監聽端口號  
        int port = 10000;  
        try {  
            // 創建鏈接  
        serverSocket = new ServerSocket(port);  
            // 得到鏈接  
            socket = serverSocket.accept();  
            // 接收客戶端發送內容  
            is = socket.getInputStream();  
            byte[] b = new byte[1024];  
            int n = is.read(b);  
            // 輸出  
            System.out.println("客戶端發送內容爲:" + new String(b, 0, n));  
            // 向客戶端發送反饋內容  
            os = socket.getOutputStream();  
            os.write(b, 0, n);  
        } catch (Exception e) {  
        e.printStackTrace();  
        } finally {  
            try {  
                // 關閉流和鏈接  
                os.close();  
                is.close();  
                socket.close();  
                serverSocket.close();  
            } catch (Exception e) {  
            }  
        }  
    }  
}  
相關文章
相關標籤/搜索