Python中建立基礎Socket通訊(Python Socket Programming)

為了要讓不同電腦的程式可以彼此做溝通,因此我們或需要為程式建立一個通訊的方式。其中有一種通訊方式是比較簡易,socket[1],我們可以使用python中socket相關通訊函式來建立簡易的通訊系統,對於之後要拿來結合其他程式或是系統時提供更加便利的操作與控制。

常用指令
  • socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
    1. family 的部分是指往「網際網路通訊協定」的版本。
      • AF_INET(預設):  IPv4[2]
      • AF_INET6[3]:  IPv6、IPv4
    2. type的部分是在設定通訊傳遞的方式。
      在通訊時有兩種方式是常會被使用的 TCP [4]與UDP[5],兩者的差異我的理解是TCP會在接收端接到資訊後會回傳一個訊號給發送端做接收到訊號的錯誤檢查,相反的,UDP則不會做糾正的檢查。因此UDP比較常用在對時間要求高於丟棄封包的要求時的情況。socket() 中對於兩者的呼叫如以下所列
      • TCP:  socket.SOCK_STREAM
      • UDP:  socket.SOCK_DGRAM
  • socket.bind(address) 設定通訊的IP位置與通訊埠用。
  • socket.listen([backlog]) 設定可以通訊的數量。
  • socket.accept() 接收被連線後的對方(發送端)的資料,此處會回傳兩個項目,conn 與address
    1. Conn 是過來的訊息數據。
    2. Address 則是對方的IP資料。
  • socket.connect(address) 連線到()內設定的IP位置與通訊埠用。當通訊中斷時,會進入「等待」的狀態。
  • socket.send(bytes[, flags]) 傳送訊息。發送後會透過回傳回來的字節數判斷是否有遺漏少傳的情況,如果有少傳送則需要再編寫程式時加入重傳的判斷式子。
  • socket.sendall(bytes[, flags]) 傳送訊息。發送後會透過回傳回來的字節數判斷是否有遺漏少傳的情況,如果有少傳送則會嘗試傳送剩下的訊息資料。與send的指令不同的地方在於sendall會自動嘗試將所有的數據都傳送出去,而send則需要使用者另外在程式中建立重傳的機制。
  • socket.sendfile(file, offset=0, count=None) 傳送文件中的資料。
  • socket.recv(bufsize[, flags]) 接收發送端傳遞過來的資訊,後面()中的部分是設定一次可以接收的最大數量用。
  • socket.shutdown (how) 關閉通訊,其中有兩種模式
    1. SHUT_RD: 不再允許接收。
    2. SHUT_WR: 不再允許發送。
  • socket.close() 釋放與連接相關聯的資源。如需要立即的停止通訊的連線,則要在使用close()前先使用shutdown()的指令。
使用範例:

建立一個sever與client,啟動後client會先傳遞訊息 Send Test至server後,server會將訊號回傳回來,因為有設定傳遞一次,因此傳送一次後,client就會結束,而結束前因為client會傳送一個空的訊息,因此在server端中建立一個判斷的機制,當接收到的訊號為空訊息後就會結束程式。

參考資料
[1] Socket
[2] IPv4 wiki
[3] IBM 介紹 Using AF_INET6 address family
[4] TCP wiki
[5] UDP wiki

コメント

タイトルとURLをコピーしました