python套接字socket通信
一、初步認識
socket
被翻譯成套接字,盡管有些人詬病,但我覺得還挺貼切的。其功能是提供低級別的網(wǎng)絡(luò)服務(wù),最常用的就是根據(jù)IP來傳輸數(shù)據(jù)。
所謂傳輸,就要有兩個“端”,首先做一個服務(wù)端
import socket s = socket.socket() host = socket.gethostname() #本機地址 ?? port = 12345 ? ? ? ? ? ? ? ?#端口 s.bind((host,port)) ? ? ? ? #綁定端口 s.listen(3) ? ? #開始監(jiān)聽,最多支持三個鏈接 while True: ? ? c, addr = s.accept() ? ?#等待連接 ? ? print("Linked @ Addr",addr) ? ? break #下面為發(fā)送命令 while True: ? ? data = input("input data:") ? ? c.send(data.encode("utf8")) ? ? if data=="exit": ? ? ? ? c.close() ? ? ? ? break
需要注意的是,send需要發(fā)送的內(nèi)容是二進制碼,故而通過encode
和decode
來編解碼。最后如果輸入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時關(guān)閉端口,退出循環(huán) ? ? if data[:4]=="exit": ? ? ? ? s.close() ? ? ? ? break
運行之后,服務(wù)端和客戶端的輸入輸出分別為
#服務(wù)端 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
創(chuàng)建了一個socket對象,其完整的構(gòu)造函數(shù)為
socket.socket(family=AF_INET, type=SOCK_STREAM,proto=0,fileno=None)
其中,family表示套接字的地址族,主要包括三類
地址族 | AF_INET | AF_INET6 | AF_UNIX |
---|---|---|---|
協(xié)議來源 | IPv4 | IPv6 | UNIX |
在創(chuàng)建串口時,可以通過或運算|同時選擇多個地址族。
type為套接字類型,比較常用的有兩種:
SOCK_STREAM
,為流式套接字,特點是傳輸與接收順序相同,安全。SOCK_DGRAM
,為數(shù)據(jù)報格式套接字,特點是快、無順序、可能丟失
proto為協(xié)議號,一般為0,當協(xié)議族為AF_CAN時,協(xié)議應(yīng)為CAN_RAW, CAN_BCM, CAN_ISOTP
或 CAN_J1939
。
fileno代表一個創(chuàng)建socket
的文件。
盡管構(gòu)造函數(shù)并無聲明客戶端與服務(wù)端的參數(shù),但從功能來看,二者所能夠調(diào)用的成員應(yīng)該并不完全相同。
其中,bind,listen,accept這三個方法為服務(wù)端的專有方法,其功能分別為
- bind(address):將其綁定到某個地址,其中地址address一般為一個元組,包括IP和端口號
- listen(N):啟動一個服務(wù)器用于接受連接,N為最多連接個數(shù),不小于0。
- accept():接受一個連接,無參數(shù),返回值是(conn, address)元組,conn是一個新的socket對象,用于收發(fā)數(shù)據(jù)。
相應(yīng)地,客戶端也有兩個專用的方法:
- connect(address):連接某個地址。
- connect_ex(address):和connect相比,當出現(xiàn)錯誤時返回錯誤碼,而不報錯。
接下來是客戶端和服務(wù)端均可使用的方法,其中最關(guān)鍵的就是發(fā)送send和接收recv。
其中,與發(fā)送相關(guān)的函數(shù)有:
- send(bytes):其中bytes為發(fā)送字節(jié),返回已發(fā)送的字節(jié)(有的時候可能并沒有發(fā)完)。
- sendall(bytes):和send相比,會持續(xù)發(fā)送bytes,直到所有數(shù)據(jù)都已發(fā)送或者報錯。
- sendfile(file,offset=0,count=None):在Unix下發(fā)送文件,在Windows下和send相同,相當于是不可用的。
- sendto(bytes,addresss):指定地址發(fā)送數(shù)據(jù)。
在Windows中可用的接收相關(guān)函數(shù)有兩組,其中bufsize表示接收數(shù)據(jù)的最大字節(jié)數(shù)。
返回數(shù)據(jù) | 返回數(shù)據(jù)+接收端地址 | |
---|---|---|
不寫入緩沖區(qū) | recv(bufsize) | recvfrom(bufsize) |
寫入緩沖區(qū)buf | recv_into(buf,bufsize) | recvfrom_into(buf,bufsize) |
get-set
是很多模塊中都會出現(xiàn)的函數(shù)名稱,前者代表獲取某種參數(shù),后者代表設(shè)置某些參數(shù),一般后者的輸入為前者的輸出。
套接字中止或者關(guān)閉的方法有下面幾種:
close()
關(guān)閉套接字的文件描述符detach()
關(guān)閉套接字對象,但并不關(guān)閉文件描述符
shutdown(how)可以部分關(guān)閉套接字的連接,其中how為:
- SHUT_RD:后續(xù)不再允許接收
- SHUT_WR:后續(xù)不再允許發(fā)送
- SHUT_RDWR:后續(xù)的發(fā)送和接收都不允許
到此這篇關(guān)于python套接字socket通信的文章就介紹到這了,更多相關(guān)python socket通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
最新解決'nvidia-smi' 不是內(nèi)部或外部命令也不是可運行的程序
使用cmd查看電腦顯卡的信息,調(diào)用nvidia-smi查看顯卡使用情況報錯,提示'nvidia-smi' 不是內(nèi)部或外部命令,也不是可運行的程序,本文給大家分享完美解決方案,感興趣的朋友跟隨小編一起看看吧2023-01-01關(guān)于pip install uwsgi安裝失敗問題的解決方案
這篇文章主要介紹了關(guān)于pip install uwsgi安裝失敗問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06Python數(shù)據(jù)解析之BeautifulSoup4的用法詳解
Beautiful?Soup?是一個可以從?HTML?或?XML?文件中提取數(shù)據(jù)的?Python?庫,這篇文章主要來和大家介紹一下BeautifulSoup4的用法,需要的可以參考一下2023-06-06