成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何用Python實現TCP的連接與通信?

網絡 通信技術
網絡連接與通信是我們學習任何編程語言都繞不過的知識點。Python 也不例外,下面就介紹因特網的核心協議 TCP ,以及如何用 Python 實現 TCP 的連接與通信。

 網絡連接與通信是我們學習任何編程語言都繞不過的知識點。Python 也不例外,下面就介紹因特網的核心協議 TCP ,以及如何用 Python 實現 TCP 的連接與通信。

[[286840]]

TCP 協議

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

Network Socket

我們來看看定義:

Network Socket(網絡套接字)是計算機網絡中進程間通信的數據流端點,廣義上也代表操作系統提供的一種進程間通信機制。

這些計算機術語都很學術,難于理解,每個字都認識,加在一起就不認識了。我們可以通俗地理解成發快遞:A 需要給 B 寄快遞,首先需要知道 B 的地址和手機號碼,那么這個地址就相當于 網絡中的主機 IP 地址,而手機就相當于 主機的端口號。然后 A 還需要指定哪家快遞公司,是順豐還是中通?這個快遞公司就相當于通信的傳輸協議。

TCP 連接流程

上述快遞的例子中,寄快遞的我們可以叫做客戶端,收快遞的我們叫做服務器。專業點就是主動發起連接的一方叫做客戶端,被動響應的一方叫做服務器。例如,我們在瀏覽器中訪問百度搜索時,我們自己的電腦就是客戶端,瀏覽器會向百度的服務器發送連接請求,如果百度的服務器接受了我們的請求,那么一個 TCP 連接就建立起來了,后面就是百度向我們傳輸搜索結果了。

我們來看一個流程圖:

 

如何用 Python 實現 TCP 的連接與通信?

 

TCP服務器的建立可以歸納這幾步:

  • 創建 socket(套接字)
  • 綁定 socket 的 IP 地址和端口號
  • 監聽客戶端的連接請求
  • 接受客戶端的連接請求
  • 與客戶端對話
  • 關閉連接

TCP客戶端的創建可總結為這幾步:

  • 創建 socket(套接字)
  • 連接服務器 socket
  • 與服務器對話
  • 關閉連接

這里需要注意的是 TCP 客戶端連接到服務器的 IP 和端口號必須是 TCP 服務器的 IP 和監聽的端口號,服務器調用 listen() 開始監聽端口,然后調用 accept() 時刻準備接受客戶端的連接請求,此時服務器處于阻塞狀態,直到服務器監聽到客戶端的請求后,接收請求并建立連接為止。

TCP 客戶端

創建 socket 連接,可以這樣做:

  1. # 導入socket庫import socket# 創建一個sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立連接s.connect(("127.0.0.1", 6000)) 

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

