什么是socket?
簡稱套接字,是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:它能實現(xiàn)不同主機間的進程間通信,我們網(wǎng)絡(luò)上各種各樣的服務(wù)大多數(shù)是基于socket來完成通信的。
socket是基于C/S架構(gòu)的,也就是說socket網(wǎng)絡(luò)編程,通常需要寫兩個文件,一個服務(wù)端,一個客戶端。
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ù),字符串需要先轉(zhuǎn)換一下,string.encode()即可;另一端在接收數(shù)據(jù)的時候需要bytes轉(zhuǎn)換成字符串,只要bytes.decode()一下就可以
2、在正常通信時,accept()和recv()方法都是阻塞的。所謂的阻塞,指的是程序會暫停在哪,一直等數(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 進入循環(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ù)會被檢驗,是使用最廣的通用模式;后者是不帶連接的傳輸服務(wù),簡單粗暴
TCP編程
服務(wù)器端:
客戶端:
雖然服務(wù)器和客戶端在一對一的情況下,工作良好,但是,如果有多個客戶端同時連接同一個服務(wù)器呢?結(jié)果可能不太令人滿意,因為服務(wù)器無法同時對多個客戶端提供服務(wù)。為什么會這樣呢?因為Python的socket模塊,默認情況下創(chuàng)建的是單進程單線程,同時只能處理一個連接請求,如果要實現(xiàn)多用戶服務(wù),那么需要使用多線程機制
責(zé)任編輯:wv
-
Socket
+關(guān)注
關(guān)注
1文章
212瀏覽量
35499 -
編程
+關(guān)注
關(guān)注
88文章
3677瀏覽量
94800
發(fā)布評論請先 登錄
評論