騰訊大牛整理的Python學(xué)習(xí)筆記:Socket網(wǎng)絡(luò)編程

一、網(wǎng)絡(luò)協(xié)議

  1、七層模型:包括物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層,表示層,應(yīng)用層,由左至右,一層層往上構(gòu)建而成。

物理層:建立、維護(hù)、斷開物理連接數(shù)據(jù)鏈路層:底層的電子設(shè)備不認(rèn)識(shí)IP,只認(rèn)識(shí)MAC,數(shù)據(jù)鏈路層用的就是MAC尋址網(wǎng)絡(luò)層:進(jìn)行邏輯地址尋址,實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇。我們使用的IP地址就處于這個(gè)層傳輸層:定義傳輸數(shù)據(jù)的協(xié)議端口號(hào),以及流控和差錯(cuò)校驗(yàn)。協(xié)議有:TCP和UDP。數(shù)據(jù)包一旦離開網(wǎng)卡即進(jìn)入網(wǎng)絡(luò)傳輸層會(huì)話層:建立、管理、終止會(huì)話。對(duì)應(yīng)主機(jī)進(jìn)程,指本地主機(jī)與遠(yuǎn)程主機(jī)正在進(jìn)行的會(huì)話(在五層模型里面已經(jīng)合并到了應(yīng)用層)表示層:數(shù)據(jù)的表示、安全、壓縮。(在五層模型里面已經(jīng)合并到了應(yīng)用層)比如:格式有,JPEG、ASCll、EBCDIC、加密格式等應(yīng)用層:網(wǎng)絡(luò)服務(wù)與最終用戶的一個(gè)接口。協(xié)議有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP,我們看到的大部分協(xié)議都處于這個(gè)層,建立在TCP和UDP協(xié)議之上,就像不同國(guó)家的語(yǔ)言,定義了怎么收(解釋語(yǔ)義)和怎么發(fā)(語(yǔ)法)

  2、而socket就是封裝了這些協(xié)議的簡(jiǎn)單使用接口,如果需要開發(fā)自己的協(xié)議,至少要掌握socket的編程

二、socket中的地址簇:包括socket.AF_UNIX,socket.AF_INET,socket.AF_INET6

  1、socket.AF_UNIX:用于本機(jī)間的進(jìn)程通信,如果不用這個(gè)也可以用pickle序列化實(shí)現(xiàn),不過效率低

  2、socket.AF_INET:IPV4通信

  3、socket.AF_INET6:IPV6通信

三、socket的類型:包括socket.SOCK_STRAEM,socket.SOCK_DGRAM,socket.SOCK_RAW

  1、socket.SOCK_STRAEM:用于TCPIP通信

  2、socket.SOCK_DGRAM:用于UDP通信

  3、socket.SOCK_RAW:原始套接字,可以用來構(gòu)造IP頭

四、基本的通信思路:

  1、首先是先有接受端計(jì)算機(jī),選擇socket地址簇和socket的類型(相當(dāng)于告訴計(jì)算機(jī)使用何種方式發(fā)送和解析數(shù)據(jù)),需要監(jiān)聽某個(gè)端口,等待遠(yuǎn)程計(jì)算機(jī)發(fā)送數(shù)據(jù),接受此數(shù)據(jù),然后發(fā)送新的數(shù)據(jù)給遠(yuǎn)程計(jì)算機(jī),繼續(xù)保持監(jiān)聽狀態(tài)。

  2、然后有發(fā)送端計(jì)算機(jī),選擇socket地址簇和socket的類型(相當(dāng)于告訴計(jì)算機(jī)使用何種方式發(fā)送和解析數(shù)據(jù)),接受數(shù)據(jù),關(guān)閉遠(yuǎn)程連接。

  3、客戶端代碼如下:

import socket

# 如果socket不給參數(shù),默認(rèn)用AF_INET:IPV4通信,SOCK_STREAM:用于TCPIP通信

sock = socket.socket()

sock.connect(("localhost",56418))

sock.send(b"hello")

data = sock.recv(1024)

print("服務(wù)器返回了數(shù)據(jù):%s" % data.decode("utf-8"))

sock.close()

  4、服務(wù)器端代碼如下:

import socket

# 如果socket不給參數(shù),默認(rèn)用AF_INET:IPV4通信,SOCK_STREAM:用于TCPIP通信

server = socket.socket()

# 綁定IP和端口

server.bind(("localhost",56418))

# 監(jiān)聽

server.listen()

print("開始等待!")

# 等待遠(yuǎn)程對(duì)象連接,當(dāng)有遠(yuǎn)程計(jì)算機(jī)連接到此服務(wù)器,就會(huì)得到一個(gè)遠(yuǎn)程對(duì)象和遠(yuǎn)程對(duì)象的地址(遠(yuǎn)程IP和遠(yuǎn)程端口)

clinet_obj,addr = server.accept()

print("有數(shù)據(jù)進(jìn)來了!", clinet_obj, addr)

# 接收信息

data = clinet_obj.recv(1024)

# 發(fā)送信息

clinet_obj.send(data.upper())

# 關(guān)閉服務(wù)器

server.close()

print("服務(wù)器關(guān)閉了!")

今天文章有點(diǎn)短,但是內(nèi)容豐富,希望你們能夠喜歡,請(qǐng)關(guān)注,收藏,轉(zhuǎn)發(fā)。再次感謝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容