Python的學習(三十) ---- socket編程

套接字是爲特定網絡協議(例如TCP/IP,ICMP/IP,UDP/IP等)套件對上的網絡應用程序提供者提供當前可移植標準的對象。它們允許程序接受並進行連接,如發送和接受數據。爲了建立通信通道,網絡通信的每個端點擁有一個套接字對象極爲重要。和大多數語言一樣,Python 支持面向連接和無連接,實現接口功能與步驟也大致相同。

面向連接即需要先連接然後通訊, 面向連接主要協議就是傳輸控制協議(tcp),要創建tcp套接字時需要指定套接字類型爲 SOCK_STRAM,表達了他作爲流套接字的特點。

無連接,顧名思義無需建立連接就可以進行通訊,這時數據到達順序、可靠性就無法保證了。實現這種連接的協議就是用戶數據包協議(udp)。創建UDP時需要指定套接字類型爲 SOCK_DGRAM。

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() #關閉服務器套接字

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() #關閉套接字

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章