網站首頁 編程語言 正文
一、初步認識
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需要發送的內容是二進制碼,故而通過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時關閉端口,退出循環 ? ? 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_INET | AF_INET6 | AF_UNIX |
---|---|---|---|
協議來源 | IPv4 | IPv6 | UNIX |
在創建串口時,可以通過或運算|同時選擇多個地址族。
type為套接字類型,比較常用的有兩種:
-
SOCK_STREAM
,為流式套接字,特點是傳輸與接收順序相同,安全。 -
SOCK_DGRAM
,為數據報格式套接字,特點是快、無順序、可能丟失
proto為協議號,一般為0,當協議族為AF_CAN時,協議應為CAN_RAW, CAN_BCM, CAN_ISOTP
或 CAN_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) |
寫入緩沖區buf | recv_into(buf,bufsize) | recvfrom_into(buf,bufsize) |
get-set
是很多模塊中都會出現的函數名稱,前者代表獲取某種參數,后者代表設置某些參數,一般后者的輸入為前者的輸出。
套接字中止或者關閉的方法有下面幾種:
-
close()
關閉套接字的文件描述符 -
detach()
關閉套接字對象,但并不關閉文件描述符
shutdown(how)可以部分關閉套接字的連接,其中how為:
- SHUT_RD:后續不再允許接收
- SHUT_WR:后續不再允許發送
- SHUT_RDWR:后續的發送和接收都不允許
原文鏈接:https://blog.csdn.net/m0_37816922/article/details/122419972
相關推薦
- 2022-08-06 pythonfor循環中range與len區別_python
- 2023-07-07 @RestController 和 @Controller的區別?
- 2022-09-03 Python?groupby函數圖文詳解_python
- 2022-04-20 為WPF框架Prism注冊Nlog日志服務_實用技巧
- 2022-10-02 Python+OpenCV讀寫視頻的方法詳解_python
- 2024-02-29 UNI-APP頁面跳轉時(uni.navigateTo),參數傳遞
- 2022-05-26 Android?Flutter實現3D動畫效果示例詳解_Android
- 2022-05-26 Python?if?else條件語句形式詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支