中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python套接字socket通信在實現

發布時間:2022-04-01 11:06:21 來源:億速云 閱讀:154 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“python套接字socket通信在實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“python套接字socket通信在實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、初步認識

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是很多模塊中都會出現的函數名稱,前者代表獲取某種參數,后者代表設置某些參數,一般后者的輸入為前者的輸出。

python套接字socket通信在實現

套接字中止或者關閉的方法有下面幾種:

  • close()關閉套接字的文件描述符

  • detach()關閉套接字對象,但并不關閉文件描述符

shutdown(how)可以部分關閉套接字的連接,其中how為:

  • SHUT_RD:后續不再允許接收

  • SHUT_WR:后續不再允許發送

  • SHUT_RDWR:后續的發送和接收都不允許

讀到這里,這篇“python套接字socket通信在實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高雄市| 松潘县| 恭城| 平乡县| 太康县| 潜江市| 修文县| 洪雅县| 永州市| 黄梅县| 汤原县| 呼玛县| 巩留县| 新郑市| 元氏县| 曲靖市| 休宁县| 扎囊县| 平遥县| 鹤山市| 云龙县| 平定县| 漯河市| 桐梓县| 定襄县| 湖州市| 如东县| 济宁市| 宁强县| 马关县| 绥阳县| 嘉峪关市| 定西市| 南木林县| 聂拉木县| 竹北市| 隆德县| 望谟县| 驻马店市| 孝义市| 当雄县|