一、 TCP 網絡應用程序開發流程
學習目標
- 能夠知道TCP客戶端程序的開發流程
1. TCP 網絡應用程序開發流程的介紹
TCP 網絡應用程序開發分為:
- TCP 客戶端程序開發
- TCP 服務端程序開發
說明:
客戶端程序是指運行在用戶設備上的程序 服務端程序是指運行在服務器設備上的程序,專門為客戶端提供數據服務。
2. TCP 客戶端程序開發流程的介紹
步驟說明:
- 創建客戶端套接字對象
- 和服務端套接字建立連接
- 發送數據
- 接收數據
- 關閉客戶端套接字
3. TCP 服務端程序開發流程的介紹
步驟說明:
- 創建服務端端套接字對象
- 綁定端口號
- 設置監聽
- 等待接受客戶端的連接請求
- 接收數據
- 發送數據
- 關閉套接字
4. 小結
- TCP 網絡應用程序開發分為客戶端程序開發和服務端程序開發。
- 主動發起建立連接請求的是客戶端程序
- 等待接受連接請求的是服務端程序
二、socket之send和recv原理剖析
學習目標
- 能夠知道send和recv的底層工作原理
1. 認識TCP socket的發送和接收緩沖區
當創建一個TCP socket對象的時候會有一個發送緩沖區和一個接收緩沖區,這個發送和接收緩沖區指的就是內存中的一片空間。
2. send原理剖析
send是不是直接把數據發給服務端?
不是,要想發數據,必須得通過網卡發送數據,應用程序是無法直接通過網卡發送數據的,它需要調用操作系統接口,也就是說,應用程序把發送的數據先寫入到發送緩沖區(內存中的一片空間),再由操作系統控制網卡把發送緩沖區的數據發送給服務端網卡 。
3. recv原理剖析
recv是不是直接從客戶端接收數據?
不是,應用軟件是無法直接通過網卡接收數據的,它需要調用操作系統接口,由操作系統通過網卡接收數據,把接收的數據寫入到接收緩沖區(內存中的一片空間),應用程序再從接收緩存區獲取客戶端發送的數據。
4. send和recv原理剖析圖
說明:
- 發送數據是發送到發送緩沖區
- 接收數據是從接收緩沖區 獲取
5. 小結
不管是recv還是send都不是直接接收到對方的數據和發送數據到對方,發送數據會寫入到發送緩沖區,接收數據是從接收緩沖區來讀取,發送數據和接收數據最終是由操作系統控制網卡來完成。
三、TCP服務端程序開發
學習目標
- 能夠寫出TCP服務端應用程序接收和發送消息
1. 開發 TCP 服務端程序開發步驟回顧
- 創建服務端端套接字對象
- 綁定端口號
- 設置監聽
- 等待接受客戶端的連接請求
- 接收數據
- 發送數據
- 關閉套接字
2. socket 類的介紹
導入 socket 模塊
import socket
創建服務端 socket 對象
socket.socket(AddressFamily, Type)
參數說明:
- AddressFamily 表示IP地址類型, 分為TPv4和IPv6
- Type 表示傳輸協議類型
方法說明:
- bind((host, port)) 表示綁定端口號, host 是 ip 地址,port 是端口號,ip 地址一般不指定,表示本機的任何一個ip地址都可以。
- listen (backlog) 表示設置監聽,backlog參數表示最大等待建立連接的個數。
- accept() 表示等待接受客戶端的連接請求
- send(data) 表示發送數據,data 是二進制數據
- recv(buffersize) 表示接收數據, buffersize 是每次接收數據的長度
3. TCP 服務端程序開發示例代碼
import socketif __name__ == '__main__':# 創建tcp服務端套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 設置端口號復用,讓程序退出端口號立即釋放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 給程序綁定端口號tcp_server_socket.bind(("", 8989))# 設置監聽# 128:最大等待建立連接的個數, 提示: 目前是單任務的服務端,同一時刻只能服務與一個客戶端,后續使用多任務能夠讓服務端同時服務與多個客戶端,# 不需要讓客戶端進行等待建立連接# listen后的這個套接字只負責接收客戶端連接請求,不能收發消息,收發消息使用返回的這個新套接字來完成tcp_server_socket.listen(128)# 等待客戶端建立連接的請求, 只有客戶端和服務端建立連接成功代碼才會解阻塞,代碼才能繼續往下執行