socket
1.定義:
socket又稱為“套接字”,應用程序通常通過套接字向網絡發去請求,或者應答網絡請求,使主機之間或者一台計算機中的進程可以通訊。
2.創建:
創建套接字
1 import socket 2 3 my_socket = socket.socket(family=AF_INIT, type=SOCK_STREAM, proto=0, fileno=None)
【參數】family:AF_INIT(IPv4地址族, 默認)
AF_INET6(IPv6地址族)
AF_UNIX(Unix地址族)
AF_CAN(CAN總線)
AF_RDS(汽車等移動收音)
type:SOCK_STREAM(流服務,默認,傳輸層TCP)
SOCK_DGRAM(數據包,傳輸層UDP)
SOCK_RAW(原始套接字,用來自行組裝數據包)
proto:一般不填寫,默認為0
當family=AF_CAN, proto則為CAN_RAW或者CAN_BCM
返回值:<class 'socket.socket'>
3.socket對象方法:
my_socket.bind(address, port):將套接字綁定到地址,address格式取決於地址族。AF_INET下,以(host, port)元組(host為str格式,port為int格式,組成元組)表示。address一般寫空字符串,監聽任意IP地址,后面端口自己設置,監聽所有自己設置端口的任意IP地址發送的請求連接。
my_socket.listen(backlog):啟動服務器以接收連接。backlog為拒絕連接之前可連接的最大數量,至少為0
# backlog 代表着有多少個已經建立的但是沒有被 accept 取走的連接數量。
另外,有個內核參數 net.core.somaxconn 定義了 socket 同時 listen 的最大連接數,所以 socket.listen() 指定的值不能超過 net.core.somaxconn。
# (不常用)my_socket.setblocking(bool):默認值為True,如果設置False,recv()或者accept()無數據,則報錯
my_socket.accept():服務器接收客戶端連接。返回(cli_connect_address, port) # cli_connect_socket:client_connect_socket:客戶端套接字,
# (不常用)socket.gethostname():返回python解釋器當前運行的主機名
cli_socket.connect(address):客戶端連接服務器。address格式取決於地址族。默認以address = (hostname, post),hostname為本機主機名,post為代連接服務器端口。
cli_socket.connect_ex(address):同上。只不過會有返回值。連接失敗返回0,成功返回編碼
my_socket.close()/cli_socket.close():關閉套接字。
s_cli_socket.recv(buffersize, flag):接收套接字數據。返回字符串,buffersize為最多接收的數量。
s_cli_socket.recvfrom(buffersize, flag):同上。返回(data, address),address為與之連接的地址。flag可省略。
s_cli_socket.send(string, flag):服務器接收連接后,向客戶端發送數據。string可以為空。
sk.sendall(string, flag):向客戶端發送全部數據。內部遞歸調用send(),成功返回None,失敗拋出異常
sk.sendto(string[,flag],address):將數據發送到套接字,address是形式為(ipaddr,port)的元組,指定遠程地
址。返回值是發送的字節數。該函數主要用於UDP協議。
sk.settimeout(timeout):設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時
期。一般,超時期應該在剛創建套接字時設置,因為它們可能用於連接的操作(如 client 連接最多等待5s )
sk.getpeername():返回連接套接字的遠程地址。返回值通常是元組(ipaddr,port)。
sk.getsockname():返回套接字自己的地址。通常是一個元組(ipaddr,port)
sk.fileno():套接字的文件描述符
se_socket.setsockopt(level, optname, value):設置給定套接字選項的值。level定義那個選項將被使用,通常為
SOL_SOCKET(正在使用的socket選項);當level=SOL_SOCK時,optname為下列值:
選項 | 定義 | 值 |
SO_BINDTODEVICE | 可以使socket只在某個特殊的網絡接口(網卡)有效。也許不能是移動便攜設備 | 一個字符串給出設備的名稱或者一個空字符串返回默認值 |
SO_BROADCAST | 允許廣播地址發送和接收信息包。只對UDP有效。如何發送和接收廣播信息包 | 布爾型整數 |
SO_DONTROUTE | 禁止通過路由器和網關往外發送信息包。這主要是為了安全而用在以太網上UDP通信的一種方法。不管目的地址使用什么IP地址,都可以防止數據離開本地網絡 | 布爾型整數 |
SO_KEEPALIVE | 可以使TCP通信的信息包保持連續性。這些信息包可以在沒有信息傳輸的時候,使通信的雙方確定連接是保持的 | 布爾型整數 |
SO_OOBINLINE | 可以把收到的不正常數據看成是正常的數據,也就是說會通過一個標准的對recv()的調用來接收這些數據 | 布爾型整數 |
SO_REUSEADDR | 當socket關閉后,本地端用於該socket的端口號立刻就可以被重用。通常來說,只有經過系統定義一段時間后,才能被重用。 | 布爾型整數 |
ser_socket.getsockopt(level, optname, [buflen]):返回套接字選項的值(bytes)。
ser_socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None):創建一個與該套接字相關聯的文件,且該套接字必須處於阻塞模式,mode取值與內置的open()函數相同。