日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解python tcp編程

瀏覽:19日期:2022-07-13 11:04:55

網(wǎng)絡(luò)連接與通信是我們學(xué)習(xí)任何編程語言都繞不過的知識(shí)點(diǎn)。 Python 也不例外,本文就介紹因特網(wǎng)的核心協(xié)議 TCP ,以及如何用 Python 實(shí)現(xiàn) TCP 的連接與通信。

TCP 協(xié)議

TCP協(xié)議(Transmission Control Protocol, 傳輸控制協(xié)議)是一種面向連接的傳輸層通信協(xié)議,它能提供高可靠性通信,像 HTTP/HTTPS 等網(wǎng)絡(luò)服務(wù)都采用 TCP 協(xié)議通訊。那么網(wǎng)絡(luò)通訊方面都會(huì)涉及到 socket 編程,當(dāng)然也包括 TCP 協(xié)議。

Network Socket

我們來看看定義:

Network Socket(網(wǎng)絡(luò)套接字)是計(jì)算機(jī)網(wǎng)絡(luò)中進(jìn)程間通信的數(shù)據(jù)流端點(diǎn),廣義上也代表操作系統(tǒng)提供的一種進(jìn)程間通信機(jī)制。

這些計(jì)算機(jī)術(shù)語都很學(xué)術(shù),難于理解,每個(gè)字都認(rèn)識(shí),加在一起就不認(rèn)識(shí)了。我們可以通俗地理解成發(fā)快遞:A 需要給 B 寄快遞,首先需要知道 B 的地址和手機(jī)號(hào)碼,那么這個(gè)地址就相當(dāng)于 網(wǎng)絡(luò)中的主機(jī) IP 地址,而手機(jī)就相當(dāng)于 主機(jī)的端口號(hào)。然后 A 還需要指定哪家快遞公司,是順豐還是中通?這個(gè)快遞公司就相當(dāng)于通信的傳輸協(xié)議。

TCP 連接流程

上述快遞的例子中,寄快遞的我們可以叫做客戶端,收快遞的我們叫做服務(wù)器。專業(yè)點(diǎn)就是主動(dòng)發(fā)起連接的一方叫做客戶端,被動(dòng)響應(yīng)的一方叫做服務(wù)器。例如,我們?cè)跒g覽器中訪問百度搜索時(shí),我們自己的電腦就是客戶端,瀏覽器會(huì)向百度的服務(wù)器發(fā)送連接請(qǐng)求,如果百度的服務(wù)器接受了我們的請(qǐng)求,那么一個(gè) TCP 連接就建立起來了,后面就是百度向我們傳輸搜索結(jié)果了。

我們來看一個(gè)流程圖:

詳解python tcp編程

TCP服務(wù)器的建立可以歸納這幾步:

創(chuàng)建 socket(套接字) 綁定 socket 的 IP 地址和端口號(hào) 監(jiān)聽客戶端的連接請(qǐng)求 接受客戶端的連接請(qǐng)求 與客戶端對(duì)話 關(guān)閉連接

TCP客戶端的創(chuàng)建可總結(jié)為這幾步:

創(chuàng)建 socket(套接字) 連接服務(wù)器 socket 與服務(wù)器對(duì)話 關(guān)閉連接

這里需要注意的是 TCP 客戶端連接到服務(wù)器的 IP 和端口號(hào)必須是 TCP 服務(wù)器的 IP 和監(jiān)聽的端口號(hào),服務(wù)器調(diào)用 listen() 開始監(jiān)聽端口,然后調(diào)用 accept() 時(shí)刻準(zhǔn)備接受客戶端的連接請(qǐng)求,此時(shí)服務(wù)器處于阻塞狀態(tài),直到服務(wù)器監(jiān)聽到客戶端的請(qǐng)求后,接收請(qǐng)求并建立連接為止。

TCP 客戶端

創(chuàng)建 socket 連接,可以這樣做:

# 導(dǎo)入socket庫import socket# 創(chuàng)建一個(gè)sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立連接s.connect(('127.0.0.1', 6000))

