Python網路程式設計(socket模組、緩衝區、http協議)
網路的概念:主機 埠 IP 協議
- 伺服器:
- localhost/127.0.0.1
- 客戶端:
- 只是在本機啟動客戶端,用127.0.0.1訪問
- 伺服器:
- 0.0.0.0
- 客戶端:
- 可以在本機用127.0.0.1、192.168.0.1
- 伺服器:
- 192.168.0.1
- 客戶端:
- 區域網內用192.168.0.1
socket(建立套接字) —> bind(繫結地址) —> listen(設定監聽)—> accept(等待連結) —> recv/send(收/發訊息) —> close ()
收發函式特性:
recv特徵:
- 如果建立的另一端連結被斷開, 則recv立即返回空字串
- recv是從接受緩衝區取出內容,當緩衝區為空則阻塞
- recv如果一次接受不完緩衝區的內容,下次執行會自動接受
send特徵:
- 如果傳送的另一端不存在則會產生Pipe Broken異常
- send是從傳送緩衝區傳送內容,當緩衝區為滿則堵塞
網路的收發快取區:
在記憶體中開闢區域,用於傳送和接受的緩衝
作用:
- 協調資料的收發(接受和處理)速度
- 減少和磁碟的互動
sendall(date):
功能:tcp套接字傳送訊息
引數:同send
返回值:如果傳送成功則返回None 否則返回異常
tcp粘包:
產生原因:
1.tcp傳輸以位元組流的方式傳送訊息,訊息之間沒有邊界
2.傳送比接受的速度快
影響:
對每次傳送的內容是一個獨立的意識需要單獨識別時 容易使用原檔案被更改
如何處理:
1.每次傳送後追加一個結尾標誌,代表本次傳送完畢
2.傳送一個資料結構
3.每次傳送有一個時間間隔
基於udp的服務端程式設計:
1.建立套接字:
sockfd = socket(AF_INET,SOCK_DGRAM)
2.繫結地址:
sockfd.bind()
3.訊息收發
data, addr = sockfd.recvfrom(buffersize)
功能:接受udp訊息
引數:接受訊息的大小
返回值:
data 接受到的內容
addr 訊息傳送的地址
recvfrom每次接受一個報文,如果沒有接受到的內容則直接丟棄
sockfd.sendto(data, addr)
功能:udp訊息傳送
引數:
data 要傳送的內容 bytes
addr 目標地址
返回:傳送位元組數
4.關閉套接字:
socket.close()
import sys
sys.argv
作用:
獲取從命令列獲取的引數內容
Python3 demo.py 引數1, 引數2…..
sys.argv[0] 是命令本身(程式本身)
tcp流式套接字和udp資料包套接字區別:
- 1.流式套接字採用位元組流的方式進行傳輸,
- 而資料包套接字使用資料包形式傳輸資料
- 2.tcp套接字會產生粘包,udp不會
- 3.tcp程式設計可以保證訊息的完整性,udp則不一定
- 4.tcp需要listen、accept、udp不用
- 5.tcp訊息的傳送接收使用recv、send、sendall、
- udp使用recvfrom,sendto
socket模組和套接字屬性(s為套接字)
- s.type:表示套接字型別
- s.family:地址型別
套接字屬性方法
s.fileno()
功能:
獲取套接字的檔案描述符
檔案描述符:
每一個IO事件 作業系統都會分配一個不同的的正整數,
該正整數即為此IO操作的檔案描述符
預設開啟的描述符:
- sys.stdin 0
- sys.stdout 1
- sys.stderr 2
s.getsockname()
功能:
獲取套結字繫結的地址
s.getpeername()
功能:
獲取連結套接字客戶端的地址
s.setsockopt(level,optname, value)
(# 設定埠可立即重用 必須在連結埠前設定
s.setsockopt(SOL_SOcKET, SO_REUSEADDR))
功能:設定套接字選項
引數:
level:設定選項的型別(大型別) 常用:SOL_SOCKET
optname:子類選項
value:要設定的值
s.getsockopt(level, optname)
功能:獲取套接字選項值
引數:
level:選項的型別
udp套接字應用—> 廣播
一點傳送多點接收
目標地址:廣播地址 172.18.32.255
tcp應用—> http傳輸
http協議:
超文字傳輸協議
用途:
網站中瀏覽器網頁的獲取,基於網站事物資料傳輸
編寫基於http協議的資料傳輸
特點:
1.應用層協議,傳輸層使用tcp服務
2.簡單、靈活,可以使用多種程式語言操作
3.無狀態的協議,既不用記錄使用者的輸入內容
4.http1.1 —> http2.0(還沒釋出) 技術的成熟和穩定性
http請求(request):
請求格式:
1.請求行:說明具體的請求類別和內容
GET /index.html /HTTP/1.1
請求類別 請求內容 協議版本
請求類別:
-
-
- GET: 獲取網路資源
- POST: 提交一定的附加資料
- HEAD: 獲取響應頭
- PUT: 更新伺服器資源
- DELETE: 刪除伺服器資源
- CONNECT: 未使用
- TRACE: 用於測試
- OPTIONS: 獲取伺服器效能資訊
-
2.請求頭:對請求的具體描述
Accept:text/html
每一個鍵值對佔一行,描述了一個特定資訊
3.空行
4.請求體: 具體的引數或提交的內容
get引數或者post提交的內容
http響應(response):
響應格式:
1.響應行:反饋具體的響應情況
HTTP/1.1 20 OK
版本協議 響應碼 附加資訊
響應碼:
-
- 1xx:提示資訊,表示請求已經接收
- 2xx:響應成功
- 3xx:響應需要定向(重新記載連結第三方連結)
- 4xx:客戶端錯誤
- 5xx:伺服器端錯誤
常見響應碼:
200 成功
404 請求內容不存在
401 沒有訪問許可權
500 伺服器未知錯誤
503 伺服器暫時無法執行
2.響應頭:對響應內容的具體描述
3.空行
4.響應體:
將客戶端請求內容進行返回
這裡這個圖就看了一眼 沒特意去記 憑印象畫的 可能不對 但是大體邏輯應該沒錯
我去百度搜了 什麼也沒搜到 不知道是不是我的開啟方式不對還是什麼
只搜到了上面的兩張圖……….
總結:
tcp,udp協議的區別和程式設計實現上的差異:
tcp:
- tcp是一種可靠的、面向有連結資料傳輸服務
- tcp能夠保證資料的完整性、順序性、無重複以及無差錯
- tcp是一種以檔案流的形式傳輸資料的服務 檔案流之間是沒有邊界
- 的所以基友可能會產生粘包的情況 粘包是因為接受速度沒有傳輸速度快
- 導致快取區的資料擁堵 下次取出資料時從而產生非獨立資料的連結 這種情況
- 叫做粘包 粘包只有傳輸多個資料時才會出現
- tcp的程式設計需要監聽套接字 和 等待連結過程 只有連結成功才能傳送資料
- 這種情況叫做三次握手、還有斷開時的四次揮手
- 三次揮手:客戶端請求連結、伺服器返回報文、客戶端完成連結
- 四次揮手:客戶端請求斷開、伺服器接受請求、伺服器準備完畢可以斷開、客戶端斷開
- tcp收傳送訊息需要使用recv、send、sendall方法
- sendall位元殊 功能和send一樣 但sendall有事務 若傳送成功返回None 否則觸發異常
- 連結時必須先執行伺服器端後執行客戶端
udp:
- udp就比較簡單了 是面向無連線的不可靠的資料傳輸服務
- udp沒有資料流 接受大小取決於接收方
- 若資料超出接收方接受範圍則丟掉所有超出範圍的內容
- udp不存在粘包的情況
- udp不需要等待連結 沒有揮手過程 先發就發 想收就收 自由度比較高
- udp程式設計時收發訊息使用recvfrom、sendto方法
- udp可用於廣播可以隨時斷開或連結
- 客戶端和伺服器端可以隨時執行
什麼是http?
http 是超文字傳輸協議
一種網路資料傳輸的協議
沒錯就是 協議
並且所有的www檔案都必須遵守這個標準
http作用是什麼?
可以用力來網站中瀏覽器網頁獲取,基於網站上的一些資料傳輸 例如目前我正在打的字……
編寫基於http協議的資料傳輸
http協議 請求和響應的格式以及每一部分做什麼
請求部分:
請求行:請求的具體類別和內容 比如說 類別、內容、版本協議
請求頭:請求具體描述
空行:就是空行
請求體:請求具體引數或內容
響應部分:
響應行:具體響應情況 比如說 版本協議 、響應碼 、附加資訊
響應頭:響應具體描述
空行
響應體:響應具體引數或內容
http協議中請求的基本型別和作用:
GET:獲取網路資源
POST:提交一定的附加資料
HEAD:獲取響應頭 響應返回的檔案資訊
PUT:更新伺服器資源
DELETE:刪除伺服器資源
TRACE:用於測試
OPIONS:獲取伺服器效能資訊
CONNECT:備用
http協議響應碼的型別和表達含義:
以1開頭的表示請求已經連結
以2開頭的表示成功接收、提示
以3開頭的代表重新定向進一步處理 第三方
以4開頭的客戶端錯誤
以5開頭的伺服器錯誤
http協議請求網頁的流程:
建立連線、傳送請求、響應請求、斷開連結
這樣的一個過程稱為一個事物
相關文章
- Socket程式設計注意接收緩衝區大小程式設計
- 網際網路和區域網網路程式設計Socket緩衝區最優總結程式設計
- Python中兩種網路程式設計方式:Socket和HTTP協議Python程式設計HTTP協議
- Python網路Socket程式設計Python程式設計
- 基於TCP/UDP的Socket程式設計,HTTP/HTTPS協議TCPUDP程式設計HTTP協議
- 網路協議之:socket協議詳解之Socket和Stream Socket協議
- 網路協議之:socket協議詳解之Datagram Socket協議
- 基於TCP協議的Socket網路程式設計( )TCP協議程式設計
- 基於UDP協議的Socket網路程式設計UDP協議程式設計
- 網路協議之:socket協議詳解之Unix domain Socket協議AI
- Python 網路程式設計:當核心讀緩衝區為空,呼叫 socket 的 recv 的會發生什麼?Python程式設計
- UDP協議網路Socket程式設計(java實現C/S通訊案例)UDP協議程式設計Java
- Java Tcp協議socket程式設計學習JavaTCP協議程式設計
- Android 網路程式設計(1):HTTP協議原理Android程式設計HTTP協議
- Python 網路資料傳輸協議 TCP 程式設計Python協議TCP程式設計
- Java:基於TCP協議網路socket程式設計(實現C/S通訊)JavaTCP協議程式設計
- 計算機網路之十二:HTTP協議計算機網路HTTP協議
- go socket、http網路程式設計demoGoHTTP程式設計
- 低功耗4G模組HTTP網路協議應用HTTP協議
- python網路-Socket之TCP程式設計(26)PythonTCP程式設計
- 網路通訊協議-HTTP協議詳解!協議HTTP
- Socket 程式設計 (網路篇)程式設計
- 網路程式設計協議(TCP和UDP協議,黏包問題)以及socketserver模組程式設計協議TCPUDPServer
- Http網路協議包 (快速理解)HTTP協議
- python:socket網路程式設計Python程式設計
- Python Socket 網路程式設計Python程式設計
- 網路安全網路協議知識點中,http協議是什麼?協議HTTP
- RTSP協議、RTMP協議、HTTP協議的區別協議HTTP
- Socket、TCP/IP、HTTP、FTP及網路程式設計TCPHTTPFTP程式設計
- PYTHON 黑帽程式設計 1.5 使用 WIRESHARK 練習網路協議分析Python程式設計協議
- LINUX系統程式設計 關於SDTIO庫緩衝區Linux程式設計
- Golang併發程式設計有緩衝通道和無緩衝通道(channel)Golang程式設計
- #「HTTP 協議」90%的java程式設計師都看得懂的最全HTTP 協議講解HTTP協議Java程式設計師
- 網路協議 - TCP/IP、HTTP、HTTPS、HTTP2.0協議TCPHTTP
- Android網路程式設計(二)構 HTTP協議報文基本結Android程式設計HTTP協議
- 網路協程程式設計程式設計
- 網路程式設計UDP協議方式程式設計UDP協議
- Android使用http協議訪問網路AndroidHTTP協議