基本套接字:
TCP協議:
Java 爲TCP協議提供了兩個類:Socket 和 ServerSocket類。一個TCP連接是一個抽象的雙向通道,兩端分別綁定IP和端口號。首先由客戶端TCP向服務端TCP請求連接,ServerSocket實例用來監聽連接請求,爲每個請求創建新的Socket實例,也就是說服務端同時處理ServerSocket和Socket實例,而客戶端只需要處理Socket實例。
TCP客戶端:
客戶端向服務端發送TCP請求後,就被動的等待服務器響應。一般包括以下三步:
- 創建Socket實例:綁定服務端IP和端口號,建立連接。
- 通過Socket的輸入輸出流來進行通信:Socket.getInputStream()和Socket.getOutputStream()方法來獲取。
- Socket關閉通信:包括I/O流,Socket本身等。
服務端的工作是創建一個ServerSocket實例監聽相應端口,被動的等待客戶端的請求,一般包括以下兩步:
- 創建ServerSocket實例並綁定服務端口:用於監聽端口到來的TCP請求
- 重複執行:
- 調用accept方法,獲取客戶端連接,並返回一個Socket實例。
- 使用Socket的獲取的I/O流與客戶端進行通信。
- 關閉Socket與I/O流。
關於服務端獲取的Socket實例,可以綁定到一個線程,來提高服務端效率,使用不同的線程處理不同的客戶請求也是成熟TCP/IP服務器的基本原理。
具體demo代碼改天再發。
UDP協議:
- 創建DatagramSocket實例和組裝待發送的數據報:創建DatagramSocket實例,設置相應參數(包括:timeout、本地端口信息等),創建DatagramPacket實例,包括數據,數據長度,服務端地址、端口。
- 使用DatagramSocket實例的send和receive方法進行通信:發送第一步組裝的數據報,接收時需傳入一個空的數據報實例。
- 關閉通信:DatagramSocket類的close方法。
- 創建一個DatagramSocket實例:綁定本地地址、端口,準備接受從任何客戶端發來的數據報。
- 使用DatagramSocket實例的receive方法接受一個數據報:接受的數據報中包含了客戶端信息,服務端由此瞭解了響應信息的目的地址。
- 使用DatagramSocket的receive和send方法與客戶端通信:通過DatagramPacket實例來實現。
UDP與TCP的一些區別,不建立鏈接,雖然提供了相應的API,不建議使用。UDP保留了消息的邊界,DatagramSocket的每個receive只能接受一個send的內容,而且不同的receive接收到的絕不會返回同一個send方法的所發送的數據,每次接收完DatagramPacket的長度變爲處理數據報的長度,需按需要修改。對於TCP來說每個收到的數據都是都是來自同一個TCP鏈接,而UDP的每一個receive方法接收到到的數據可以來自不同的發送者。
demo代碼後續加上。