網路程式設計通過tcp協議進行聊天對話

2021-08-21 06:27:09 字數 3366 閱讀 8850

網路程式設計

自從網際網路誕生以來,現在基本上所有的程式都是網路程式,很少有單機版的程式了。

計算機網路就是把各個計算機連線到一起,讓網路中的計算機可以互相通訊。網路程式設計就是如何在程式中實現兩台計算機的通訊。

網路程式設計對所有開發語言都是一樣的,python也不例外。用python進行網路程式設計,就是在python程式本身這個程序內,連線別的伺服器程序的通訊埠進行通訊。

基本概念ipv6位址實際上是乙個128位整數,它是目前使用的ipv4的公升級版,以字串表示類似於2001:0db8:85a3:0042:1000:8a2e:0370:7334。

tcp協議則是建立在ip協議之上的。tcp協議負責在兩台計算機之間建立可靠連線,保證資料報按順序到達。tcp協議會通過握手建立連線,然後,對每個ip包編號,確保對方按順序收到,如果包丟掉了,就自動重發。

許多常用的更高階的協議都是建立在tcp協議基礎上的,比如用於瀏覽器的http協議、傳送郵件的smtp協議等。

乙個tcp報文除了包含要傳輸的資料外,還包含源ip位址和目標ip位址,源埠和目標埠。

埠有什麼作用?在兩台計算機通訊時,只發ip位址是不夠的,因為同一臺計算機上跑著多個網路程式。乙個tcp報文來了之後,到底是交給瀏覽器還是qq,就需要埠號來區分。每個網路程式都向作業系統申請唯一的埠號,這樣,兩個程序在兩台計算機之間建立網路連線就需要各自的ip位址和各自的埠號。

乙個程序也可能同時與多個計算機建立鏈結,因此它會申請很多埠。

什麼是 socket?

socket()函式

python中,我們用socket()函式來建立套接字。

socket物件(內建)主要方法

伺服器端套接字

s.bind() 繫結位址(host,port)到套接字, 在af_inet下,以元組(host,port)的形式表示位址。

s.listen() 開始tcp監聽。backlog指定在拒絕連線之前,作業系統可以掛起的最大連線數量。該值至少為1,大部分應用程式設為5就可以了。

s.accept() 被動接受tcp客戶端連線,(阻塞式)等待連線的到來

客戶端套接字

s.connect() 主動初始化tcp伺服器連線,。一般address的格式為元組(hostname,port),如果連線出錯,返回socket.error錯誤。

s.connect_ex() connect()函式的擴充套件版本,出錯時返回出錯碼,而不是丟擲異常

公共用途套接字函式

s.recv() 接收tcp資料,資料以字串形式返回,bufsize指定要接收的最大資料量。flag提供有關訊息的其他資訊,通常可以忽略。

s.send() 傳送tcp資料,將string中的資料傳送到連線的套接字。返回值是要傳送的位元組數量,該數量可能小於string的位元組大小。

s.close() 關閉套接字

伺服器

和客戶端程式設計相比,伺服器程式設計就要複雜一些。

伺服器程序首先要繫結乙個埠並監聽來自其他客戶端的連線。如果某個客戶端連線過來了,伺服器就與該客戶端建立socket連線,隨後的通訊就靠這個socket連線了。

所以,伺服器會開啟固定埠(比如80)監聽,每來乙個客戶端連線,就建立該socket連線。由於伺服器會有大量來自客戶端的連線,所以,伺服器要能夠區分乙個socket連線是和哪個客戶端繫結的。乙個socket依賴4項:伺服器位址、伺服器端口、客戶端位址、客戶端埠來唯一確定乙個socket。

但是伺服器還需要同時響應多個客戶端的請求,所以,每個連線都需要乙個新的程序或者新的執行緒來處理,否則,伺服器一次就只能服務乙個客戶端了。

#匯入 socket和_thread模組

import socket

import _thread

#建立socket物件

serversocket=socket.socket(family=socket.af_inet,type=socket.sock_stream)

#獲取本地主機名和埠號

serversocket.bind(("localhost",8888))

print("伺服器等待。。。")

#設定最大連線數,超過後排隊

serversocket.listen(5)

#serversocket.accpet()會返回兩個值乙個是客戶端例項另乙個是客戶端位址ip

clientsocket,addr=serversocket.accept()

#進行多執行緒獲取客戶端內容

def get_msg():

while true:

#接收小於1024位元組的資料並編碼成utf-8格式

msg = clientsocket.recv(1024).decode("utf-8")

print("客戶端說:", msg)

_thread.start_new_thread(get_msg,())

#進行多執行緒對客戶端傳送內容

def sendqq():

while true:

qq=input("我說:")

#傳送資料並解析成utf-8格式

clientsocket.send(qq.encode("utf-8"))

_thread.start_new_thread(sendqq(),())

客戶端

大多數連線都是可靠的tcp連線。建立tcp連線時,主動發起連線的叫客戶端,被動響應連線的叫伺服器。

import socket

import _thread

#建立socket物件

clientsocket=socket.socket(socket.af_inet,socket.sock_stream)

#連線指定的服務端 和埠

clientsocket.connect(("localhost",8888))

print("客戶端連線")

#下面就跟伺服器的一樣了

def get_msg():

while true:

msg = clientsocket.recv(1024).decode("utf-8")

print("伺服器說:", msg)

_thread.start_new_thread(get_msg,())

def sendqq():

while true:

qq=input("我說")

clientsocket.send(qq.encode("utf-8"))

_thread.start_new_thread(sendqq(),())

網路程式設計(TCP協議)

tcp協議,傳輸控制協議 英語 transmission control protocol,縮寫為 tcp 是一種面向連線的 可靠的 基於位元組流的傳輸層通訊協議,由ietf的rfc 793定義。tcp通訊需要經過建立連線 資料傳送 終止連線三個步驟。tcp通訊模型中,在通訊開始之前,一定要先建立相...

通過TCP協議進行C S模式的網路通訊

通過tcp協議進行c s模式的網路通訊 1.sockaddr in 結構體 struct sockaddr in in addr 結構體 struct in addr in addr t 在標頭檔案 中定義,等價於 unsigned long,長度為4個位元組。也就是說,s addr 是乙個整數,而...

網路程式設計之TCP協議整理

建立連線,形成傳輸資料的通道,在連線中進行大資料量的傳輸。需要通過三次握手完成連線,是可靠地協議。但是效率低。客戶端建立過程。1 建立tcp客戶端socket伺服器,使用的是socket物件,建立物件時明確目的地,以及要連線的主機。2 如果連線成功,說明資料傳輸通道已經建立。這個通道就是流,sock...