python網路程式設計 TCP

2021-07-03 03:32:10 字數 4539 閱讀 5153

一、網路通訊模式

對於網路通訊,現在遵循的是tcp/ip協議組。

而現在設計的通訊模式中,主要使用的是客戶端/伺服器程式設計,所謂的客戶端就是我們使用者所用的軟體,而服務端則是程式開發人員根據客戶端的需要設計的服務模式,為了是滿足客戶端的要求,實現和客戶端進行正常通訊。

二、套接字:通訊的端點

對於tcp/ip協議來說,它是乙個多層協議族,分別是物理層,資料鏈路層,網路層,傳輸層,應用層。對於網路層的作用來說,主要是從網路中的一台主機找到另一台主機,而傳輸層的作用是在一台主機中,選擇乙個應用埠(對於一台計算機來說,可能要執行很多應用,作業系統留下了很多埠,用於處理每個不同的應用軟體)。

1、面向連線的通訊(tcp)

所謂的面向連線的通訊,也就是基於tcp協議的通訊方式。這種方式是一種順序的,可靠的,不會重複的傳輸方式。

2、無連線的通訊(udp)

資料無需建立連線就可以進行通訊。

三、基於tcp的網路程式設計

tcp伺服器端:

1. 第一步是建立socket物件。呼叫socket建構函式。如:

socket = socket.socket( family, type )

family引數代表位址家族,可為af_inet或af_unix。af_inet家族包括internet位址,af_unix家族用於同一臺機器上的程序間通訊。

type引數代表套接字型別,可為sock_stream(流套接字)和sock_dgram(資料報套接字)。

2. 第二步是將socket繫結到指定位址。這是通過socket物件的bind方法來實現的:

socket.bind( address )

由af_inet所建立的套接字,address位址必須是乙個雙元素元組,格式是(host,port)。host代表主機,port代表埠號。如果埠號正在使用、主機名不正確或埠已被保留,bind方法將引發socket.error異常。

3. 第三步是使用socket套接字的listen方法接收連線請求。

socket.listen( backlog )

backlog指定最多允許多少個客戶連線到伺服器。它的值至少為1。收到連線請求後,這些請求需要排隊,如果佇列滿,就拒絕請求。

4. 第四步是伺服器套接字通過socket的accept方法等待客戶請求乙個連線。

connection, address = socket.accept()

調 用accept方法時,socket會時入「waiting」狀態。客戶請求連線時,方法建立連線並返回伺服器。accept方法返回乙個含有兩個元素的 元組(connection,address)。第乙個元素connection是新的socket物件,伺服器必須通過它與客戶通訊;第二個元素 address是客戶的internet位址。

5. 第五步是處理階段,伺服器和客戶端通過send和recv方法通訊(傳輸 資料)。伺服器呼叫send,並採用字串形式向客戶傳送資訊。send方法返回已傳送的字元個數。伺服器使用recv方法從客戶接收資訊。呼叫recv 時,伺服器必須指定乙個整數,它對應於可通過本次方法呼叫來接收的最大資料量。recv方法在接收資料時會進入「blocked」狀態,最後返回乙個字元 串,用它表示收到的資料。如果傳送的資料量超過了recv所允許的,資料會被截短。多餘的資料將緩衝於接收端。以後呼叫recv時,多餘的資料會從緩衝區 刪除(以及自上次呼叫recv以來,客戶可能傳送的其它任何資料)。

6. 傳輸結束,伺服器呼叫socket的close方法關閉連線

偽**大致如下:

1 建立套接字,繫結套接字到當地位址,然後開始監聽連線。就是socket,bind,listen。

2 進入迴圈,不斷接受客戶端的連線請求,然後接收傳來的資料,當然也可以傳送給對方資料。就是accept乙個連線,然後recv資料。

3 接收完畢可以關閉套接字,close。

ss.socket(socket.af_inet,socket.sock_stram)  

#建立伺服器套接字

ss.bind() 

