TCP程式設計 python實現

2021-08-01 00:14:57 字數 2908 閱讀 8155

tcp是乙個面向連線的協議。這意味著客戶和伺服器要先握手和建立乙個tcp連線,才能互相傳送資料。在建立這個連線時,客戶端通過套接字位址(ip和埠號)和伺服器的套接字位址(ip和埠號)關聯起來。然後,在之後的通訊中,伺服器和客戶端如果要傳送資料,直接把資料交給套接字就可以進行傳送。(與之相對的時udp,每次傳送資料都要附帶客戶端位址,而且並不保證資料傳輸完整,但不需要像tcp一樣耗費維持連線的資源。)

在tcp伺服器與客戶端連線中,客戶端總是作為首先發起請求的一端,所以tcp伺服器程式要保持一直執行,隨時準備接收客戶端的請求。

在細節中表示為,客戶通過建立自己的套接字發起向伺服器的tcp連線。客戶生成這個套接字時,就指定了伺服器端的套接字位址。即伺服器的ip位址和套接字埠。這個套接字位址也被稱為歡迎套接字(serversocket)。

隨後進行的三次握手期間,伺服器會生成乙個專門服務這個客戶端的套接字,稱為連線套接字(connection socket)。

現在從伺服器端或客戶端看,客戶套接字和伺服器套接字通過一根管道(連線套接字)相連。客戶程序和伺服器程序可以通過這根管道傳送任意位元組,接收任意位元組,並且,tcp保證這些位元組保質保量嚴格按照傳送順序到達目的地。

接下來用python實現乙個簡單的tcp伺服器和客戶端。大致流程如下:

首先是伺服器端的實現方法。python版本3.5.2

#!/usr/bin/env python

# coding=utf-8

from socket import *

serverport = 9999 #定義埠

serversocket = socket(af_inet, sock_stream) #第乙個引數是位址族,即是ipv4還是ipv6,第二個是套接字型別

serversocket.bind(('', serverport)) #引數元組的第乙個字串代表ip位址,第二個是埠

serversocket.listen(1) #最大請求樹1

print('the server is ready to receive')

while true:

connectionsocket, addr = serversocket.accept()

sentence = connectionsocket.recv(1024)

capitalizedsentence = sentence.upper() #upper()是轉換成大寫的函式

connectionsocket.send(capitalizedsentence)

connectionsocket.close()

以定義埠號為第一行。

第二行,建立乙個ipv4,套接字型別是tcp流式套接字的socket物件,這個物件就是上面說的歡迎套接字。

第三行,繫結伺服器的位址和埠號。

第四行,伺服器可接受的最大請求數是1個。

第五行,就是伺服器要一直執行並監聽埠,隨時等待來自客戶端的連線請求。

第六行,接聽連線,完成握手,返回乙個專門服務該客戶的socket物件(也就是連線套接字),和連線另一端套接字的位址。

第七行,表示每一次接受的最大資料是1024位元組,並返回接收到的位元組物件。

第九行,把轉換的大寫資料傳送出去。

第十行,關閉連線。進入while迴圈,繼續監聽埠。這只是練習,實際中需要多執行緒來處理請求。

接下來是客戶端

#!/usr/bin/env python

# coding=utf-8

from socket import *

servername = ''

serverport = 9999

clientsocket = socket(af_inet, sock_stream)

clientsocket.connect((servername, serverport))

sentence = input('input lowercase sentence:').encode('ascii')

clientsocket.send(sentence)

modifiedsentence = clientsocket.recv(1024)

print('from server:', modifiedsentence)

clientsocket.close()

以定義伺服器名稱為第一行。

第三行,建立了客戶端的socket物件。客戶端的套接字埠號不是由自己新增的,而是由作業系統新增的。

第四行,前面說過客戶和伺服器傳送資料之前,要先建立tcp連線,這一行就發起了客戶和伺服器之間的連線。引數就是伺服器位址。這行**執行完畢後,三次握手,並在客戶和伺服器之間建立起連線。

第六行,在連線管道中向伺服器傳送訊息。從這一行和伺服器的send就能看出,只要tcp連線建立起來,客戶和伺服器的訊息就可以在這條管道中任意通行(畢竟維護這條管道也是付出代價的)。

執行結果:

tcp/ip代表傳輸控制協議/網際協議,指的是一系列協議。「ip」代表網際協議,tcp和udp使用該協議從乙個網路傳送資料報到另乙個網路。把ip想像成一種高速公路,它允許其它協議在上面行駛並找到到其它電腦的出口。tcp和udp是高速公路上的「卡車」,它們攜帶的貨物就是像http,檔案傳輸協議ftp這樣的協議等。

python實現TCP程式設計

通過python實現tcp程式設計 流程圖 偽 伺服器 ss socket 建立伺服器套接字 ss.bind 把位址繫結到套接字上 ss.listen 監聽連線 最大連線數 使套接字變為被動套接字 cs ss.accept 接受客戶端連線 comm loop 通訊迴圈 cs.recv cs.send...

通過Python3實現TCP程式設計

偽 ss socket 建立伺服器套接字 ss.bind 把位址繫結到套接字上 ss.listen 監聽連線 最大連線數 info loop 伺服器無限迴圈 cs ss.accept 接受客戶端連線 comm loop 通訊迴圈 cs.recv cs.send 對話 接收 傳送 cs.close 關...

python網路程式設計 TCP

一 網路通訊模式 對於網路通訊,現在遵循的是tcp ip協議組。而現在設計的通訊模式中,主要使用的是客戶端 伺服器程式設計,所謂的客戶端就是我們使用者所用的軟體,而服務端則是程式開發人員根據客戶端的需要設計的服務模式,為了是滿足客戶端的要求,實現和客戶端進行正常通訊。二 套接字 通訊的端點 對於tc...