創(chuàng)建 socket 時(shí),第一個(gè)參數(shù) socket.AF_INET 表示指定使用 IPv4 協(xié)議,如果要使用 IPv6 協(xié)議,就指定為 socket.AF_INET6。SOCK_STREAM 指定使用面向流的 TCP 協(xié)議。然后我們調(diào)用 connect() 方法,傳入 IP 地址(或者域名),指定端口號(hào)就可以建立連接了。

接下來我們就可以向服務(wù)器發(fā)送數(shù)據(jù)了:

s.send(b’Hello, Mr Right!’)

接收數(shù)據(jù)時(shí),調(diào)用 recv(max) 方法,一次最多接收指定的字節(jié)數(shù),因此,在一個(gè) while 循環(huán)中反復(fù)接收,直到 recv() 返回空數(shù)據(jù),表示接收完畢,退出循環(huán)。

# 接收數(shù)據(jù)buffer = []while True: # 每次最多接收1k字節(jié) d = s.recv(1024) if d: buffer.append(d) else: breakdata = b’’.join(buffer)

最后,我們需要關(guān)閉連接,很簡(jiǎn)單:

s.close()

TCP 服務(wù)器

相比于客戶端,服務(wù)器端稍微復(fù)雜一些,需要先綁定一個(gè) IP 地址和端口號(hào),然后監(jiān)聽客戶端的請(qǐng)求,收到請(qǐng)求后丟到一個(gè)線程去處理。

創(chuàng)建 socket 跟客戶端方法一樣:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

接下來需要綁定監(jiān)聽地址和端口:

s.bind((’127.0.0.1’, 6000))

然后就可以開始監(jiān)聽端口了,監(jiān)聽時(shí)需要傳入一個(gè)參數(shù),指定等待連接的最大數(shù)量:

s.listen(5)

接下來就是無限循環(huán)等待客戶端的連接,直到有連接請(qǐng)求過來,就用一個(gè)線程去處理:

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

這里為什么需要多線程處理呢?想象一下菜鳥驛站,如果里面只有一個(gè)人的話,那么多個(gè)人寄件就需要排隊(duì),一個(gè)個(gè)來;但是如果有多個(gè)人的話,那么每個(gè)人都可以處理一個(gè)寄件請(qǐng)求。

我們來看一下處理客戶端請(qǐng)求的方法:

# 處理tcp連接def tcplink(conn, addr): print('Accept new connection from %s:%s' % addr) # 向客戶端發(fā)送歡迎消息 conn.send(b'Server: Welcome!n') while True: conn.send(b'Server: What’s your name?') data = conn.recv(1024) # 如果客戶端發(fā)送 exit 過來請(qǐng)求退出,結(jié)束循環(huán) if data == b'exit': conn.send(b'Server: Good bye!n') break conn.send(b'Server: Hello %s!n' % data) # 關(guān)閉連接 conn.close() print('Connection from %s:%s is closed' % addr)

例子中,我們先想客戶端發(fā)送歡迎消息,然后詢問客戶端名稱,收到名稱后發(fā)送歡迎消息,直到接收到客戶端的 ‘exit’ 命令,退出循環(huán),關(guān)閉連接。

實(shí)例

我們把上面的分步講解代碼合并起來,形成一個(gè)可運(yùn)行的實(shí)例。

服務(wù)器端代碼:

import socketimport threadingimport time# 處理tcp連接def tcplink(conn, addr): print('Accept new connection from %s:%s' % addr) # 向客戶端發(fā)送歡迎消息 conn.send(b'Server: Welcome!n') while True: conn.send(b'Server: What’s your name?') data = conn.recv(1024) # 如果客戶端發(fā)送 exit 過來請(qǐng)求退出,結(jié)束循環(huán) if data == b'exit': conn.send(b'Server: Good bye!n') break conn.send(b'Server: Hello %s!n' % data) time.sleep(5) # 關(guān)閉連接 conn.close() print('Connection from %s:%s is closed' % addr)# 創(chuàng)建 sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 監(jiān)聽端口s.bind(('127.0.0.1', 6000))# 設(shè)定等待連接的最大數(shù)量為5s.listen(5)print('Waiting for connection...')# 等待接收連接while True: # 接受一個(gè)新連接 conn, addr = s.accept() # 創(chuàng)建新線程來處理TCP連接 t = threading.Thread(target=tcplink, args=(conn, addr)) t.start()

