首頁 > 軟體

python通訊端socket通訊

2022-04-01 13:02:55

一、初步認識

socket被翻譯成通訊端,儘管有些人詬病,但我覺得還挺貼切的。其功能是提供低階別的網路服務,最常用的就是根據IP來傳輸資料。

所謂傳輸,就要有兩個“端”,首先做一個伺服器端

import socket
s = socket.socket()
host = socket.gethostname() #本機地址   
port = 12345                #埠
s.bind((host,port))         #繫結埠
s.listen(3)     #開始監聽,最多支援三個連結
while True:
    c, addr = s.accept()    #等待連線
    print("Linked @ Addr",addr)
    break

#下面為傳送命令
while True:
    data = input("input data:")
    c.send(data.encode("utf8"))
    if data=="exit":
        c.close()
        break

需要注意的是,send需要傳送的內容是二進位制碼,故而通過encodedecode來編解碼。最後如果輸入exit則退出。

然後寫一個使用者端

import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.connect((host,port))
while True:
    data = s.recv(1024).decode("utf8")
    if data!=b'':
        print("receive data:", data)
    # 當接收到exit時關閉埠,退出迴圈
    if data[:4]=="exit":
        s.close()
        break

執行之後,伺服器端和使用者端的輸入輸出分別為

#伺服器端
Linked @ Addr ('192.168.1.113', 9953)
input data:hello world
11
input data:who are you
11
input data:can u speak chinese?
20
input data:exit

#使用者端
receive data: hello world
receive data: who are you
receive data: can u speak chinese?
receive data: exit

二、socket物件

在上例中,通過socket.socket建立了一個socket物件,其完整的建構函式為

socket.socket(family=AF_INET, type=SOCK_STREAM,proto=0,fileno=None)

其中,family表示通訊端的地址族,主要包括三類

地址族AF_INETAF_INET6AF_UNIX
協定來源IPv4IPv6UNIX

在建立串列埠時,可以通過或運算|同時選擇多個地址族。

type為通訊端型別,比較常用的有兩種:

  • SOCK_STREAM,為流式通訊端,特點是傳輸與接收順序相同,安全。
  • SOCK_DGRAM,為資料包格式通訊端,特點是快、無順序、可能丟失

proto為協定號,一般為0,當協定族為AF_CAN時,協定應為CAN_RAW, CAN_BCM, CAN_ISOTPCAN_J1939

fileno代表一個建立socket的檔案。

儘管建構函式並無宣告使用者端與伺服器端的引數,但從功能來看,二者所能夠呼叫的成員應該並不完全相同。

其中,bind,listen,accept這三個方法為伺服器端的專有方法,其功能分別為

  • bind(address):將其繫結到某個地址,其中地址address一般為一個元組,包括IP和埠號
  • listen(N):啟動一個伺服器用於接受連線,N為最多連線個數,不小於0。
  • accept():接受一個連線,無引數,返回值是(conn, address)元組,conn是一個新的socket物件,用於收發資料。

相應地,使用者端也有兩個專用的方法:

  • connect(address):連線某個地址。
  • connect_ex(address):和connect相比,當出現錯誤時返回錯誤碼,而不報錯。

接下來是使用者端和伺服器端均可使用的方法,其中最關鍵的就是傳送send和接收recv。

其中,與傳送相關的函數有:

  • send(bytes):其中bytes為傳送位元組,返回已傳送的位元組(有的時候可能並沒有發完)。
  • sendall(bytes):和send相比,會持續傳送bytes,直到所有資料都已傳送或者報錯。
  • sendfile(file,offset=0,count=None):在Unix下傳送檔案,在Windows下和send相同,相當於是不可用的。
  • sendto(bytes,addresss):指定地址傳送資料。

在Windows中可用的接收相關函數有兩組,其中bufsize表示接收資料的最大位元組數。

 返回資料返回資料+接收端地址
不寫入緩衝區recv(bufsize)recvfrom(bufsize)
寫入緩衝區bufrecv_into(buf,bufsize)recvfrom_into(buf,bufsize)

get-set是很多模組中都會出現的函數名稱,前者代表獲取某種引數,後者代表設定某些引數,一般後者的輸入為前者的輸出。

通訊端中止或者關閉的方法有下面幾種:

  • close()關閉通訊端的檔案描述符
  • detach()關閉通訊端物件,但並不關閉檔案描述符

shutdown(how)可以部分關閉通訊端的連線,其中how為:

  • SHUT_RD:後續不再允許接收
  • SHUT_WR:後續不再允許傳送
  • SHUT_RDWR:後續的傳送和接收都不允許

 到此這篇關於python通訊端socket通訊的文章就介紹到這了,更多相關python  socket通訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com