欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用python實現(xiàn)一個簡單ping?pong服務器

 更新時間:2023年04月20日 08:31:47   作者:真的不能告訴你我  
這篇文章主要為大家介紹了使用python實現(xiàn)一個簡單ping?pong服務器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

依賴環(huán)境

本篇文章所依賴的python 環(huán)境如下:

計算機網(wǎng)絡(luò)應用體系結(jié)構(gòu),一般有以下幾種:

  • C/S架構(gòu): 也稱為客戶端/客戶端架構(gòu)。
  • P2P架構(gòu): 是一種分布式網(wǎng)絡(luò)架構(gòu)。
  • 混個結(jié)構(gòu): 客戶端/服務器架構(gòu) 和 P2P架構(gòu)都包含在內(nèi)。

我們該篇文章,將介紹c/s網(wǎng)絡(luò)結(jié)構(gòu)。

客戶端/服務器架構(gòu)介紹

什么是客戶端/服務器架構(gòu)

客戶端/服務器架構(gòu),也被稱之為C/S架構(gòu),它是一種互聯(lián)網(wǎng)最常見的網(wǎng)絡(luò)結(jié)構(gòu),我們熟知的web服務器也是使用的C/S架構(gòu)。還有數(shù)據(jù)庫應用等,也是使用的C/S架構(gòu)。

如何使用

在此網(wǎng)絡(luò)架構(gòu)中,服務器若想和客戶端進行網(wǎng)絡(luò)通信,服務器需要提前啟動??蛻舳穗S之向服務器發(fā)送請求,服務器接收并且處理請求,最后將結(jié)果發(fā)送會客戶端。服務器和客戶端之間通信協(xié)議使用的是TCPUDP,前置稱之為有連接服務器,后則稱之為無連接服務。至于更上層的應用協(xié)議,如http是使用的TCP協(xié)議,如dns是使用的是UDP+TCP協(xié)議。

客戶端/服務器架構(gòu)缺點

此架構(gòu)也是有缺點的,例如: 如果服務器發(fā)現(xiàn)故障,所有已經(jīng)連接到服務器的客戶端都會收到影響,以及服務器容易出現(xiàn)性能瓶頸等。

python socket編程

python中,為我們提供了一個內(nèi)置socket模塊,我們可以以此來創(chuàng)建一個自己的tcp服務器。

來看一個最簡單的例子:

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模塊,而后定義了一個socket函數(shù),傳入必要參數(shù),該函數(shù)會返回一個套接字對象給我們。

socket函數(shù)的參數(shù)分為2個,第1個參數(shù)需要指定網(wǎng)絡(luò)協(xié)議,第二個參數(shù)需要指定套接字類型。下面是網(wǎng)絡(luò)協(xié)議和套接字類型的說明:

網(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ù),它會將套接字綁定到指定的地址和端口上,參數(shù)必須是元組,分別為: 地址 和 端口號。

后續(xù)的listen函數(shù),是指定套接字監(jiān)聽的最大連接數(shù),如上述所示,表示最大連接數(shù)為5,為0則是不設(shè)置連接數(shù)。

最后是一個死循環(huán),其中定義了accept函數(shù),該函數(shù)用于等待客戶端連接并且返回新的套接字對象。

代碼在運行之后,我們可以使用telnet來訪問一下,它會打印客戶端信息,例如:

上述結(jié)果為打印了client信息,和client addr的地址。

寫一個最簡單的ping/pong服務

有了上述的python基礎(chǔ),我們可以來寫一個最簡單的ping/pong服務,不過我們想同時監(jiān)聽tcp流 和 udp數(shù)據(jù)包,代碼如下:

上述代碼,我們使用多線程,分為對當前主機的所有網(wǎng)卡監(jiān)聽了tcp端口8888udp端口8888,而后使用bind將套接字綁定到地址和端口,在監(jiān)聽tcp的時候,我們需要通過listen方法指定監(jiān)聽隊列長度,而udp不用。

