最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?基于TCP?傳輸協(xié)議的網(wǎng)絡(luò)通信實(shí)現(xiàn)方法

 更新時(shí)間:2022年02月23日 08:22:12   作者:一枚大果殼  
網(wǎng)絡(luò)編程指在網(wǎng)絡(luò)環(huán)境中,如何實(shí)現(xiàn)不在同一物理位置中的計(jì)算機(jī)之間進(jìn)行數(shù)據(jù)通信,本文重點(diǎn)給大家介紹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í)填寫(xiě)上收件人地址、收什人姓名、發(fā)件人地址……這是第一次封裝,在此次封裝過(guò)程中遵守的打包格式是由商品打包者完成,這層打包標(biāo)準(zhǔn)可稱(chēng)為應(yīng)用層標(biāo)準(zhǔn)或應(yīng)用層協(xié)議。
  • 包裹會(huì)被物流公司收納,物流公司每天會(huì)收到需要發(fā)送至全國(guó)各地的包裹,所以,需要再次進(jìn)行分檢,把發(fā)送至同一個(gè)地區(qū)的包裹收納在一起,并再次進(jìn)行打包,并按相應(yīng)的標(biāo)準(zhǔn)進(jìn)行信息填寫(xiě)。可認(rèn)為第二次打包的標(biāo)準(zhǔn)是郵局標(biāo)準(zhǔn)或郵局協(xié)議.
  • 郵局打包后的包裹會(huì)發(fā)送至相關(guān)的運(yùn)輸部門(mén),運(yùn)輸部門(mén)會(huì)把從不同郵局收集來(lái)的包裹按目的地進(jìn)行歸類(lèi)打包,再選擇不同運(yùn)輸工具進(jìn)行傳輸,可選擇飛機(jī)、貨車(chē)、火車(chē)……這次打包協(xié)議可稱(chēng)為傳輸層協(xié)議。

協(xié)議是保證數(shù)據(jù)能被正確傳輸出去的第一操作要素,互聯(lián)網(wǎng)上所遵守的協(xié)議規(guī)范稱(chēng)為 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è)門(mén)牌標(biāo)識(shí)符號(hào),用來(lái)把從網(wǎng)絡(luò)上輸入進(jìn)來(lái)的多數(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)聽(tīng)的端口號(hào).IP+端口號(hào)也稱(chēng)為套接字,或叫socket

有點(diǎn)類(lèi)似于拜訪朋友時(shí):

先封裝一個(gè)禮物盒

然后根據(jù)朋友告訴自己的地址和門(mén)牌號(hào)前去拜訪

2、TCP 網(wǎng)絡(luò)編程實(shí)現(xiàn)

TCP 是一種傳輸層協(xié)議,是可靠的面向連接的傳輸層協(xié)議.

2.1 服務(wù)器端編程

