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