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) { } } } }