python可以利用socket庫實現套接字編程。套接字編程通常分爲server端和client端,編程時一般是先server再client,這是最正常的邏輯,因爲功能是由server提供的,client必須根據server提供的規則來建立連接和發送消息。
server端的函數:
函數 | 描述 | |
s.bind(address) | 將套接字綁定到地址, 在AF_INET下,以元組(host,port)的形式表示地址. | |
s.listen(backlog) | 開始監聽TCP傳入連接。backlog指定在拒絕連接之前,操作系統可以掛起的最大連接數量。該值至少爲1,大部分應用程序設爲5就可以了。 | |
s.accept() | 接受TCP連接並返回(conn,address),其中conn是新的套接字對象,可以用來接收和發送數據。address是連接客戶端的地址。 | |
服務器建立TCP連接的流程如下:
socket()創建套接字->
bind()綁定地址和端口->
listen()開始監聽連接請求->
accept()接受連接請求,並返回一個新的套接字用於處理後續操作->
recv()和send()對數據進行收發->
新套接字和舊套接字依次close()->end
代碼練習:
import socket from time import ctime HOST = "" PORT = 10012 ADDR = (HOST,PORT) BUFSIZE = 1024 s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(ADDR) s.listen(5) while True: print "Waiting for connection..." conn,addr = s.accept() print "...connection from:",addr while True: data = conn.recv(BUFSIZE) if not data: break conn.send('[%s] %s'%(ctime(),data)) print [ctime()],':',data conn.close() s.close()
客戶端函數:
函數 | 描述 |
s.connect(address) | 連接到address處的套接字。一般address的格式爲元組(hostname,port),如果連接出錯,返回socket.error錯誤。 |
s.connect_ex(adddress) | 功能與connect(address)相同,但是成功返回0,失敗返回errno的值。 |
客戶端建立TCP連接的流程:
socket()創建套接字->
connection()請求建立連接->
recv()和send()對數據進行收發->
close()套接字斷開連接->end
注意,客戶端在建立連接後沒有返回新的套接字
代碼練習:
import socket from time import ctime HOST = 'localhost' PORT = 10012 BUFSIZE = 1024 ADDR = (HOST,PORT) tcpSock =socket.socket(socket.AF_INET,socket.SOCK_STREAM) tcpSock.connect(ADDR) while True: data = raw_input(">") if not data: break tcpSock.send(data) data = tcpSock.recv(BUFSIZE) if not data: break print data tcpSock.close()
演示截圖如下
客戶端輸入:
服務器端: