Python使用Socket 進行程序間通訊
毫無關係的兩個程序要通訊,使用socket是比較穩妥的方法。Socket 程序間通訊主要分為 Client 端和 Server 端。Server 端主要是監聽 socket請求,而 Client 端主要是傳送請求,等待 Server 端的回覆。
Server 端:
首先需要 socket 庫: import socket
Instantiate 一個 socket 例項:sock = socket.socket ( socket.AF_UNIX, socket.SOCK_STREAM )
- 在 socket( ) 方法需要定義 1. socket 使用的環境, 因為是同一個系統下程序的通訊,所以使用標識AF_UNIX。 2. 指定套接字型別,一般我們用 SOCK_STREAM(流套接字)。
第二步是將 socket 繫結到指定地址。這是通過socket物件的bind方法來實現的:socket.bind( address )
- 如果標識為AF_UNIX,地址只需要是localhost 就行了。不需要特別指定埠號。由AF_INET所建立的套接字,address地址必須是一個雙元素元組,格式是 (host,port)
第三步是使用socket套接字的listen方法接收連線請求:socket.listen( backlog )
-backlog指定最多允許多少個客戶連線到伺服器。它的值至少為1。收到連線請求後,這些請求需要排隊,如果佇列滿,就拒絕請求。
第四步是伺服器套接字通過socket的accept方法等待客戶請求一個連線:connection, address = socket.accept()
-調 用accept方法時,socket會時入“waiting”狀態。客戶請求連線時,方法建立連線並返回伺服器。accept方法返回一個含有兩個元素的 元組(connection,address)。第一個元素connection是新的socket物件,伺服器必須通過它與客戶通訊;第二個元素 address是客戶的Internet地址。
第五步是處理階段,伺服器和客戶端通過 send 和 recv 方法通訊(傳輸 資料)。伺服器呼叫send,並採用字串形式向客戶傳送資訊。send 方法返回已傳送的字元個數。伺服器使用recv方法從客戶接收資訊。呼叫recv 時,伺服器必須指定一個整數,它對應於可通過本次方法呼叫來接收的最大資料量。recv
Client 端:
一,建立一個socket以連線伺服器:sock = socket.socket ( socket.AF_UNIX, socket.SOCK_STREAM )
二,使用socket的connect方法連線伺服器:socket.bind( address )
三,處理階段,客戶和伺服器將通過send方法和recv方法通訊。
無論是 Client 還是 Server 都需要在傳輸結束後,通過呼叫socket的close方法關閉連線。
注意:
Running an example several times with too small delay between executions, couldlead to this error:
socket.error: [Errno 98] Address already in use
This is because the previous execution has left the socket in a TIME_WAITstate, and can’t be immediately reused.
There is a socket flag to set, in order to prevent this,socket.SO_REUSEADDR:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT))