1. 程式人生 > >Python使用Socket 進行程序間通訊

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

方法在接收資料時會進入“blocked”狀態,最後返回一個字元 串,用它表示收到的資料。如果傳送的資料量超過了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))