什么是socket?
簡(jiǎn)稱套接字,是進(jìn)程間通信的一種方式,它與其他進(jìn)程間通信的一個(gè)主要不同是:它能實(shí)現(xiàn)不同主機(jī)間的進(jìn)程間通信,我們網(wǎng)絡(luò)上各種各樣的服務(wù)大多數(shù)是基于socket來(lái)完成通信的。
socket是基于C/S架構(gòu)的,也就是說(shuō)socket網(wǎng)絡(luò)編程,通常需要寫兩個(gè)文件,一個(gè)服務(wù)端,一個(gè)客戶端。
Python中的socket通信邏輯如下圖所示
在python中,用socket.socket()方法來(lái)創(chuàng)建套接字
s = socket.socket([family[, type[, proto]]])
參數(shù)說(shuō)明:
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ù)過(guò)來(lái)
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),不斷接受客戶端的鏈接請(qǐng)求:s.a(chǎn)ccept()
4 接收傳來(lái)的數(shù)據(jù),或者發(fā)送數(shù)據(jù)給對(duì)方: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編程,通??梢苑譃門CP和UDP編程兩種,前者是連接的可靠傳輸服務(wù),每次通信都要握手,結(jié)束傳輸也要揮手,數(shù)據(jù)會(huì)被檢驗(yàn),是使用最廣的通用模式;后者是不帶連接的傳輸服務(wù),簡(jiǎn)單粗暴
TCP編程
服務(wù)器端:
客戶端:
雖然服務(wù)器和客戶端在一對(duì)一的情況下,工作良好,但是,如果有多個(gè)客戶端同時(shí)連接同一個(gè)服務(wù)器呢?結(jié)果可能不太令人滿意,因?yàn)榉?wù)器無(wú)法同時(shí)對(duì)多個(gè)客戶端提供服務(wù)。為什么會(huì)這樣呢?因?yàn)镻ython的socket模塊,默認(rèn)情況下創(chuàng)建的是單進(jìn)程單線程,同時(shí)只能處理一個(gè)連接請(qǐng)求,如果要實(shí)現(xiàn)多用戶服務(wù),那么需要使用多線程機(jī)制
責(zé)任編輯:wv
-
Socket
+關(guān)注
關(guān)注
1文章
212瀏覽量
35653 -
編程
+關(guān)注
關(guān)注
88文章
3686瀏覽量
94962
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論