socket(套接字)
阿新 • • 發佈:2020-08-14
目錄
socket(套接字)
socket簡稱(套接字) 是程序間通訊的一種方式,它與其他程序間通訊的一個主要不同是:
它能實現不同主機間的程序通訊,我們網路上各種服務大多都是基於socket完成通訊的
網頁,微信,email
socket()模組函式用法
1 import socket 2 socket.socket(socket_family,socket_type,protocal=0) 3 socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,預設值為 0。 4 5 獲取tcp/ip套接字 6 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 7 8 獲取udp/ip套接字 9 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 10 11 由於 socket 模組中有太多的屬性。我們在這,,裡破例使用了'from module import *'語句。使用 'from socket import *',我們就把 socket 模組裡的所有屬性都帶到我們的名稱空間裡了,這樣能 大幅減短我們的程式碼。 12 例如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套接字
server
import socket # 1、買手機 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # SOCK_STREAM=》TCP協議 # 2、插手機卡 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加 phone.bind(("127.0.0.1", 8080)) # 本地迴環 # 3、開機 phone.listen(5) print('starting %s:%s' %("127.0.0.1", 8080)) # 4、等電話連結=>連結迴圈 while True: conn, client_addr = phone.accept() print(client_addr) # 5、收/發訊息=>通訊迴圈 while True: try: data = conn.recv(1024) # 最大接收的位元組個數 if len(data) == 0: # 針對linux系統 break print("收到的客戶端資料:", data.decode('utf-8')) conn.send(data.upper()) except Exception: # 針對windows系統 break # 6、關閉 conn.close() # 掛電話 phone.close() # 關機
client
import socket
# 1、買手機
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # SOCK_STREAM=》TCP協議
# 2、撥電話
phone.connect(("127.0.0.1", 8080))
# 3、發/收訊息=>通訊迴圈
while True:
msg = input(">>: ").strip()
phone.send(msg.encode('utf-8'))
data = phone.recv(1024)
print("服務的返回的資料:", data.decode('utf-8'))
# 4、關閉
phone.close()