JAVA TCP/IP Socket 編程(一)

基本套接字:

TCP協議:

Java 爲TCP協議提供了兩個類:Socket 和 ServerSocket類。一個TCP連接是一個抽象的雙向通道,兩端分別綁定IP和端口號。首先由客戶端TCP向服務端TCP請求連接,ServerSocket實例用來監聽連接請求,爲每個請求創建新的Socket實例,也就是說服務端同時處理ServerSocket和Socket實例,而客戶端只需要處理Socket實例。

TCP客戶端:

客戶端向服務端發送TCP請求後,就被動的等待服務器響應。一般包括以下三步:

  1. 創建Socket實例:綁定服務端IP和端口號,建立連接。
  2. 通過Socket的輸入輸出流來進行通信:Socket.getInputStream()和Socket.getOutputStream()方法來獲取。
  3. Socket關閉通信:包括I/O流,Socket本身等。
TCP服務端:

服務端的工作是創建一個ServerSocket實例監聽相應端口,被動的等待客戶端的請求,一般包括以下兩步:

  1. 創建ServerSocket實例並綁定服務端口:用於監聽端口到來的TCP請求
  2. 重複執行:
  • 調用accept方法,獲取客戶端連接,並返回一個Socket實例。
  • 使用Socket的獲取的I/O流與客戶端進行通信。
  • 關閉Socket與I/O流。

關於服務端獲取的Socket實例,可以綁定到一個線程,來提高服務端效率,使用不同的線程處理不同的客戶請求也是成熟TCP/IP服務器的基本原理。


具體demo代碼改天再發。


UDP協議:

UDP協議與TCP不同,他是一種盡力而爲的端到端傳輸服務,不需要事先建立鏈接,也不保證數據一定能到達,也因此在效率上比TCP快的多。Java中關於UDP的套接字有DatagramPacket類和DatagramSocket類來實現。
與TCP的另一個不同點在於,UDP終端間交換的是數據報文,不再是通過字節流。數據報文也就是DatagramPacket實例,發送信息時,首先創建一個DatagramPacket類的實例,並將其作爲DatagramSocket類的send方法。同樣,接受信息時,也是先創建一個DatagramPacket實例,用來預先分配一些空間,然後將收到的信息存放在該空間中,然後把該實例作爲參數傳遞給DatagramSocket的receive方法。當然上述的每個DatagramPacket實例都是綁定了相應地址和端口信息的。若是被髮送的數據報,則需綁定目的地址和端口號,若是接受的數據報,則綁定接收信息的源地址。
UDP客戶端:
同樣是先向服務端發送一個數據報,然後被動的等待服務端響應。一般分爲以下三步:
  1. 創建DatagramSocket實例和組裝待發送的數據報:創建DatagramSocket實例,設置相應參數(包括:timeout、本地端口信息等),創建DatagramPacket實例,包括數據,數據長度,服務端地址、端口。
  2. 使用DatagramSocket實例的send和receive方法進行通信:發送第一步組裝的數據報,接收時需傳入一個空的數據報實例。
  3. 關閉通信:DatagramSocket類的close方法。
UDP服務端:
建立一個通信終端,等待客戶端的數據報文初始化,不需建立鏈接,分爲以下三步:
  1. 創建一個DatagramSocket實例:綁定本地地址、端口,準備接受從任何客戶端發來的數據報。
  2. 使用DatagramSocket實例的receive方法接受一個數據報:接受的數據報中包含了客戶端信息,服務端由此瞭解了響應信息的目的地址。
  3. 使用DatagramSocket的receive和send方法與客戶端通信:通過DatagramPacket實例來實現。

UDP與TCP的一些區別,不建立鏈接,雖然提供了相應的API,不建議使用。UDP保留了消息的邊界,DatagramSocket的每個receive只能接受一個send的內容,而且不同的receive接收到的絕不會返回同一個send方法的所發送的數據,每次接收完DatagramPacket的長度變爲處理數據報的長度,需按需要修改。對於TCP來說每個收到的數據都是都是來自同一個TCP鏈接,而UDP的每一個receive方法接收到到的數據可以來自不同的發送者。


demo代碼後續加上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章