Python?基于TCP?傳輸協(xié)議的網(wǎng)絡(luò)通信實(shí)現(xiàn)方法
1、基礎(chǔ)概念
什么是網(wǎng)絡(luò)編程?
指在網(wǎng)絡(luò)環(huán)境中,如何實(shí)現(xiàn)不在同一物理位置中的計(jì)算機(jī)之間進(jìn)行數(shù)據(jù)通信
如果要保證數(shù)據(jù)通信順利完成,則需要先了解如下幾個(gè)概念:
1.1 協(xié)議
不同計(jì)算機(jī)內(nèi)的進(jìn)程之間進(jìn)行數(shù)據(jù)通信時(shí),需要先對(duì)數(shù)據(jù)進(jìn)行封裝或打包后方可以進(jìn)行傳輸。所謂協(xié)議指通信雙方需要共同遵守的數(shù)據(jù)打包格式。
如同現(xiàn)實(shí)世界里郵寄商品一樣:
- 商品相當(dāng)于要傳送給對(duì)方的數(shù)據(jù):在傳輸之前,需要商品擁有者對(duì)商品進(jìn)行打包,并在打包時(shí)填寫上收件人地址、收什人姓名、發(fā)件人地址……這是第一次封裝,在此次封裝過程中遵守的打包格式是由商品打包者完成,這層打包標(biāo)準(zhǔn)可稱為應(yīng)用層標(biāo)準(zhǔn)或應(yīng)用層協(xié)議。
- 包裹會(huì)被物流公司收納,物流公司每天會(huì)收到需要發(fā)送至全國各地的包裹,所以,需要再次進(jìn)行分檢,把發(fā)送至同一個(gè)地區(qū)的包裹收納在一起,并再次進(jìn)行打包,并按相應(yīng)的標(biāo)準(zhǔn)進(jìn)行信息填寫??烧J(rèn)為第二次打包的標(biāo)準(zhǔn)是郵局標(biāo)準(zhǔn)或郵局協(xié)議.
- 郵局打包后的包裹會(huì)發(fā)送至相關(guān)的運(yùn)輸部門,運(yùn)輸部門會(huì)把從不同郵局收集來的包裹按目的地進(jìn)行歸類打包,再選擇不同運(yùn)輸工具進(jìn)行傳輸,可選擇飛機(jī)、貨車、火車……這次打包協(xié)議可稱為傳輸層協(xié)議。
協(xié)議是保證數(shù)據(jù)能被正確傳輸出去的第一操作要素,互聯(lián)網(wǎng)上所遵守的協(xié)議規(guī)范稱為 TCP/IP 協(xié)議。
1.2 IP 地址
在網(wǎng)絡(luò)環(huán)境中,需要為每一臺(tái)計(jì)算機(jī)指定一個(gè)地址,這個(gè)地址叫 IP 地址,其實(shí) IP 地址是一個(gè)邏輯地址,而每一臺(tái)計(jì)算機(jī)還有一個(gè)物理地址,便是網(wǎng)卡上的 MAC 地址。
IP 地址和 MAC 地址的區(qū)別?
MAC 地址相當(dāng)于你我的身份證號(hào)碼,是固定、不變的。IP 地址相當(dāng)于你我現(xiàn)在處于的落腳地址.有的人在一年之內(nèi),可能會(huì)在不同城市工作,也就意味著邏輯地址是可以有多個(gè)的。
1.3 端口
一臺(tái)計(jì)算機(jī)上可以安裝多款網(wǎng)絡(luò)軟件,如QQ、瀏覽器、網(wǎng)絡(luò)游戲……
操作系統(tǒng)如何區(qū)分同一時(shí)刻自于網(wǎng)絡(luò)的多個(gè)數(shù)據(jù)應(yīng)該交給哪一個(gè)軟件處理?
端口相當(dāng)于操作系統(tǒng)為每一個(gè)網(wǎng)絡(luò)軟件分配的一個(gè)門牌標(biāo)識(shí)符號(hào),用來把從網(wǎng)絡(luò)上輸入進(jìn)來的多數(shù)據(jù)流正確的分流到對(duì)應(yīng)的進(jìn)程。
當(dāng)一臺(tái)計(jì)算機(jī)向另一臺(tái)計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí):
- 首先對(duì)數(shù)據(jù)按協(xié)議格式進(jìn)行打包
- 另需要知道對(duì)方計(jì)算機(jī)的地址且還要知道對(duì)應(yīng)進(jìn)程所監(jiān)聽的端口號(hào).IP+端口號(hào)也稱為套接字,或叫socket
有點(diǎn)類似于拜訪朋友時(shí):
先封裝一個(gè)禮物盒
然后根據(jù)朋友告訴自己的地址和門牌號(hào)前去拜訪
2、TCP 網(wǎng)絡(luò)編程實(shí)現(xiàn)
TCP 是一種傳輸層協(xié)議,是可靠的面向連接的傳輸層協(xié)議.
2.1 服務(wù)器端編程
定義一個(gè)函數(shù)用來進(jìn)行具體的數(shù)據(jù)交互,由子線程調(diào)用.
import socket # socket 模塊 import time #時(shí)間模塊 import threading #線程模塊 def session(sock, addr): print('歡迎新 %s:%s...' % addr) sock.send(b'Welcome!') while True: data = sock.recv(1024) time.sleep(1) # 解碼數(shù)據(jù) if not data or data.decode('utf-8') == 'exit': break sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8')) sock.close() print('來自于 %s:%s 連接被關(guān)閉.' % addr)
創(chuàng)建 socket 監(jiān)聽對(duì)象:
#創(chuàng)建 TCP socket server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #監(jiān)聽端口 server.bind(('127.0.0.1',1234)) server.listen(5) print('服務(wù)器正在等待客戶的連接……')
建立服務(wù)監(jiān)聽套接字,需要指定服務(wù)類型:
socket.AF_UNIX | 只能夠用于單一的Unix系統(tǒng)進(jìn)程間通信 |
socket.AF_INET | 服務(wù)器之間網(wǎng)絡(luò)通信 |
socket.AF_INET6 | IPv6 |
socket.SOCK_STREAM | 流式socket , for TCP |
socket.SOCK_DGRAM | 數(shù)據(jù)報(bào)式socket , for UDP |
socket.SOCK_RAW | 原始套接字,普通的套接字無法處理ICMP、IGMP等網(wǎng)絡(luò)報(bào)文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報(bào)文;此外,利用原始套接字,可以通過IP_HDRINCL套接字選項(xiàng)由用戶構(gòu)造IP頭。 |
socket.SOCK_SEQPACKET | 可靠的連續(xù)數(shù)據(jù)包服務(wù) |
while True: # 接受一個(gè)新連接: sock, addr = s.accept() # 創(chuàng)建新線程來處理TCP連接: t = threading.Thread(target=session, args=(sock, addr)) t.start()
當(dāng)有客戶連接后,啟動(dòng)線程完成具體的數(shù)據(jù)處理.
2.2 客戶端編程
客戶端代碼相對(duì)而言較簡單.
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立連接: client.connect(('127.0.0.1', 1234)) # 接收歡迎消息: print(client.recv(1024).decode('utf-8')) for data in [b'Rose', b'Think', b'Babala']: # 發(fā)送數(shù)據(jù): s.send(data) print(s.recv(1024).decode('utf-8')) s.send(b'exit') s.close()
測試結(jié)果 :
服務(wù)器端
客戶端:
3 總結(jié)
Python 提供了相關(guān)的模塊,封裝了底層的具體代碼邏輯,對(duì)于開發(fā)者而言,只需要按流程按部就班就可以,如果需要更好的理解整個(gè)網(wǎng)絡(luò)通信的過程,則需要了解相關(guān)的網(wǎng)絡(luò)知識(shí).
相關(guān)文章
python 讀取數(shù)據(jù)庫并繪圖的實(shí)例
今天小編就為大家分享一篇python 讀取數(shù)據(jù)庫并繪圖的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12keras中模型訓(xùn)練class_weight,sample_weight區(qū)別說明
這篇文章主要介紹了keras中模型訓(xùn)練class_weight,sample_weight區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python如何用str.format()批量生成網(wǎng)址(豆瓣讀書為例)
這篇文章主要介紹了Python如何用str.format()批量生成網(wǎng)址(豆瓣讀書為例),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09tensorflow實(shí)現(xiàn)對(duì)張量數(shù)據(jù)的切片操作方式
今天小編就為大家分享一篇tensorflow實(shí)現(xiàn)對(duì)張量數(shù)據(jù)的切片操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01