這是因為tcpudp協(xié)議不同導致的,tcp是可靠傳輸協(xié)議,所以當有新的請求來的時候,會通過accept方法接收新的連接,會產(chǎn)生一個新的socket對象。

udp是一種無連接不可靠協(xié)議,可以直接向目標主機發(fā)送數(shù)據(jù),所以不需要先建立連接。而是直接調(diào)用recv方法接收數(shù)據(jù)。

接著便定義了一個空的列表threadJobs用于存放線程名稱,而后便定義了2個線程,調(diào)用的方法是pingPongServer傳入的參數(shù)是套接字類型和我們定義的套接字。

pingPongServer方法中,因為如上所述udp不需要accept,所以我們需要根據(jù)傳入的套接字類型進行判斷,若是tcp則執(zhí)行accept,而后接收數(shù)據(jù);若是udp,則直接接收數(shù)據(jù)即可。

啟動服務器進程之后,我們分別使用telnetnc127.0.0.18888端口發(fā)送hello pdudo字符串,服務器接收到的信息為:

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

一個簡單的ping/pong服務器就寫完了。

總結(jié)

本篇文章介紹了網(wǎng)絡(luò)架構(gòu)的分類,分為是 c/s架構(gòu)、p2p架構(gòu) 以及 網(wǎng)絡(luò)架構(gòu);接著介紹了c/s架構(gòu)的介紹以及優(yōu)缺點。后面舉了一個最簡單的python socket的例子,最后實現(xiàn)了一個tcpudpping``pong小案例。

以上就是使用python實現(xiàn)一個簡單ping pong服務器的詳細內(nèi)容,更多關(guān)于python ping pong服務器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中for后接else的語法使用

    Python中for后接else的語法使用

    這篇文章主要介紹了Python中for后接else的語法使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Pycharm虛擬環(huán)境創(chuàng)建并使用命令行指定庫的版本進行安裝

    Pycharm虛擬環(huán)境創(chuàng)建并使用命令行指定庫的版本進行安裝

    Pycharm創(chuàng)建的項目,使用了虛擬環(huán)境,對庫的版本進行管理,有些項目的對第三方庫的版本要求不同,可使用虛擬環(huán)境進行管理,直接想通過pip命令安裝可以參考下本文的操作步驟
    2022-07-07
  • 通過示例學習python中os模塊的使用

    通過示例學習python中os模塊的使用

    os模塊是Python中處理文件和文件夾的重要模塊,其中了解模塊的一些基本功能對于使用Python對excel進行數(shù)據(jù)分析具有很大的幫助,這篇文章主要介紹了python os模塊使用,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • pycharm運行按鈕灰色問題及解決

    pycharm運行按鈕灰色問題及解決

    這篇文章主要介紹了pycharm運行按鈕灰色問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 解決django前后端分離csrf驗證的問題

    解決django前后端分離csrf驗證的問題

    今天小編就為大家分享一篇解決django前后端分離csrf驗證的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • python redis存入字典序列化存儲教程

    python redis存入字典序列化存儲教程

    這篇文章主要介紹了python redis存入字典序列化存儲教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • python爬蟲中抓取指數(shù)的實例講解

    python爬蟲中抓取指數(shù)的實例講解

    在本篇文章里小編給大家整理了關(guān)于python爬蟲中抓取指數(shù)的實例講解內(nèi)容,有興趣的朋友們學習下。
    2020-12-12
  • Django關(guān)于事務transaction.atomic()的使用方式

    Django關(guān)于事務transaction.atomic()的使用方式

    這篇文章主要介紹了Django關(guān)于事務transaction.atomic()的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python torch.flatten()函數(shù)案例詳解

    Python torch.flatten()函數(shù)案例詳解

    這篇文章主要介紹了Python torch.flatten()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解python中的變量與注釋

    詳解python中的變量與注釋

    在 Python 中,變量是用于存儲數(shù)據(jù)的名稱,它可以保存不同類型的數(shù)據(jù),在Python中,有兩種類型的注釋:單行注釋和多行注釋,本文就給大家詳細的介紹一下python中的變量與注釋,需要的朋友可以參考下
    2023-08-08

最新評論