使用python實(shí)現(xiàn)一個(gè)簡(jiǎn)單ping?pong服務(wù)器
依賴環(huán)境
本篇文章所依賴的python 環(huán)境如下:

計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用體系結(jié)構(gòu),一般有以下幾種:
C/S架構(gòu): 也稱為客戶端/客戶端架構(gòu)。P2P架構(gòu): 是一種分布式網(wǎng)絡(luò)架構(gòu)。- 混個(gè)結(jié)構(gòu): 客戶端/服務(wù)器架構(gòu) 和
P2P架構(gòu)都包含在內(nèi)。
我們?cè)撈恼?,將介紹c/s網(wǎng)絡(luò)結(jié)構(gòu)。
客戶端/服務(wù)器架構(gòu)介紹
什么是客戶端/服務(wù)器架構(gòu)
客戶端/服務(wù)器架構(gòu),也被稱之為C/S架構(gòu),它是一種互聯(lián)網(wǎng)最常見(jiàn)的網(wǎng)絡(luò)結(jié)構(gòu),我們熟知的web服務(wù)器也是使用的C/S架構(gòu)。還有數(shù)據(jù)庫(kù)應(yīng)用等,也是使用的C/S架構(gòu)。
如何使用
在此網(wǎng)絡(luò)架構(gòu)中,服務(wù)器若想和客戶端進(jìn)行網(wǎng)絡(luò)通信,服務(wù)器需要提前啟動(dòng)??蛻舳穗S之向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器接收并且處理請(qǐng)求,最后將結(jié)果發(fā)送會(huì)客戶端。服務(wù)器和客戶端之間通信協(xié)議使用的是TCP和UDP,前置稱之為有連接服務(wù)器,后則稱之為無(wú)連接服務(wù)。至于更上層的應(yīng)用協(xié)議,如http是使用的TCP協(xié)議,如dns是使用的是UDP+TCP協(xié)議。
客戶端/服務(wù)器架構(gòu)缺點(diǎn)
此架構(gòu)也是有缺點(diǎn)的,例如: 如果服務(wù)器發(fā)現(xiàn)故障,所有已經(jīng)連接到服務(wù)器的客戶端都會(huì)收到影響,以及服務(wù)器容易出現(xiàn)性能瓶頸等。
python socket編程
在python中,為我們提供了一個(gè)內(nèi)置socket模塊,我們可以以此來(lái)創(chuàng)建一個(gè)自己的tcp服務(wù)器。
來(lái)看一個(gè)最簡(jiǎn)單的例子:
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("0.0.0.0",9999))
s.listen(5)
while True:
client , addr = s.accept()
print(client,addr)上述代碼,首先引入socket模塊,而后定義了一個(gè)socket函數(shù),傳入必要參數(shù),該函數(shù)會(huì)返回一個(gè)套接字對(duì)象給我們。
socket函數(shù)的參數(shù)分為2個(gè),第1個(gè)參數(shù)需要指定網(wǎng)絡(luò)協(xié)議,第二個(gè)參數(shù)需要指定套接字類型。下面是網(wǎng)絡(luò)協(xié)議和套接字類型的說(shuō)明:
網(wǎng)絡(luò)協(xié)議
socket.AF_INET: 最常用的協(xié)議,代表IPv4協(xié)議族。socket.AF_INET6: 代表IPv6協(xié)議族。socket.AF_UNIX: 表示Unix文件描述符。
套接字類型
socket.SOCK_STREAM: 表示流式套接字(TCP)。socket.SOCK_DGRAM: 表示數(shù)據(jù)包套接字(UDP)。socket.SOCK_RAW: 表示原始套接字。
上述,我們使用的是IPv4協(xié)議,并且使用的是TCP流式套接字。
接著便是bind函數(shù),它會(huì)將套接字綁定到指定的地址和端口上,參數(shù)必須是元組,分別為: 地址 和 端口號(hào)。
后續(xù)的listen函數(shù),是指定套接字監(jiān)聽(tīng)的最大連接數(shù),如上述所示,表示最大連接數(shù)為5,為0則是不設(shè)置連接數(shù)。
最后是一個(gè)死循環(huán),其中定義了accept函數(shù),該函數(shù)用于等待客戶端連接并且返回新的套接字對(duì)象。
代碼在運(yùn)行之后,我們可以使用telnet來(lái)訪問(wèn)一下,它會(huì)打印客戶端信息,例如:

上述結(jié)果為打印了client信息,和client addr的地址。
寫(xiě)一個(gè)最簡(jiǎn)單的ping/pong服務(wù)
有了上述的python基礎(chǔ),我們可以來(lái)寫(xiě)一個(gè)最簡(jiǎn)單的ping/pong服務(wù),不過(guò)我們想同時(shí)監(jiān)聽(tīng)tcp流 和 udp數(shù)據(jù)包,代碼如下:

上述代碼,我們使用多線程,分為對(duì)當(dāng)前主機(jī)的所有網(wǎng)卡監(jiān)聽(tīng)了tcp端口8888和udp端口8888,而后使用bind將套接字綁定到地址和端口,在監(jiān)聽(tīng)tcp的時(shí)候,我們需要通過(guò)listen方法指定監(jiān)聽(tīng)隊(duì)列長(zhǎng)度,而udp不用。
這是因?yàn)?code>tcp和udp協(xié)議不同導(dǎo)致的,tcp是可靠傳輸協(xié)議,所以當(dāng)有新的請(qǐng)求來(lái)的時(shí)候,會(huì)通過(guò)accept方法接收新的連接,會(huì)產(chǎn)生一個(gè)新的socket對(duì)象。
而udp是一種無(wú)連接不可靠協(xié)議,可以直接向目標(biāo)主機(jī)發(fā)送數(shù)據(jù),所以不需要先建立連接。而是直接調(diào)用recv方法接收數(shù)據(jù)。
接著便定義了一個(gè)空的列表threadJobs用于存放線程名稱,而后便定義了2個(gè)線程,調(diào)用的方法是pingPongServer傳入的參數(shù)是套接字類型和我們定義的套接字。
在pingPongServer方法中,因?yàn)槿缟纤?code>udp不需要accept,所以我們需要根據(jù)傳入的套接字類型進(jìn)行判斷,若是tcp則執(zhí)行accept,而后接收數(shù)據(jù);若是udp,則直接接收數(shù)據(jù)即可。
啟動(dòng)服務(wù)器進(jìn)程之后,我們分別使用telnet和nc向127.0.0.1的8888端口發(fā)送hello pdudo字符串,服務(wù)器接收到的信息為:

客戶端發(fā)送數(shù)據(jù)后,接收到的信息如下:


一個(gè)簡(jiǎn)單的ping/pong服務(wù)器就寫(xiě)完了。
總結(jié)
本篇文章介紹了網(wǎng)絡(luò)架構(gòu)的分類,分為是 c/s架構(gòu)、p2p架構(gòu) 以及 網(wǎng)絡(luò)架構(gòu);接著介紹了c/s架構(gòu)的介紹以及優(yōu)缺點(diǎn)。后面舉了一個(gè)最簡(jiǎn)單的python socket的例子,最后實(shí)現(xiàn)了一個(gè)tcp和udp的ping``pong小案例。
以上就是使用python實(shí)現(xiàn)一個(gè)簡(jiǎn)單ping pong服務(wù)器的詳細(xì)內(nèi)容,更多關(guān)于python ping pong服務(wù)器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- windows服務(wù)器禁ping怎么打開(kāi)?服務(wù)器禁ping有什么用
- Flutter?Ping檢查服務(wù)器通訊信號(hào)強(qiáng)度實(shí)現(xiàn)步驟
- Python實(shí)現(xiàn)檢測(cè)服務(wù)器是否可以ping通的2種方法
- dota2服務(wù)器ping測(cè)試腳本分享
- 服務(wù)器禁止被ping的設(shè)置方法(圖文)
- IP策略實(shí)現(xiàn)服務(wù)器禁止Ping
- 阿里云服務(wù)器ping不通解決辦法(云服務(wù)器搭建完環(huán)境訪問(wèn)不了ip解決辦法)
- Windows server服務(wù)器2019中允許Ping與禁止ping的設(shè)置方法(允許ICMP通信)
相關(guān)文章
python標(biāo)準(zhǔn)算法實(shí)現(xiàn)數(shù)組全排列的方法
這篇文章主要介紹了python標(biāo)準(zhǔn)算法實(shí)現(xiàn)數(shù)組全排列的方法,實(shí)例分析了全排列的原理與Python實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-03-03
wxpython多線程防假死與線程間傳遞消息實(shí)例詳解
今天小編就為大家分享一篇wxpython多線程防假死與線程間傳遞消息實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python只用40行代碼編寫(xiě)的計(jì)算器實(shí)例
這篇文章主要介紹了Python只用40行代碼編寫(xiě)的計(jì)算器,結(jié)合完整實(shí)例形式分析了Python計(jì)算器的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05
Python應(yīng)用自動(dòng)化部署工具Fabric原理及使用解析
這篇文章主要介紹了Python應(yīng)用自動(dòng)化部署工具Fabric原理及使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
利用Python過(guò)濾相似文本的簡(jiǎn)單方法示例
這篇文章主要給大家介紹了關(guān)于利用Python過(guò)濾相似文本的簡(jiǎn)單方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
python和pygame實(shí)現(xiàn)簡(jiǎn)單俄羅斯方塊游戲
這篇文章主要為大家詳細(xì)介紹了python和pygame實(shí)現(xiàn)簡(jiǎn)單俄羅斯方塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
numba CUDA報(bào)錯(cuò)的問(wèn)題解決
本文主要介紹了numba CUDA報(bào)錯(cuò)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Perl中著名的Schwartzian轉(zhuǎn)換問(wèn)題解決實(shí)現(xiàn)
這篇文章主要介紹了Perl中著名的Schwartzian轉(zhuǎn)換問(wèn)題解決實(shí)現(xiàn),本文詳解講解了Schwartzian轉(zhuǎn)換涉及的排序問(wèn)題,并同時(shí)給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06

