什么是socket?
簡稱套接字,是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:它能實現(xiàn)不同主機間的進程間通信,我們網(wǎng)絡上各種各樣的服務大多數(shù)是基于socket來完成通信的。
socket是基于C/S架構的,也就是說socket網(wǎng)絡編程,通常需要寫兩個文件,一個服務端,一個客戶端。
Python中的socket通信邏輯如下圖所示
在python中,用socket.socket()方法來創(chuàng)建套接字
s = socket.socket([family[, type[, proto]]])
參數(shù)說明:
family:套接字家族,可以使用AF_UNIX或者AF_INET
type:套接字類型,分為SOCK_STREAM或者SOCK_DGRAM,分別代表TCP和UDP
protocol: 一般不填默認為0
注意
1、python3以后,socket傳遞的都是bytes類型的數(shù)據(jù),字符串需要先轉換一下,string.encode()即可;另一端在接收數(shù)據(jù)的時候需要bytes轉換成字符串,只要bytes.decode()一下就可以
2、在正常通信時,accept()和recv()方法都是阻塞的。所謂的阻塞,指的是程序會暫停在哪,一直等數(shù)據(jù)過來
socket編程思路
服務端 TCP
1 創(chuàng)建套接字,綁定套接字到本地IP與端口:socket.socket(scoket.AF_INET,socket.SOCK_STREAM), s.bind()
2 開始監(jiān)聽鏈接:s.listen()
3 進入循環(huán),不斷接受客戶端的鏈接請求:s.a(chǎn)ccept()
4 接收傳來的數(shù)據(jù),或者發(fā)送數(shù)據(jù)給對方:s.recv() , s.sendall()
5 傳輸完畢后,關閉套接字:s.close()
客戶端
1 創(chuàng)建套接字,連接服務器地址:socket.socket(scoket.AF_INET,socket.SCOK_STREAM),s.connect()
2 連接后發(fā)送數(shù)據(jù)和接收數(shù)據(jù): s.sendall(),s.recv()
3 傳輸完畢后,關閉套接字:s.close()
python的socket編程,通??梢苑譃門CP和UDP編程兩種,前者是連接的可靠傳輸服務,每次通信都要握手,結束傳輸也要揮手,數(shù)據(jù)會被檢驗,是使用最廣的通用模式;后者是不帶連接的傳輸服務,簡單粗暴
TCP編程
服務器端:
客戶端:
雖然服務器和客戶端在一對一的情況下,工作良好,但是,如果有多個客戶端同時連接同一個服務器呢?結果可能不太令人滿意,因為服務器無法同時對多個客戶端提供服務。為什么會這樣呢?因為Python的socket模塊,默認情況下創(chuàng)建的是單進程單線程,同時只能處理一個連接請求,如果要實現(xiàn)多用戶服務,那么需要使用多線程機制
責任編輯:wv
-
Socket
+關注
關注
0文章
212瀏覽量
34908 -
編程
+關注
關注
88文章
3640瀏覽量
94031
發(fā)布評論請先 登錄
相關推薦
評論