在python的實際應用中,經常需要進行網路程式設計,但是由於python天生的具有物件導向的屬性,使得很多實際的網路程式設計往往是封裝成各種模組的形式呈現,一般使用者可以無需關心具體實現,只需要了解物件的屬性及方法使用即可,但是,個人的理解是,如果能夠對網路程式設計的原理有乙個理解的話,這對於python比較多的模組使用會更加游刃有餘,話不多說,先呈現乙個簡單的client-server/cs結構demo
# 建立乙個服務端
import socket
# 建立乙個服務端
server = socket.socket(socket.af_inet,socket.sock_stream)
server.bind(
('localhost'
,6999))
# 繫結要監聽的埠
server.listen(5)
# 開始監聽 表示可以使用五個鏈結排隊
while
true
:# conn就是客戶端鏈結過來而在服務端為期生成的乙個鏈結例項
conn,addr = server.accept(
)#等待鏈結,多個鏈結的時候就會出現問題,其實返回了兩個值
print
(conn,addr)
while
true
:try
: data = conn.recv(
1024
)# 接收資料
print
('recive:'
,data.decode())
# 列印接收到的資料
conn.send(data.upper())
# 然後再傳送資料
except connectionreseterror as e:
print
('關閉了正在佔線的鏈結!'
)break
conn.close(
)
import socket
# 客戶端 傳送乙個資料,再接收乙個資料
client = socket.socket(socket.af_inet,socket.sock_stream)
# 宣告socket型別,同時生成鏈結物件
client.connect(
('localhost'
,6999))
# 建立乙個鏈結,連線到本地的6969埠
while
true
:# addr = client.accept()
msg =
'hello python!'
client.send(msg.encode(
'utf-8'))
# 傳送一條資訊 python3 只接收btye流
data = client.recv(
1024
)# 接收乙個資訊,並指定接收的大小 為1024位元組
print
('recv:'
,data.decode())
# 輸出我接收的資訊
client.close(
)# 關閉這個鏈結
對於一般使用來說,低階別的網路服務支援基本的 socket,它提供了標準的 bsd sockets api,可以訪問底層作業系統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.sendall()
完整傳送tcp資料,完整傳送tcp資料,將string中的資料傳送到連線的套接字,但在返回之前會嘗試傳送所有資料,成功返回none,失敗則丟擲異常
s.recvfrom()
接收udp資料,與recv()類似,但返回值是(data,address),其中data是包含接收資料的字串,address是傳送資料的套接字位址
s.sendto()
傳送udp資料,將資料傳送到套接字,address是形式為(ipaddr,port)的元組,指定遠端位址,返回值是傳送的位元組數
s.close()
關閉套接字
s.getpeername()
返回連線套接字的遠端位址,返回值通常是元組(ipaddr,port)
s.getsockname()
返回套接字自己的位址,通常是乙個元組(ipaddr,port)
s.setsockopt(level,optname,value)
設定給定套接字選項的值
s.getsockopt(level,optname[.buflen])
返回套接字選項的值
s.settimeout(timeout)
設定套接字操作的超時期,timeout是乙個浮點數,單位是秒,值為none表示沒有超時期;一般,超時期應該在剛建立套接字時設定,因為它們可能用於連線的操作(如connect())
s.gettimeout()
返回當前超時期的值,單位是秒,如果沒有設定超時期,則返回none
s.fileno()
返回套接字的檔案描述符
s.setblocking(flag)
如果flag為0,則將套接字設為非阻塞模式,否則將套接字設為阻塞模式(預設值);非阻塞模式下,如果呼叫recv()沒有發現任何資料,或send()呼叫無法立即傳送資料,那麼將引起socket.error異常
s.makefile()
建立乙個與該套接字相關連的檔案
python網路程式設計基礎
客戶 伺服器架構 伺服器 是乙個軟體或硬體,用於提供客戶需要的 服務 伺服器存在的唯一目的就是等待客戶的請求,給這些客戶服務,然後再等待其他的請求.常見的服務型別 硬體的客戶 伺服器架構 印表機,檔案伺服器 軟體客戶 伺服器架構 web伺服器,資料庫伺服器,視窗伺服器 gui 套接字 用於程序間通訊...
python 網路程式設計基礎
python實在是太方便,太易用了,三方庫的支援又全,語法又簡單,對開發人員來說,實在是居家旅行,x的必備利器。週末研究了下python的網路支援,做一下記錄,以備隨後翻閱。python支援bsd的socket進行網路程式設計,其api跟c中的大同小異,先看看tcp方式的,說到網路程式設計,肯定會設...
python網路程式設計基礎
目錄 標籤 空格分隔 網路程式設計 目錄tcp和udp tcp的使用是面向連線的,即資料的傳輸必須基於虛鏈路的完整建立。虛鏈路的建立提供了很多優秀的功能,比如確認重傳以保證資料的完整性,滑動視窗以保證資料傳輸的高效性,各類選項字段提供不同的可選功能。tcp的缺點是報頭大,因為需要包含比udp更多的功...