客戶端代碼:

import socketimport time# 創(chuàng)建 sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立連接s.connect(('127.0.0.1', 6000))# 接收服務(wù)器消息print(s.recv(1024).decode())for data in [b’Michael’, b’Tracy’, b’Sarah’]: # 發(fā)送數(shù)據(jù) s.send(data) time.sleep(2) # 打印接收到的數(shù)據(jù) print(s.recv(1024).decode(’utf-8’)) time.sleep(1)time.sleep(3)# 請(qǐng)求退出s.send(b’exit’)time.sleep(2)print(s.recv(1024).decode(’utf-8’))# 關(guān)閉連接s.close()

注意,在代碼中,我加入了一些休眠(sleep)操作,主要是為了控制臺(tái)能夠順利打印出來,不然程序運(yùn)行太快,打印順序和內(nèi)容有可能和預(yù)期不一樣。

先運(yùn)行服務(wù)器端代碼,然后再運(yùn)行客戶端代碼,我們可以看到服務(wù)器端控制臺(tái)打印內(nèi)容如下:

# 服務(wù)器端打印消息Waiting for connection...Accept new connection from 127.0.0.1:53503Connection from 127.0.0.1:53503 is closed

客戶端控制臺(tái)打印內(nèi)容如下:

# 客戶端打印消息Server: Welcome!Server: What’s your name?Server: Hello Michael!Server: What’s your name?Server: Hello Tracy!Server: What’s your name?Server: Hello Sarah!Server: What’s your name?Server: Good bye!

大家可以對(duì)照著打印內(nèi)容和代碼,體會(huì)一下服務(wù)器端和客戶端通信的原理。

總結(jié)

本文為大家介紹了 TCP 編程的基本原理和如何使用 Python 實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的 TCP 通信過程。通過介紹和實(shí)例,大家要在腦海中形成一個(gè) TCP 通信的過程,熟悉了這個(gè)過程是處理后續(xù)復(fù)雜通信需求的基礎(chǔ)。

文中實(shí)例代碼

