python3 網路程式設計02
套接字傳輸注意事項
- 監聽套接字存在客戶端即可發起連線,但是最終連線的處理需要accept進行處理
- 如果連線的另外一段退出,則recv會立即返回空子串不再阻塞。
- 當連線的另一端退出時,再試圖send傳送就會產生BrokenPipeError
網路收發緩衝區
緩衝區作用 :協調收發(處理)速度
減少互動次數
send和recv實際上是和緩衝區進行互動,傳送緩衝區滿時就無法傳送,接收緩衝區滿時recv才阻塞
TCP粘包
產生原因:
tcp套接字以位元組流方式傳輸,沒有訊息邊界
傳送和接收並不能保證每次傳送都及時的被接收
影響:如果每次傳送內容表達一個獨立的含義此時可能需要處理粘包防止產生歧義
處理方法:
- 每次傳送的訊息新增結尾標誌 (人為增加訊息邊界)
- 傳送資料結構體
- 協調收發速度,每次傳送後都預留接收時間
基於udp套接字的服務端
- 建立資料報套接字
sockfd = socket(AF_INET,SOCK_DGRAM) - 繫結地址
sockfd.bind(addr) - 訊息的收發
data,addr = sockfd.recvfrom(buffersize)
功能 : 接收UDP訊息
引數 : 每次最多接收多大的訊息
返回值:data 接收到的資料
addr 訊息傳送端的地址
- 一次接收一個數據報,如果資料報大小大於buffersize則會丟失部分訊息
sockfd.sendto(data,addr)
功能 : 傳送udp訊息
引數 : data 傳送的訊息 bytes格式
addr 目標地址
返回值: 傳送的位元組數
- 關閉套接字
sockfd.close()
udp客戶端
-
建立套接字
socket(AF_INET,SOCK_DGRAM) -
訊息收發
recvfrom/sendto -
關閉套接字
close() -
sys.argv 屬性
功能 : 獲取命令列引數,得到一個列表
命令本身是 argv[0]
後面的引數從argv[1]開始,預設以空格分隔
使用引號引起來的內容算作一個整體
命令列引數都以字串放入列表
在程式的第一行加
#!/usr/bin/env python3
新增程式的執行許可權
chmod 755 file.py
修改後即可通過 ./file.py 執行程式
tcp套接字程式設計和udp套接字程式設計區別
- 流式套接字使用位元組流的方式傳輸,資料報套接字以資料報形式傳輸資料
- tcp會有粘包現象,udp有訊息邊界不會形成粘包
- tcp 可以保障資料傳輸完整性,udp則不保證
- tcp 需要進行listen accept 操作,udp不需要
- tcp收發訊息使用新的套接字,recv send。udp使用recvfrom,sendto
補充函式
sendall(data)
功能 : 傳送tcp訊息
引數 : 要傳送的內容,bytes格式
返回值 : 成功返回 None 失敗產生異常
套接字物件
s代表一個套接字
s.family : 獲取套接字地址族型別
s.type : 獲取套接字型別
s.getsockname() : 獲取套接字的繫結地址
s.fileno() : 獲取套接字的檔案描述符
檔案描述符 : 每一個IO事件作業系統都會分配一個不同的正整數作為編號,改正整數即為這個IO的檔案描述符。
- 檔案描述符是作業系統識別IO的唯一標誌
stdin —> 0
stdout --> 1
stderr --> 2
s.getpeername() : 獲取客戶端連線套接字的對應地址
s.setsockopt(level,option,value)
功能:設定套接字選項,豐富或者修改套接字屬性功能
引數: level 選項類別 SOL_SOCKET
option 具體選項
value 選項值
s.getsockopt(level,option)
功能:獲取套接字選項值
引數: level 選項類別 SOL_SOCKET
option 具體選項
返回值:選項值
- 如果要設定套接字選項,最好在建立套接字之後立即設定
udp 應用之廣播
廣播 : 一點發送,多點接收
廣播地址 : 一個網段內有一個指定的廣播地址,是該網段的最大地址。 192.168.207.255
廣播風暴 : 一個網路中有大量的廣播就會產生廣播風暴佔用大量頻寬,影響正常的訪問速度。
tcp應用之http傳輸
http協議 : 超文字傳輸協議,是一個應用層協議
用途 : 網頁資料的傳輸
資料傳輸方法
特點 :
- 應用層協議,傳輸層使用tcp服務
- 簡單,靈活,多種語言都有http相關操作介面
- 無狀態的協議,即不記錄使用者傳輸的資訊
- http1.1 支援持久連線
一端通過http請求的格式傳送具體請求內容,另一端接收http請求,按照協議格式解析。獲取真實請求後按照http協議響應格式組織回覆內容,回發給請求方,完成一次資料互動。
http請求 (request)
請求格式:
請求行 : 具體的請求類別和請求內容
格式: GET / HTTP/1.1
請求類別 請求內容 協議版本
請求類別 : 表示請求的種類
GET 獲取網路資源
POST 提交一定的附加資訊,得到返回結果
HEAD 獲取響應頭
PUT 更新伺服器資源
DELETE 刪除伺服器資源
CONNECT
TRACE 用於測試
OPTIONS 獲取伺服器效能資訊
請求頭 : 對請求內容的具體描述資訊
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
空行
請求體 : 請求引數或者是提交內容
http響應 (response)
響應格式
響應行 : 反饋響應的情況
格式 : HTTP/1.1 200 OK
協議版本 響應碼 附加資訊
響應碼 : 響應的具體情況
1xx : 提示資訊,表示請求成功
2xx : 響應成功
3xx : 響應需要重定向
4xx : 客戶端錯誤
5xx : 服務端錯誤
常見響應碼 : 200 成功
404 請求內容不存在
401 沒有訪問許可權
500 伺服器發生未知錯誤
503 暫時無法執行
響應頭 : 對響應內容的具體描述
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html
Date: Thu, 06 Sep 2018 09:11:18 GMT
空行
響應體 : 返回給請求端的具體內容