Python 学习笔记 - socket(基本原理和流程)
在學Python之前,先復習一下網絡的基本概念。
比如TCP/IP 4層模型,最上面的應用軟件發送數據包,數據包在運輸層加上TCP或者UDP的報頭,然后在網絡層加上IP的報頭,然后在數據鏈路層根據ethernet協議分割成幀,每個幀TCP的最大數值為1500個字節,因此一個3200字節的包可以被分割成3個幀,然后依次從物理層發通過高低電壓(對應0和1的二進制)發送出去。接收方通過同樣的方式逆向的組合幀,然后依次去掉每一層的報文,最后獲得數據。
對于程序開發人員而言,如果直接和每一層的協議打交道會非常麻煩,所幸有了socket這樣一個抽象的接口,可以通過socket來進行網絡通信的編程。
Socket的基本流程如下所示
簡單的理解一下基本函數:
socket()因為socket的本質就是一個特殊的文件,這個相當于普通文件的open操作。打開的時候 可以指定IP地址類型,TCP或者UDP等等;
bind()綁定端口和IP地址
listen()指定backlog的數目,即可以排隊連接的最大個數。
accept()可以監聽指定的socket地址,阻塞直到有客戶端發送請求連接
connect()客戶端可以發送請求,連接到服務器
read()讀取數據
write()發送數據
close()雙方可以隨時終止連接
其他函數的具體解釋可以參考
http://www.cnblogs.com/wupeiqi/articles/5040823.html
為了更好的理解socket的連接和斷開,我們需要了解TCP的握手和斷開的流程。
TCP 3次握手連接
當客戶端調用connect時,觸發了連接請求,向服務器發送了SYN J包,這時connect進入阻塞狀態;
服務器監聽到連接請求,即收到SYN J包,調用accept函數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態;
客戶端收到服務器的SYN K ,ACK J+1之后,這時connect返回,并對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立。
TCP 4次分手斷開連接
某個應用進程首先調用close主動關閉連接,這時TCP發送一個FIN M;
另一端接收到FIN M之后,執行被動關閉,對這個FIN進行確認。它的接收也作為文件結束符傳遞給應用進程,因為FIN的接收意味著應用進程在相應的連接上再也接收不到額外數據;
一段時間之后,接收到文件結束符的應用進程調用close關閉它的socket。這導致它的TCP也發送一個FIN N;
接收到這個FIN的源發送端TCP對它進行確認
下面看個簡單的例子:
server.py
import?socket ip_port=('127.0.0.1',5555) s=socket.socket() s.bind(ip_port) s.listen(5) conn,addr=s.accept() while?True:try:recv_data=conn.recv(1024)if?str(recv_data,encoding='utf-8')=='exit':breakprint(str(recv_data,encoding='utf8'))send_data=recv_data.upper()conn.send(send_data)#如果客戶端斷開連接,服務器會拋出異常,自動停止except?Exception?as?ex:break conn.close()client.py
import?socket ip_port=('127.0.0.1',5555) s=socket.socket() s.connect(ip_port) while?True:data=input('>>').strip()if?len(data)==0:continue #如果直接輸入空格或者回車,直接會卡住,因為服務器方面recv不會接受空值,會導致阻塞s.send(bytes(data,encoding='utf8'))if?data=='exit':breakrecv_data=s.recv(1024)print(str(recv_data,encoding='utf8')) s.close()結果如下:
客戶端效果
"C:\Program?Files\Python3\python.exe"?C:/Users/yli/pycharmprojects/Exercise/week9/client1.py >>aaa AAA >>bbb BBB >>Exit EXIT >>exit轉載于:https://blog.51cto.com/beanxyz/1858942
總結
以上是生活随笔為你收集整理的Python 学习笔记 - socket(基本原理和流程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle database link
- 下一篇: python_day9线程、进程和协程