Python 網路程式設計初步

2021-06-27 08:24:06 字數 3783 閱讀 3392

一、套接字

套接字是為特定網路協議(例如tcp/ip,icmp/ip,udp/ip等)套件對上的網路應用程式提供者提供當前可移植標準的物件。它們允許程式接受並進行連線,如傳送和接受資料。為了建立通訊通道,網路通訊的每個端點擁有乙個套接字物件極為重要。

套接字為bsd unix系統核心的一部分,而且他們也被許多其他類似unix的作業系統包括linux所採納。許多非bsd unix系統(如ms-dos,windows,os/2,mac os及大部分主機環境)都以庫形式提供對套接字的支援。

三種最流行的套接字型別是:stream,datagram和raw。stream和datagram套接字可以直接與tcp協議進行介面,而raw套接字則介面到ip協議。但套接字並不限於tcp/ip。

二、套接字模組

套接字模組是乙個非常簡單的基於物件的介面,它提供對低層bsd套接字樣式網路的訪問。使用該模組可以實現客戶機和伺服器套接字。要在python 中建立具有tcp和流套接字的簡單伺服器,需要使用socket模組。利用該模組包含的函式和類定義,可生成通過網路通訊的程式。一般來說,建立伺服器連線需要六個步驟。

1)建立socket物件。呼叫socket建構函式。

socket = socket.socket(familly,type)

family的值可以是af_unix(unix域,用於同一臺機器上的程序間通訊),也可以是af_inet(對於ipv4協議的tcp和 udp),至於type引數,sock_stream(流套接字)或者 sock_dgram(資料報文套接字),sock_raw(raw套接字)。

2)將socket繫結(指派)到指定位址上

socket.bind(address)

address必須是乙個雙元素元組,((host,port)),主機名或者ip位址+埠號。如果埠號正在被使用或者保留,或者主機名或ip位址錯誤,則引發socke.error異常。

3)繫結後,必須準備好套接字,以便接受連線請求。

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 / recv

伺服器呼叫send,並採用字串形式向客戶傳送資訊。send方法返回已傳送的字元個數。

伺服器使用recv,從客戶接受資訊。呼叫recv時,必須指定乙個整數來控制本次呼叫所接受的最大資料量。

recv方法在接受資料時會進入'blocket'狀態,最後返回乙個字串,用它來表示收到的資料。如果傳送的量超過recv所允許,資料會被截斷。多餘的資料將緩衝於接受端。以後呼叫recv時,多餘的資料會從緩衝區刪除。

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

close

建立乙個簡單客戶連線則需要4個步驟。

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

第2步,使用socket的connect方法連線伺服器 socket.connect((host,port))

第3步,客戶和伺服器通過send和recv方法通訊。

第4步,結束後,客戶通過呼叫socket的close方法來關閉連線。

三、簡單例子

伺服器:

import

sockets=

socket.socket()

s.bind((

'***.***.***.***

',***x))    

#ip位址和埠號

s.listen(5 )

cs,address 

= s.accept()

print

'got connected from

' ,address

cs.send(

'byebye' )

ra=cs.recv(

512 )

print

racs.close()

客戶端:

import

sockets=

socket.socket()

s.connect((

'***.***.***.***

',***x))   

#與伺服器程式ip位址和埠號相同

data

=s.recv(

512 )

s.send(

'hihi' )

s.close()

print

'the data received is

',data

執行:在本機測試(windows環境下,可以將ip位址改為本機ip,埠號在1024以上,windows將1024以下的為保留),執行--cmd--進入命令列模式

先python 伺服器程式,後python 客戶端程式即可。

或者啟動伺服器程式後,用telnet ip位址 埠號,也可以得到同樣結果。

讓server持續接受連線

server.py

import

sockets=

socket.socket()

s.bind((

'192.168.43.137',

2000

))s.listen(5 )

while1 :

cs,address 

= s.accept()

print

'got connected from

' ,address

cs.send(

'hello i am server,welcome' )

ra=cs.recv(

512 )

print

racs.close()

測試兩個乙個程式中兩個socket並存是否可行

client.py

import

sockets=

socket.socket()

s.connect((

'192.168.43.137',

2000

))   

data

=s.recv(

512 )

print

'the data received is\n    

' ,data

s.send(

'hihi i am client' )

sock2 

= socket.socket()

sock2.connect((

'192.168.43.137',

2000

))data2

=sock2.recv(

512 )

print

'the data received from server is\n   

' ,data2

sock2.send(

'client send use sock2' )

sock2.close()

s.close()

python程式設計初步 Python程式設計學習初步

python控制語句 1 選擇語句 if 最簡單的二選一,if後跟布林表示式,為true,執行true下的語句,為fail,執行fail下的語句 if booleanexpression suite of python statement rest of the python program 基本的...

網路程式設計初步認識(一)

1 socket是連線應用程式與網路驅動程式的橋梁,socket在應用程式中建立,通過繫結操作與驅動程式建立關係。應用程式送給socket的資料,由socket交給驅動程式,驅動程式向網路傳送出去。計算機從網路上收到與該socket繫結的ip位址和埠號相關的資料後,由驅動程式交給socket,應用程...

Python程式設計學習初步

python控制語句 1 選擇語句 if 最簡單的二選一,if後跟布林表示式,為true,執行true下的語句,為fail,執行fail下的語句 if booleanexpression suite of python statement rest of the python program 基本的...