標籤:des style blog http color os io 使用 ar
Socket是什麼呢?
Socket是應用程式層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。
如何使用socket?
先從伺服器端說起。伺服器端先初始化Socket,然後與連接埠綁定(bind),對連接埠進行監聽(listen),調用accept阻塞,等待用戶端串連。在這時如果有個用戶端初始化一個Socket,然後串連伺服器(connect),如果串連成功,這時用戶端與伺服器端的串連就建立了。用戶端發送資料請求,伺服器端接收請求並處理請求,然後把回應資料發送給用戶端,用戶端讀取資料,最後關閉串連,一次互動結束。
建立socket對象:
socket.socket(family=AF_INET, type=SOCK_STREAM)
family的值可以是AF_UNIX(Unix域,用於同一台機器上的進程間通訊),也可以是AF_INET(對於IPV4協議的TCP和UDP)
type參數可以為SOCK_STREAM(流通訊端)或者 SOCK_DGRAM(資料報文通訊端),SOCK_RAW(raw通訊端)。
Socket對象的主要屬性和方法:
socket.bind(address)
address一般情況下為一個雙元素元組, ((host,port)) ,主機名稱或者ip地址+連接埠號碼。
socket.listen(backlog)
socket的監聽串連數,定義了最大隊列,最大值依賴於主系統(一般情況下為5)
socket.accept()
調用accept方法時,socket會進入‘waiting‘(或阻塞)狀態。客戶請求串連時,方法建立串連並返回伺服器。accept方法返回一個含有倆個元素的元組,形如(connection,address)。第一個元素(connection)是新的socket對象,伺服器通過它與客戶通訊;第二個元素(address)是客戶的internet地址。
socket.connect(address)
串連到address定義的遠程socket
socket.send(bytes[, flags])
發送資訊到遠程socket
socket.recv(bufsize[, flags])
伺服器端通過socket擷取data資訊,bufsize定義了一次性接收的最大值
TCP
Server.py
import sockets = socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind(("",8081))s.listen(1)while True: connection,address = s.accept() data = connection.recv(1024) print(‘Received:‘,data)
Client.py
import socketfrom pip.backwardcompat import raw_inputs=socket.socket(socket.AF_INET,socket.SOCK_STREAM)port = 8081host = "localhost"s.connect((host,port))while True: msg = raw_input() s.send(bytes(msg,‘utf-8‘)) s.close()
UDP
server端代碼
import sockets = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind(("",8081))while True: data,host=s.recvfrom(1024) print(‘Received:‘,data,‘from‘,host)
Client端代碼
import socketfrom pip.backwardcompat import raw_inputs=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)port = 8081host = "localhost"while True: msg = raw_input() print(msg) s.sendto(bytes(msg,encoding = "utf-8"), (host, port))
Socket模組學習