亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Python的套接字編程

        2023-03-23 02:39:28康梅娟郭狀先
        科技資訊 2023年3期
        關(guān)鍵詞:發(fā)送數(shù)據(jù)傳輸層客戶機(jī)

        康梅娟 郭狀先

        (臨沂大學(xué) 山東臨沂 276000)

        Socket 也叫作套接字,用來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)通信[1]。它是網(wǎng)絡(luò)通信中應(yīng)用層和傳輸層之間的一個(gè)抽象層[2]。使用套接字,可以將網(wǎng)絡(luò)中通信的主機(jī)之間復(fù)雜的通信過(guò)程簡(jiǎn)單化,套接字可以為應(yīng)用層提供一些接口,應(yīng)用層使用套接字提供的接口可以實(shí)現(xiàn)網(wǎng)絡(luò)中的主機(jī)之間的通信。套接字包括 IP 地址和端口號(hào)兩個(gè)部分。通過(guò)網(wǎng)絡(luò)通信的每對(duì)進(jìn)程需要使用一對(duì)套接字。不同的進(jìn)程之間的通信所使用的套接字是不一樣的,套接字可以用來(lái)區(qū)分不同的進(jìn)程之間的數(shù)據(jù)傳輸。套接字主要有目標(biāo)IP、傳輸層使用的傳輸協(xié)議、傳輸層使用的端口號(hào)這3 個(gè)重要參數(shù)。Socket 是面向客戶/服務(wù)器模型而設(shè)計(jì)的[3]。通信的一方扮演客戶機(jī)的角色,另一方扮演服務(wù)器的角色。服務(wù)器在運(yùn)行中一直監(jiān)聽(tīng)套接字指定的傳輸層端口,并等待著客戶機(jī)的連接請(qǐng)求。當(dāng)服務(wù)器端收到客戶機(jī)發(fā)來(lái)的連接請(qǐng)求以后,服務(wù)器會(huì)接受客戶機(jī)的連接請(qǐng)求,雙方建立連接后,就可進(jìn)行數(shù)據(jù)的傳遞。Socket 處于網(wǎng)絡(luò)協(xié)議的傳輸層[4]。

        套接字可以分為流式套接字、原始套接字和數(shù)據(jù)報(bào)套接字這3種不同的類(lèi)型。(1)流式套接字使用傳輸層的TCP協(xié)議,它能夠?qū)崿F(xiàn)面向連接的、可靠的數(shù)據(jù)傳輸。(2)原始套接字主要用于一些協(xié)議的開(kāi)發(fā),可以進(jìn)行比較底層的操作。(3)數(shù)據(jù)報(bào)套接字使用傳輸層的UDP 協(xié)議進(jìn)行數(shù)據(jù)的傳輸,它實(shí)現(xiàn)的傳輸服務(wù)是無(wú)連接的、不可靠的。

        該文主要介紹了網(wǎng)絡(luò)中的主機(jī)使用TCP套接字和UDP 套接字進(jìn)行通信的流程,以及在Python 中是如何實(shí)現(xiàn)TCP套接字和UDP套接字編程的。

        1 Python中的套接字

        在Python 中有許多網(wǎng)絡(luò)編程框架,有原生的Socket調(diào)用如Select、Epoll,有標(biāo)準(zhǔn)庫(kù)如TCPServer、UDPServer、HTTPServer[5]。每種編程語(yǔ)言都擁有各自的特征和優(yōu)勢(shì),只有在合適的語(yǔ)言環(huán)境中,才能盡量發(fā)揮其功能和優(yōu)勢(shì)[6]。Python作為一種網(wǎng)絡(luò)編程語(yǔ)言,它有很多庫(kù)實(shí)現(xiàn)了常見(jiàn)的網(wǎng)絡(luò)協(xié)議,它可以讓程序員專(zhuān)注于程序的邏輯,而不需要關(guān)心底層的通信,可以使用Python 的socket 模塊來(lái)引用套接字。要使用Python 實(shí)現(xiàn)套接字編程,需要導(dǎo)入socket 模塊或框架。該模塊由創(chuàng)建套接字并幫助它們彼此關(guān)聯(lián)所需的內(nèi)置方法組成。一些重要的方法具體如下。

        socket.socket():用于創(chuàng)建套接字,服務(wù)器和客戶端都需要?jiǎng)?chuàng)建套接字。

        socket.accept():被動(dòng)接受TCP 客戶的連接,阻塞式等待連接的到來(lái)。

        socket.bind():用于將套接字綁定到指定為參數(shù)的地址。

        socket.close():關(guān)閉套接字。

        socket.connect():用于連接到指定為參數(shù)的遠(yuǎn)程地址,主動(dòng)初始化TCP 服務(wù)器連接。

        socket.listen():使服務(wù)器能夠接受連接,開(kāi)始TCP監(jiān)聽(tīng)。

        socket.recv():接收TCP 數(shù)據(jù)。

        socket.send():發(fā)送TCP 消息。

        socket.sendall():發(fā)送完整的TCP數(shù)據(jù)。

        sendto():發(fā)送UDP套接字的數(shù)據(jù)。

        Recvfrom():接收UDP套接字的數(shù)據(jù)。

        2 TCP套接字編程

        2.1 建立基于TCP的服務(wù)器端連接

        建立基于TCP 傳輸協(xié)議的服務(wù)器端連接的流程如下。

        (1)調(diào)用socket方法創(chuàng)建套接字對(duì)象。

        socket=socket.socket(netadd_type,socket_type)

        socket 方法有兩個(gè)參數(shù)。netadd_type 表示IP 地址的類(lèi)型,如果使用的是ipv4 地址,則需將其值設(shè)置為AF_INET。socket_type 表示要?jiǎng)?chuàng)建的套接字的類(lèi)型,在此需要?jiǎng)?chuàng)建的套接字是流式套接字,需將其值設(shè)置為SOCK_STREAM,表示在傳輸層使用的TCP協(xié)議。

        (2)使用bind 方法將已創(chuàng)建的套接字綁定到指定的地址和端口上。

        socket.bind(site)

        bind 方法有一個(gè)參數(shù)site,該參數(shù)是一個(gè)二元元組(socket_host,socket_port),socket_host 用來(lái)指定IP地址或主機(jī)名,127.0.0.1 是標(biāo)準(zhǔn)的IPv4 回環(huán)地址,socket_port表示套接字中的端口號(hào)。

        (3)使用listen 方法在已創(chuàng)建的socket 句柄上建立監(jiān)聽(tīng)。

        socket.listen(linknum)

        listen 方法有一個(gè)參數(shù)linknum,該參數(shù)用來(lái)指定服務(wù)器允許的最多連接數(shù)。

        (4)使用accept方法被動(dòng)接受客戶機(jī)的連接請(qǐng)求。

        client_socket,client_address=socket.accept()

        accept 方法用來(lái)接受一個(gè)來(lái)自客戶機(jī)的連接請(qǐng)求,并返回一個(gè)新的套接字。服務(wù)器與此次接受的客戶機(jī)之間的通信是通過(guò)在這個(gè)返回的新的套接字上收發(fā)數(shù)據(jù)來(lái)完成的。accept 方法被調(diào)用后會(huì)返回一個(gè)二元元組,client_socket 表示返回的新的套接字對(duì)象,client_address 表示發(fā)出連接請(qǐng)求的客戶機(jī)的IP地址。

        (5)通信雙方進(jìn)入數(shù)據(jù)傳遞階段。

        服務(wù)器可以使用send 或者sendall 方法向客戶機(jī)發(fā)送數(shù)據(jù),服務(wù)器要想接收客戶機(jī)發(fā)來(lái)的數(shù)據(jù)可以使用recv方法。

        (6)雙方通信結(jié)束以后,服務(wù)器使用close()關(guān)閉已連接的套接字。

        2.2 創(chuàng)建基于TCP的客戶端連接

        創(chuàng)建基于TCP 傳輸協(xié)議的客戶端連接的流程如下。

        (1)使用socket 方法創(chuàng)建一個(gè)用來(lái)和服務(wù)器建立連接的套接字。

        client_socket=socket.socket(netadd_type,socket_type)

        (2)調(diào)用connect()和服務(wù)器建立連接。

        (3)客戶機(jī)使用send 或sendall 方法發(fā)送數(shù)據(jù),使用recv方法接收數(shù)據(jù)。

        (4)數(shù)據(jù)傳輸結(jié)束后,客戶機(jī)需要調(diào)用close()來(lái)關(guān)閉已連接的套接字。

        2.3 使用Python 編程實(shí)現(xiàn)服務(wù)器與客戶機(jī)基于TCP協(xié)議的通信

        編寫(xiě)一個(gè)基于TCP 協(xié)議的客戶機(jī)與服務(wù)器程序,在Python的IDLE編譯器中運(yùn)行,實(shí)現(xiàn)服務(wù)器與客戶機(jī)之間的相互通信,使發(fā)送程序和接收程序能夠接收鍵盤(pán)輸入并彼此之間相互發(fā)送數(shù)據(jù)。

        服務(wù)器需要先創(chuàng)建TCP 套接字,綁定套接字到本地IP 與指定端口,接下來(lái)開(kāi)始監(jiān)聽(tīng),用一個(gè)while 循環(huán)一直監(jiān)聽(tīng)有沒(méi)有消息連接,并接受客戶端的連接請(qǐng)求,然后接收客戶端傳來(lái)的數(shù)據(jù),并發(fā)送給對(duì)方數(shù)據(jù),數(shù)據(jù)傳輸完畢后,關(guān)閉套接字。服務(wù)器端程序具體如下。

        客戶端先創(chuàng)建TCP 套接字,申請(qǐng)和服務(wù)器建立連接,當(dāng)和服務(wù)器成功建立連接后,開(kāi)始收發(fā)數(shù)據(jù),通信結(jié)束后,關(guān)閉已連接的套接字??蛻舳顺绦蛉缦滤?。

        首先執(zhí)行服務(wù)器端編寫(xiě)的程序,接下來(lái)執(zhí)行客戶端編寫(xiě)的程序,然后讓客戶機(jī)給服務(wù)器發(fā)送數(shù)據(jù),再讓服務(wù)器給客戶機(jī)發(fā)送數(shù)據(jù),以此循環(huán),當(dāng)客戶機(jī)想和服務(wù)器結(jié)束通信時(shí),可以輸入“q”或“Q”。經(jīng)過(guò)測(cè)試,服務(wù)器端程序和客戶端程序能夠接收鍵盤(pán)輸入并彼此之間相互發(fā)送數(shù)據(jù),程序運(yùn)行正常,得到了預(yù)期的效果。

        3 UDP套接字編程

        由于UDP 協(xié)議是無(wú)連接的,UDP 套接字編程與TCP 套接字編程的區(qū)別在服務(wù)器端表現(xiàn)為,不需要使用監(jiān)聽(tīng)函數(shù)listen()對(duì)客戶端的連接進(jìn)行監(jiān)聽(tīng);在客戶端的表現(xiàn)為客戶端的socket不需要與服務(wù)器建立連接就能夠進(jìn)行數(shù)據(jù)的發(fā)送與接收,即不需要使用connect()函數(shù)。

        3.1 建立基于UDP的服務(wù)器端連接

        建立基于UDP 傳輸協(xié)議的服務(wù)器端連接的流程如下。

        (1)使用socket()創(chuàng)建一個(gè)套接字對(duì)象。

        socket=socket.socket(netadd_type,socket_type)

        對(duì)于IPV4協(xié)議的UDP協(xié)議,netadd_type參數(shù)應(yīng)取值為AF_INET;socket_type 參數(shù)應(yīng)取值為SOCK_DGRAM,表示創(chuàng)建的套接字類(lèi)型是數(shù)據(jù)報(bào)套接字,使用的數(shù)據(jù)傳輸協(xié)議是UDP協(xié)議。

        (2)將socket綁定到指定地址上,具體內(nèi)容如下。

        socket.bind(address)

        (3)服務(wù)器使用sendto()發(fā)送數(shù)據(jù),使用recvfrom()接收數(shù)據(jù)。

        (4)通信雙方的數(shù)據(jù)傳遞完畢后,服務(wù)器使用close()關(guān)閉已連接的套接字。

        3.2 創(chuàng)建基于UDP的客戶端連接

        創(chuàng)建基于UDP 傳輸協(xié)議的客戶端連接的流程如下。

        (1)客戶端使用socket方法創(chuàng)建一個(gè)套接字對(duì)象,用來(lái)和服務(wù)器建立連接。

        (2)客戶端使用sendto方法向服務(wù)器發(fā)送數(shù)據(jù),使用recvfrom方法接收服務(wù)器發(fā)來(lái)的數(shù)據(jù)。

        (3)通信結(jié)束后,客戶端調(diào)用close 方法關(guān)閉已建立連接的套接字。

        3.3 使用Python 編程實(shí)現(xiàn)服務(wù)器與客戶機(jī)基于UDP協(xié)議的通信

        編寫(xiě)一個(gè)基于UDP協(xié)議的客戶機(jī)與服務(wù)器程序,實(shí)現(xiàn)相互通信。

        客戶端先創(chuàng)建UDP套接字,綁定套接字到本機(jī)IP和指定端口,然后開(kāi)始循環(huán)收發(fā)消息,數(shù)據(jù)傳輸完畢之后,關(guān)閉套接字。服務(wù)器端程序如下。

        客戶端先創(chuàng)建UDP 套接字,連接服務(wù)器端地址,連接后向服務(wù)器循環(huán)收發(fā)消息,等數(shù)據(jù)傳輸完畢后,關(guān)閉套接字。客戶端程序如下。

        首先運(yùn)行服務(wù)器端程序,接下來(lái)運(yùn)行客戶端程序,然后雙方進(jìn)行通信,雙方程序都能夠接收鍵盤(pán)輸入并彼此之間相互發(fā)送數(shù)據(jù),程序運(yùn)行正常,得到了預(yù)期的效果。

        4 結(jié)語(yǔ)

        該文介紹了套接字的概念和分類(lèi),并通過(guò)實(shí)例介紹了如何使用Python開(kāi)發(fā)基于TCP協(xié)議和UDP協(xié)議的聊天程序以及使用Python進(jìn)行TCP套接字編程和UDP套接字編程的步驟。

        猜你喜歡
        發(fā)送數(shù)據(jù)傳輸層客戶機(jī)
        Reducing the global cancer burden with gastrointestinal screening: China’s 30 years practice
        移動(dòng)自組網(wǎng)中MAC層協(xié)議研究
        基于Python語(yǔ)言的網(wǎng)絡(luò)傳輸層UDP協(xié)議攻擊性行為研究
        ZnO電子傳輸層在有機(jī)無(wú)機(jī)雜化鈣鈦礦太陽(yáng)能電池中的應(yīng)用
        基于馬爾科夫鏈的LoRaWAN網(wǎng)絡(luò)節(jié)點(diǎn)性能分析
        帶標(biāo)記方式的CRDSA++協(xié)議性能分析*
        物聯(lián)網(wǎng)無(wú)線通信傳輸層動(dòng)態(tài)通道保障機(jī)制
        基于物聯(lián)網(wǎng)GIS的消防智能巡檢系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
        使用IPSec安全傳輸數(shù)據(jù)
        瘦客戶機(jī):安全與便捷的選擇
        √天堂中文官网在线| 中文少妇一区二区三区| 精品女厕偷拍视频一区二区区| 国产情侣一区二区| 台湾无码av一区二区三区| 久久久亚洲经典视频| 国产在线精彩自拍视频| 青青草在线免费视频播放| 小鲜肉自慰网站| 亚洲a∨天堂男人无码| 国产内射视频免费观看| 99久久精品费精品国产一区二| 女邻居的大乳中文字幕| 四虎成人精品无码永久在线| 一区二区三区夜夜久久| 麻豆国产一区二区三区四区| 青青草97国产精品免费观看| 欧美成人免费看片一区| 日韩人妻美乳中文字幕在线| 亚洲精品乱码久久久久久不卡| 自慰无码一区二区三区| 欧美韩国精品另类综合| 日本av一级视频在线观看| 国产精品无码人妻在线| 国模无码视频一区| 中文字幕乱码中文乱码毛片| 黄片视频大全在线免费播放| 亚洲一区二区av免费观看| 99re6在线视频精品免费| 欧洲人妻丰满av无码久久不卡| 精品一区二区三区久久久| 隔壁的日本人妻bd高清中字| 亚洲sm另类一区二区三区| 欧美色aⅴ欧美综合色| 日本五十路熟女在线视频| 亚洲美女av一区二区在线| 丰满熟妇乱子伦| 无码人妻丝袜在线视频| av天堂免费在线播放| 成人性生交大片免费| 亚洲动漫成人一区二区|