Socket是什麼呢?
Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。python
如何使用socket?設計模式
先從服務器端提及。服務器端先初始化Socket,而後與端口綁定(bind),對端口進行監聽(listen),調用accept阻塞,等待客戶端鏈接。在這時若是有個客戶端初始化一個Socket,而後鏈接服務器(connect),若是鏈接成功,這時客戶端與服務器端的鏈接就創建了。客戶端發送數據請求,服務器端接收請求並處理請求,而後把迴應數據發送給客戶端,客戶端讀取數據,最後關閉鏈接,一次交互結束。
服務器
建立socket對象:socket
socket.socket(family=AF_INET, type=SOCK_STREAM)spa
family的值能夠是AF_UNIX(Unix域,用於同一臺機器上的進程間通信),也能夠是AF_INET(對於IPV4協議的TCP和UDP)設計
type參數能夠爲SOCK_STREAM(流套接字)或者 SOCK_DGRAM(數據報文套接字),SOCK_RAW(raw套接字)。server
Socket對象的主要屬性和方法:對象
socket.bind(address)blog
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 socket s = 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 socket from pip.backwardcompat import raw_input s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) port = 8081 host = "localhost" s.connect((host,port)) while True: msg = raw_input() s.send(bytes(msg,'utf-8')) s.close()
UDP
server端代碼
import socket s = 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 socket from pip.backwardcompat import raw_input s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) port = 8081 host = "localhost" while True: msg = raw_input() print(msg) s.sendto(bytes(msg,encoding = "utf-8"), (host, port))