Python socket學習筆記(一)
阿新 • • 發佈:2020-07-17
最近在看 Python的視訊,針對socket 程式設計做一個筆記
一、socket是什麼?
socket 通常也稱為“套接字”,用於描述 IP 地址和埠,是一個通訊鏈的控制代碼。應用程式通常通過 “套接字”向網路發出請求或者應答網路請求。說白了,就是一種通訊機制。它類似於公司的電話客服部門,你打電話的時候,那邊會分配一個人回答你的問題,客服部門就相當於 socket 的伺服器端了,打電話的人相當於客戶端了,在和你通話結束前,如果有人在想找和你通話的哪個客服人員,是不可能的,因為你在和他通話,當然客戶部門的電話交換機也不會重複分配。
socket 起源於 Unix,而Unix/Linux 基本哲學之一就是“一切皆檔案”,都可以用 “開啟open ->讀寫 wirte/read -> 關閉 close “模式來操作。 Socket就是該模式的一個實現, socket即時一種特殊的檔案,一些 socket函式就是對其進行操作(讀/寫IO、開啟、關閉)
socket 的工作模式
Socket 伺服器端 程式設計主要包括以下幾步
- 開啟 socket
- 繫結到一個地址和埠
- 偵聽進來的連線
- 接受連線
- 讀取資料
Socket type
socket.AF_UNIX 只能夠用於單一的 Unix 系統程序間通訊
socket.AF_INET 伺服器之間網路通訊
socket.AF_INET6 IPv6
socket.SOCK_STREAM 流式socket,for TCP
socket.SOCK_DGRAM 資料報式socket, for UDP
socket.SOCK_RAW 原始套接字,普通的套接字無法處理ICMP、IGMP等網路報文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文,此外,利用原始套接字,可以通過 IP_HDRINCL套接字選項由使用者構造IP頭
socket.SOCK_RDM 是一種可靠的UDP形式,即保證交付資料報但不保證順序。SOCK_RDM用來提供對原始協議的低階訪問,在需要執行某些特殊操作時使用,如傳送ICMP報文。
SOCK_RAM 通常僅限於高階使用者或管理員執行的程式使用
socket.SOCK_SEQPACKET 可靠的連續資料包服務
Socket 函式
socket(family,type[,protocal]) 使用給定的地址族、套接字型別、協議編號(預設為0)來建立套接字
套接字的例項具有以下方法:
1、s.bind(address) 將套接字繫結到地址。address地址的格式取決於 地址族。 在AF_INET下,以元祖(host,port)的形式表示地址2、s.listen(backlog) 開始監聽傳入連線。backlog指定在拒絕連線之前,作業系統可以掛起的最大連線數量。該值至少為1,大部分應用程式設定為5就可以了。 3、s.connect(address) 連線到address 處額套接字,一般,address的格式為元組(hostname,port),如果連線同一臺機器上的伺服器,可以將hostname 設定為 ‘localhost’. 如果連接出錯,返回 socket.error 錯誤。 4、s.connect_ex(address) 功能與 connect(address) 相同,但是成功返回 0 ,失敗返回 errno 的值。 5、s.accept() 接受連線並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料,address時候連線客戶端的地址。 6、s.close() 關閉套接字。 7、s.fileno() 返回套接字的檔案描述符 8、s.getpeername() 返回套接字的遠端地址。返回值通常是元組(ipaddr,port) 9、s.getsockname() 返回套接字自己的地址。通常是一個元組(ipaddr,port) 10、s.getsockopt(level,optname[,buflen]) 返回套接字選項的值 11、s.gettimeoout() 返回當前超時期的值,單位是秒,如果沒有設定超時期,則返回None 12、s.recv(bufsize [,flag]) 接受套接字的資料。資料以字串形式返回,bufsize 指定要接受的最大資料量。flag 提供有關資訊的其他資訊,通常可以忽略。 13、s.recvfrom(bufsize [,flag]) 與 recv() 類似,但返回值是(data,address)。其中data是包含接收資料的字串,address是傳送資料的套接字地址 14、s.send(string [,flag]) 將 string 中的資料傳送到連線的套接字,返回值是要傳送的位元組數量,該數量可能小於 string 的位元組大小。 15、s.sendall(string [,flag]) 將 string 中的資料傳送到連線的套接字,但在返回之前會嘗試傳送所有資料。成功為None,失敗則丟擲異常 16、s.sendto(string [,flag],address) 將資料傳送給套接字,address是形式為(ipaddr,port)的元組,指定遠端地址。返回值是傳送的位元組數。該函式主要用於UDP協議 17、s.setblocking(flag) 如果flag為0,則將套接字設為非阻塞模式,否則將套接字設定為阻塞模式(預設值)。非阻塞模式下,如果呼叫 recv() 沒有發現任何資料,或 send() 呼叫無法立即傳送資料,那麼將引起 socket.error 異常 18、s.setsocketopt(level,optname,value) 設定給定套接字選項的值 19、s.settimeout(timeout) 設定套接字操作的超時期,timeout 是一個浮點數,單位是秒。值為 None 表示沒有超時期。一般,超時期應該在剛建立套接字的時候後設置,因為他們可能用於連線的操作(如 connect())