以上就是詳解python tcp編程的詳細(xì)內(nèi)容,更多關(guān)于python tcp編程的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
999国产精品视频| 久久国产精品美女| 特黄毛片在线观看| 97精品在线| 日本不卡免费高清视频在线| 精品高清久久| 美女福利一区二区三区| 欧美日韩视频网站| 久久国产电影| 不卡一区2区| 美女精品网站| 日韩欧美久久| 另类欧美日韩国产在线| 精品久久久久中文字幕小说| 精品久久91| 日本高清不卡一区二区三区视频| 亚洲不卡av不卡一区二区| 欧美福利在线| 三级欧美韩日大片在线看| 日韩欧美在线精品| 久久精品伊人| 91看片一区| 久久xxxx精品视频| 日韩精品欧美精品| 国产一区二区三区黄网站| 99久久婷婷这里只有精品| 蜜桃一区二区三区在线| 国产精品亚洲欧美日韩一区在线| 国产精品二区不卡| 尤物在线精品| 国产另类在线| 久久久777| 香蕉久久国产| 久久不见久久见中文字幕免费| 日韩免费av| 中文字幕亚洲在线观看| 久久精品亚洲| 欧美a级片一区| 日韩福利视频网| 久久久久久自在自线| 亚州av乱码久久精品蜜桃| 日韩精品亚洲专区| 在线天堂资源www在线污| 国产亚洲一区在线| 久久av资源| 欧美日韩国产探花| 欧美激情亚洲| 午夜久久黄色| 麻豆精品久久久| 99在线观看免费视频精品观看| 国产欧美亚洲一区| 蜜臀91精品国产高清在线观看| 日韩精品第二页| 久久久国产精品一区二区中文| 天堂va在线高清一区| 亚洲人成在线网站| 日本不卡视频一二三区| 欧美成人a交片免费看| 中文字幕成人| 日本少妇一区| 国产精品一区二区三区四区在线观看| 亚洲国产专区校园欧美| 日韩av中文字幕一区| 国产精品亚洲一区二区三区在线观看| 视频一区中文字幕精品 | 一区二区精彩视频| 久久久久久网| 日韩国产91| 黄色日韩在线| 91青青国产在线观看精品| 在线精品亚洲| 欧美日韩免费看片| 国产精品v一区二区三区| 午夜在线观看免费一区| 成人福利av| 欧美性www| 老牛影视一区二区三区| 亚洲1234区| 里番精品3d一二三区| 亚洲18在线| 免费欧美日韩| 久久精品国产99久久| 国产成人精品三级高清久久91| 日韩高清不卡在线| av不卡在线看| 伊人精品一区| 日本在线啊啊| 福利一区二区| 国产高清视频一区二区| 日韩亚洲精品在线观看| 国产精品99一区二区| 麻豆视频在线看| 麻豆精品视频在线| 日韩精品社区| 亚洲区第一页| 香蕉久久夜色精品国产| 99精品综合| 桃色av一区二区| 精品日产乱码久久久久久仙踪林| 青青草91久久久久久久久| 另类激情亚洲| 亚洲精品在线观看91| 色婷婷狠狠五月综合天色拍| 国产成年精品| 精品国产麻豆| 国产精品最新| 国产午夜久久av| 久久精品凹凸全集| 亚洲aⅴ网站| 亚洲精品福利| 亚洲久久一区| 亚洲精品大片| 日韩不卡免费视频| 欧美日韩18| 欧美私人啪啪vps| **爰片久久毛片| 国产精品视频一区二区三区综合 | 国产精品sm| 国产欧美一级| 国产精品自在| 国产精品.xx视频.xxtv| 国产精品一国产精品k频道56| 青青草伊人久久| 青草国产精品| 国产欧美日韩一区二区三区四区| 日本aⅴ免费视频一区二区三区| 亚洲毛片在线免费| 日本在线一区二区三区| 日韩av黄色在线| 国产精品v一区二区三区| 国产精品色在线网站| 欧美aⅴ一区二区三区视频| 另类综合日韩欧美亚洲| 精品精品国产三级a∨在线| 国产一区二区三区日韩精品| 中文字幕人成乱码在线观看| 一区二区三区四区日本视频| 日韩一区电影| 国产91精品对白在线播放| 亚洲欧美综合| 美女被久久久| 欧美亚洲网站| 国产成人精品福利| 999久久久精品国产| 黄色成人精品网站| 中文字幕日本一区| 国产精品中文字幕制服诱惑| 久久亚州av| www成人在线视频| 五月婷婷六月综合| 四虎国产精品免费久久| 国产极品模特精品一二| 亚洲天堂免费电影| 性色av一区二区怡红| 69堂精品视频在线播放| 国产一区二区三区亚洲| 国产精品99免费看| 亚洲精品日本| 成人日韩av| 在线一区视频| 国产伦理一区| 久久精品亚洲人成影院| 热久久国产精品| 国产精品一级在线观看| 午夜精品久久久久久久久久蜜桃| 国产精品日韩| 国产精品一区亚洲| 久久精品动漫| 亚洲欧美日本国产| 国产不卡精品在线| 久久aⅴ国产紧身牛仔裤| 国产精品**亚洲精品| 亚洲二区免费| 久久黄色影视| 99成人超碰| 欧美三级第一页| 欧美一区三区| 国产调教精品| 在线成人动漫av| 欧美一级一区| 激情久久五月| 国产精品一区二区三区av麻| 亚洲午夜91| 国产精品亚洲欧美一级在线| 欧美1级日本1级| 国产精品**亚洲精品| 影音先锋久久| 国产成人久久精品麻豆二区| 视频在线观看一区| 日本欧美国产| 日韩**一区毛片| 激情久久婷婷| 美女视频黄久久| 蜜臀a∨国产成人精品| 国产精品yjizz视频网| 日本不卡视频在线| 2023国产精品久久久精品双| 精品视频黄色| 日韩一区二区三区精品| 99久久久国产精品美女|