接下來我們就可以向服務器發送數據了:

  1. s.send(b'Hello, Mr Right!'

接收數據時,調用 recv(max) 方法,一次最多接收指定的字節數,因此,在一個 while 循環中反復接收,直到 recv() 返回空數據,表示接收完畢,退出循環。

  1. #接收數據 buffer=[] whileTrue: #每次最多接收1k字節 d=s.recv(1024) ifd: buffer.append(d) else:break data=b''.join(buffer) 

最后,我們需要關閉連接,很簡單:

  1. s.close() 

TCP 服務器

相比于客戶端,服務器端稍微復雜一些,需要先綁定一個 IP 地址和端口號,然后監聽客戶端的請求,收到請求后丟到一個線程去處理。

創建 socket 跟客戶端方法一樣:

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

接下來需要綁定監聽地址和端口:

  1. s.bind(('127.0.0.1', 6000)) 

然后就可以開始監聽端口了,監聽時需要傳入一個參數,指定等待連接的最大數量:

  1. s.listen(5) 

接下來就是無限循環等待客戶端的連接,直到有連接請求過來,就用一個線程去處理:

  1. whileTrue: #接受一個新連接 sock,addr=s.accept() #創建新線程來處理TCP連接 t=threading.Thread(target=tcplink,args=(sock,addr)) t.start() 

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

我們來看一下處理客戶端請求的方法:

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

例子中,我們先想客戶端發送歡迎消息,然后詢問客戶端名稱,收到名稱后發送歡迎消息,直到接收到客戶端的 'exit' 命令,退出循環,關閉連接。

實例

我們把上面的分步講解代碼合并起來,形成一個可運行的實例。

服務器端代碼:

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

客戶端代碼:

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

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

先運行服務器端代碼,然后再運行客戶端代碼,我們可以看到服務器端控制臺打印內容如下:

  1. #服務器端打印消息 Waitingforconnection... Acceptnewconnectionfrom127.0.0.1:53503 Connectionfrom127.0.0.1:53503isclosed 

客戶端控制臺打印內容如下:

  1. #客戶端打印消息 Server:Welcome!Server:What'syourname? Server:HelloMichael! Server:What'syourname? Server:HelloTracy! Server:What'syourname? Server:HelloSarah! Server:What'syourname? Server:Goodbye! 

大家可以對照著打印內容和代碼,體會一下服務器端和客戶端通信的原理。

總結

本文為大家介紹了 TCP 編程的基本原理和如何使用 Python 實現一個最簡單的 TCP 通信過程。通過介紹和實例,大家要在腦海中形成一個 TCP 通信的過程,熟悉了這個過程是處理后續復雜通信需求的基礎。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2009-08-24 17:20:13

C#網絡通信TCP連接

2020-01-14 11:19:38

網絡安全網絡安全技術周刊

2010-04-20 14:06:56

Oracle SQL語

2020-05-09 10:38:31

Python透視表數據

2024-02-02 08:25:34

隊列與棧Python數據結構

2020-08-03 08:10:52

UDPTCP通信

2023-12-01 14:57:22

TCP連接

2009-06-24 16:26:17

MyEclipse

2012-12-21 09:19:29

Google GO

2010-06-09 14:36:44

TCP與UDP協議

2011-03-15 14:26:23

iptablesNAT

2011-03-15 09:10:47

iptablesNAT

2020-08-26 07:17:19

通信

2015-10-09 13:15:03

TCP網絡協議

2009-06-19 14:44:04

ODBCMySQL

2020-05-25 14:32:42

Python電子郵件自動化

2023-12-26 01:07:03

TCP擁塞控制

2021-09-26 06:43:09

TCP連接Go

2021-06-16 07:34:32

Pythonsocket庫Python基礎

2017-05-27 20:32:20

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产视频亚洲视频 | 91p在线观看 | 日本免费在线看 | 日韩精品专区在线影院重磅 | 精品免费视频一区二区 | 久久久国产一区二区三区 | 国产精品国产三级国产aⅴ中文 | 麻豆av免费观看 | 免费看国产精品视频 | 日日噜噜夜夜爽爽狠狠 | 99久久精品免费看国产免费软件 | 日批免费看 | 国产精品自拍视频网站 | 九久久 | 中文二区| 欧美日韩中文字幕在线 | 午夜免费福利影院 | 99综合 | 欧美日韩黄 | www操操| 欧美又大粗又爽又黄大片视频 | 亚洲人成人一区二区在线观看 | 日韩中文字幕在线视频 | 久久天堂 | 国产乱码久久久久久 | 国产亚洲精品一区二区三区 | 日韩h| 日本精品久久久久 | 欧美日本韩国一区二区 | 99视频在线免费观看 | 精品久久一区 | 91视频国产精品 | 国产99精品| 一级片在线免费播放 | 欧美日韩视频 | 亚洲国产精品99久久久久久久久 | 中文字幕精品视频 | 久久久久一区二区三区 | 精品久久久久一区二区国产 | 国产福利在线 | 色视频在线播放 |