套接字家族的名字:af_unix
unix一切皆檔案,基於檔案的套接字呼叫的就是底層的檔案系統來取資料,兩個套接字程序執行在同一機器,可以通過訪問同乙個檔案系統間接完成通訊
套接字家族的名字:af_inet
(還有af_inet6被用於ipv6,還有一些其他的位址家族,不過,他們要麼是只用於某個平台,要麼就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有位址家族中,af_inet是使用最廣泛的乙個,python支援很多種位址家族,但是由於我們只關心網路程式設計,所以大部分時候我麼只使用af_inet)
乙個生活中的場景。你要打**給乙個朋友,先撥號,朋友聽到**鈴聲後提起**,這時你和你的朋友就建立起了連線,就可以講話了。等交流結束,結束通話**結束此次交談。 生活中的場景就解釋了這工作原理。
先從伺服器端說起。伺服器端先初始化socket,然後與埠繫結(bind),對埠進行監聽(listen),呼叫accept阻塞,等待客戶端連線。在這時如果有個客戶端初始化乙個socket,然後連線伺服器(connect),如果連線成功,這時客戶端與伺服器端的連線就建立了。客戶端傳送資料請求,伺服器端接收請求並處理請求,然後把回應資料傳送給客戶端,客戶端讀取資料,最後關閉連線,一次互動結束
socket()模組函式用法
import socket
socket.socket(socket_family,socket_type,protocal=0)
#socket_family 可以是 af_unix 或 af_inet。socket_type 可以是 sock_stream 或 sock_dgram。protocol
# 一般不填,預設值為 0。
#獲取tcp/ip套接字
tcpsock = socket.socket(socket.af_inet, socket.sock_stream)
#獲取udp/ip套接字
udpsock = socket.socket(socket.af_inet, socket.sock_dgram)
#由於 socket 模組中有太多的屬性。我們在這裡破例使用了'from module import *'語句。
# 使用 'from socket import *',我們就把 socket 模組裡的所有屬性都帶到我們的命名空間裡了,這樣能 大幅減短我們的**。
#例如tcpsock = socket(af_inet, sock_stream
服務端套接字函式s.bind() 繫結(主機,埠號)到套接字
s.listen() 開始tcp監聽
s.accept() 被動接受tcp客戶的連線,(阻塞式)等待連線的到來
客戶端套接字函式
s.connect() 主動初始化tcp伺服器連線
s.connect_ex() connect()函式的擴充套件版本,出錯時返回出錯碼,而不是丟擲異常
公共用途的套接字函式
s.recv() 接收tcp資料
s.send() 傳送tcp資料(send在待傳送資料量大於己端快取區剩餘空間時,資料丟失,不會發完)
s.sendall() 傳送完整的tcp資料(本質就是迴圈呼叫send,sendall在待傳送資料量大於己端快取區剩餘空間時,資料不丟失,迴圈呼叫send直到發完)
s.recvfrom() 接收udp資料
s.sendto() 傳送udp資料
s.getpeername() 連線到當前套接字的遠端的位址
s.getsockname() 當前套接字的位址
s.getsockopt() 返回指定套接字的引數
s.setsockopt() 設定指定套接字的引數
s.close() 關閉套接字
面向鎖的套接字方法s.setblocking() 設定套接字的阻塞與非阻塞模式
s.settimeout() 設定阻塞套接字操作的超時時間
s.gettimeout() 得到阻塞套接字操作的超時時間
面向檔案的套接字的函式
s.fileno() 套接字的檔案描述符
s.makefile() 建立乙個與該套接字相關的檔案
tcp是基於鏈結的,必須先啟動服務端,然後再啟動客戶端去鏈結服務端
服務端:
# 服務端應該滿足的特點:
# 1、一直提供服務
# 2、併發地提供服務
import socket
# 1、買手機
phone=socket.socket(socket.af_inet,socket.sock_stream) # 流式協議=》tcp協議
# 2、繫結手機卡
phone.bind(('127.0.0.1',8080)) # 0-65535, 1024以前的都被系統保留使用
# 3、開機
phone.listen(5) # 5指的是半連線池的大小
print('服務端啟動完成,監聽位址為:%s:%s' %('127.0.0.1',8080))
# 4、等待**連線請求:拿到**連線conn
# 加上鏈結迴圈
while true:
conn,client_addr=phone.accept()
# 5、通訊:收\發訊息
while true:
try:
data=conn.recv(1024) # 最大接收的資料量為1024bytes,收到的是bytes型別
if len(data) == 0:
# 在unix系統洗,一旦data收到的是空
break
print("客戶端發來的訊息:",data.decode('utf-8'))
conn.send(data.upper())
except exception:
# 針對windows系統
break
# 6、關閉**連線conn(必選的**資源的操作)
conn.close()
# 7、關機(可選操作)
phone.close()
客戶端:
import socket
#1、買手機
phone=socket.socket(socket.af_inet,socket.sock_stream) # 流式協議=》tcp協議
#2、撥通服務端**
phone.connect(('127.0.0.1',8080))
#3、通訊
while true:
msg=input("輸入要傳送的訊息》: ").strip() #msg=''
if len(msg) == 0:continue
phone.send(msg.encode('utf-8'))
print('*****=?')
data=phone.recv(1024)
print(data.decode('utf-8'))
#4、關閉連線(必選的**資源的操作)
phone.close()
服務端:
import socket
server=socket.socket(socket.af_inet,socket.sock_dgram) # 資料報協議=》udp協議
server.bind(('127.0.0.1',8081))
while true:
data,client_addr=server.recvfrom(1024)
server.sendto(data.upper(),client_addr)
server.close()
客戶端:
import socket
client=socket.socket(socket.af_inet,socket.sock_dgram) # 流式協議=》tcp協議
while true:
msg=input('>>>: ').strip()
client.sendto(msg.encode('utf-8'),('127.0.0.1',8081))
res=client.recvfrom(1024)
print(res)
client.close()
套接字通訊
利用三元組 ip位址,協議,埠 就可以標識網路的程序 socket即是一種特殊的檔案,一些socket函式就是對其進行的操作 讀 寫io 開啟 關閉 socket是 open write read close 模式的一種實現,那麼socket就提供了這些操作對應的函式介面 tcp通訊中的socket...
socket 套接字通訊
要通過internet進行通訊,至少需要一對套接字,其中乙個執行在客戶端,稱之為clientsocket,另乙個執行於伺服器端面,稱為serversocket。根據連線啟動的方式以及本地要連線的目標,套接字之間的連線過程可以分為三個步驟 伺服器監聽 客戶端請求 連線確認。伺服器監聽是指服務端套接字並...
Python socket套接字通訊
socket是乙個模組,又稱套接字,用來封裝 網際網路協議 應用層以下的層 socket可以實現網際網路協議 應用層以下的層 的工作,提高開發效率。import socket 寫socket套接字 使用如下 client.py 啟動服務端後再啟動客戶端 import socket 1.買手機 cli...