日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 学习笔记 - socket(基本原理和流程)

發布時間:2025/6/15 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(基本原理和流程)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。