#把本地位址綁到套接字上

ss.listen() 

#監聽連線

inf_loop: 

#伺服器無限迴圈

cs=ss.accept() 

#接受客戶端的連線

comm._loop: 

#通訊迴圈

cs.recv()/cs.send() #對話

cs.close() 

#關閉客戶套接字

ss.close() 

#關閉伺服器套接字

post = '主機ip'

port = 8899

bufsiz = 1024

addr = (post,port)

tcpsersock = socket(af_inet,sock_stream)

tcpsersock.bind(addr)

tcpsersock.listen(5)

while true:

print 'wait client conncet'

tcpclient,addr =tcpsersock.accept()

print 'connect from ',addr

while true:

data = tcpclient.recv(bufsiz)

if not data:

break

tcpclient.send('[%s] %s' % (ctime(),data))

# tcpclient.close()

tcpsersock.close()

tcp客戶端:

1.  第一步是建立乙個socket以連線伺服器:socket = socket.socket( family, type )

2.  第二步是使用socket的connect方法連線伺服器。對於af_inet家族,連線格式如下:

socket.connect( (host,port) )

host代表伺服器主機名或ip,port代表伺服器程序所繫結的埠號。如連線成功,客戶就可通過套接字與伺服器通訊,如果連線失敗,會引發socket.error異常。

3.  第三步是處理階段,客戶和伺服器將通過send方法和recv方法通訊。

4.  傳輸結束,客戶通過呼叫socket的close方法關閉連線。

偽**如下:

1 建立套接字,然後連線遠端位址,socket ,connect。

2 建立連線之後開始傳送資料。send(data),當然可以從緩衝區讀取伺服器發來的資料。recv(buff)

3 完畢後,關閉套接字。close

cs=socket(socket.af_inet,socket.sock_dgram)

#建立客戶套接字

cs.connect() 

#嘗試連線伺服器

comm._loop: 

#通訊迴圈

cs.send()/cs.recv() #對話

cs.close() 

#關閉套接字

from socket import *;

host = '主機ip'

port = 8899

bufsiz = 1024

addr = (host,port)

tcpclisock = socket(af_inet,sock_stream)

tcpclisock.connect(addr)

while true:

data = raw_input('> ')

if not data:

break

tcpclisock.send(data)

data_rec = tcpclisock.recv(bufsiz)

if not data_rec:

break

print data_rec

post = '210.25.137.230'

port = 8899

bufsiz = 1024

addr = (post,port)

tcpsersock = socket(af_inet,sock_stream)

tcpsersock.bind(addr)

tcpsersock.listen(5)

while true:

print 'wait client conncet'

tcpclient,addr =tcpsersock.accept()

print 'connect from ',addr

while true:

data = tcpclient.recv(bufsiz)

if not data:

break

tcpclient.send('[%s] %s' % (ctime(),data))

# tcpclient.close()

tcpsersock.close()

python網路程式設計 TCP網路程式設計

tcp程式設計 客戶端 import socket 1 套接字 tcp socket socket.socket socket.af inet,socket.sock stream 2 建立鏈結 tcp socket.connect 172.27.35.1 8080 3 傳送資訊 tcp socke...

Python 網路程式設計練習 TCP程式設計

socket是網路程式設計的乙個抽象概念。通常我們用乙個socket表示 開啟了乙個網路鏈結 而開啟乙個socket需要知道目標計算機的ip位址和埠號,再指定協議型別即可。大多數連線都是可靠的tcp連線。建立tcp連線時,主動發起連線的叫客戶端,被動響應連線的叫伺服器。客戶端 do client.p...

Python中網路程式設計之TCP

tcp是一種面向連線的 可靠的 基於位元組流的傳輸層通訊協議,python 實現 伺服器端 步驟見注釋.import socket 網路之間傳輸是二進位制形式的,注意編碼和解碼 建立伺服器 sever socket.socket socket.af inet,socket.sock stream 繫...