定義一個(gè)函數(shù)用來(lái)進(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('來(lái)自于 %s:%s 連接被關(guān)閉.' % addr)

創(chuàng)建 socket 監(jiān)聽(tīng)對(duì)象:

#創(chuàng)建 TCP socket
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#監(jiān)聽(tīng)端口
server.bind(('127.0.0.1',1234))
server.listen(5)
print('服務(wù)器正在等待客戶(hù)的連接……')

建立服務(wù)監(jiān)聽(tīng)套接字,需要指定服務(wù)類(lèi)型:

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

原始套接字,普通的套接字無(wú)法處理ICMP、IGMP等網(wǎng)絡(luò)報(bào)文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報(bào)文;此外,利用原始套接字,可以通過(guò)IP_HDRINCL套接字選項(xiàng)由用戶(hù)構(gòu)造IP頭。

socket.SOCK_SEQPACKET

可靠的連續(xù)數(shù)據(jù)包服務(wù)

while True:
    # 接受一個(gè)新連接:
    sock, addr = s.accept()
    # 創(chuàng)建新線程來(lái)處理TCP連接:
    t = threading.Thread(target=session, args=(sock, addr)) t.start()

當(dāng)有客戶(hù)連接后,啟動(dòng)線程完成具體的數(shù)據(jù)處理.

2.2 客戶(hù)端編程

客戶(hù)端代碼相對(duì)而言較簡(jiǎn)單.

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()

測(cè)試結(jié)果 :

服務(wù)器端

客戶(hù)端:

3 總結(jié)

Python 提供了相關(guān)的模塊,封裝了底層的具體代碼邏輯,對(duì)于開(kāi)發(fā)者而言,只需要按流程按部就班就可以,如果需要更好的理解整個(gè)網(wǎng)絡(luò)通信的過(guò)程,則需要了解相關(guān)的網(wǎng)絡(luò)知識(shí).

相關(guān)文章

  • 淺談numpy數(shù)組初始化的幾種方法

    淺談numpy數(shù)組初始化的幾種方法

    本文主要介紹了淺談numpy數(shù)組初始化的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Python內(nèi)存管理方式和垃圾回收算法解析

    Python內(nèi)存管理方式和垃圾回收算法解析

    這篇文章主要介紹了Python內(nèi)存管理方式和垃圾回收算法解析,介紹了傳統(tǒng)的垃圾回收機(jī)制,其工作方法,finalizer的問(wèn)題等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • pytorch載入預(yù)訓(xùn)練模型后,實(shí)現(xiàn)訓(xùn)練指定層

    pytorch載入預(yù)訓(xùn)練模型后,實(shí)現(xiàn)訓(xùn)練指定層

    今天小編就為大家分享一篇pytorch載入預(yù)訓(xùn)練模型后,實(shí)現(xiàn)訓(xùn)練指定層,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • python之pkl文件的用法及說(shuō)明

    python之pkl文件的用法及說(shuō)明

    這篇文章主要介紹了python之pkl文件的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python?Selenium如何切換瀏覽器的頁(yè)面

    Python?Selenium如何切換瀏覽器的頁(yè)面

    這篇文章主要介紹了Python?Selenium如何切換瀏覽器的頁(yè)面的相關(guān)資料,在使用Selenium進(jìn)行網(wǎng)頁(yè)測(cè)試時(shí),跳轉(zhuǎn)頁(yè)面后常會(huì)出現(xiàn)無(wú)法定位元素的問(wèn)題,解決這一問(wèn)題的關(guān)鍵是學(xué)會(huì)在多個(gè)瀏覽器標(biāo)簽頁(yè)或窗口間切換,需要的朋友可以參考下
    2024-10-10
  • 基于Django的Admin后臺(tái)實(shí)現(xiàn)定制簡(jiǎn)單監(jiān)控頁(yè)

    基于Django的Admin后臺(tái)實(shí)現(xiàn)定制簡(jiǎn)單監(jiān)控頁(yè)

    Django自帶的后臺(tái)管理是Django明顯特色之一,可以讓我們快速便捷管理數(shù)據(jù)。后臺(tái)管理可以在各個(gè)app的admin.py文件中進(jìn)行控制。本文將主要介紹如何利用Admin后臺(tái)實(shí)現(xiàn)監(jiān)控頁(yè)的定制,快來(lái)和小編一起學(xué)習(xí)一下吧
    2021-12-12
  • Python 通過(guò)URL打開(kāi)圖片實(shí)例詳解

    Python 通過(guò)URL打開(kāi)圖片實(shí)例詳解

    這篇文章主要介紹了Python 通過(guò)URL打開(kāi)圖片實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Python實(shí)現(xiàn)矩陣可視化的示例代碼

    Python實(shí)現(xiàn)矩陣可視化的示例代碼

    matplotlib中提供了兩個(gè)矩陣可視化函數(shù),分別是imshow和matshow,本文主要為大家詳細(xì)介紹了如何使用這兩個(gè)函數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • 使用Python實(shí)現(xiàn)為PDF文件添加圖章

    使用Python實(shí)現(xiàn)為PDF文件添加圖章

    在日常工作中,我們經(jīng)常需要給PDF文檔添加一些標(biāo)識(shí),比如公司的圖章或水印圖章,所以本文就來(lái)為大家詳細(xì)介紹一下如何使用Python實(shí)現(xiàn)為PDF文件添加圖章,需要的可以參考下
    2023-11-11
  • Python MySQL查詢(xún)限制方式詳解

    Python MySQL查詢(xún)限制方式詳解

    MySQL是一款廣泛使用的關(guān)系型數(shù)據(jù)庫(kù),而Python是一門(mén)流行的編程語(yǔ)言,在進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),二者的結(jié)合可以幫助我們更加高效地進(jìn)行操作和管理,這篇文章主要介紹了Python MySQL查詢(xún)限制,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

阳东县| 息烽县| 崇礼县| 唐海县| 平潭县| 泸定县| 康保县| 赣州市| 西乡县| 务川| 合肥市| 资兴市| 屏东市| 阿尔山市| 吉木乃县| 深泽县| 崇明县| 北宁市| 德兴市| 郎溪县| 磐石市| 丰台区| 轮台县| 开阳县| 乌拉特后旗| 东城区| 陇西县| 红安县| 宝山区| 彭水| 双峰县| 安阳市| 平泉县| 溆浦县| 军事| 曲阜市| 河间市| 壤塘县| 平和县| 临潭县| 长春市|