python 網路程式設計 TCP套接字例項
阿新 • • 發佈:2019-01-27
一. 伺服器端程式碼tcpServer.py:
from socket import * from time import ctime #HOST變數為空,表示bind()函式可以繫結在所有有效的地址上 HOST = '' PORT = 21234 #設定緩衝大小為128,可以根據網路情況和需求來進行修改 BUFSIZ = 128 ADDR = (HOST, PORT) #建立TCP套接字 tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.bind(ADDR) #listen()函式的引數表示最多允許同時接收的連線數,超過這個數目的連線會被拒絕掉 tcpSerSock.listen(5) while True: print 'waiting for connection...' tcpCliSock, addr = tcpSerSock.accept() print '...connected from:', addr while True: #接收資料 data = tcpCliSock.recv(BUFSIZ) if not data: break #傳送資料 tcpCliSock.send('From server response:[%s] %s' % (ctime(), data)) tcpCliSock.close() tcpSerSock.close()
客戶端程式碼tcpClient.py:
from socket import * HOST = 'localhost' PORT = 21234 BUFSIZ = 128 ADDR = (HOST, PORT) #建立客戶端TCP套接字 tcpCliSock = socket(AF_INET, SOCK_STREAM) #連線伺服器 tcpCliSock.connect(ADDR) while True: data = raw_input('>') if not data: break #傳送資料 tcpCliSock.send(data) #接收資料 data = tcpCliSock.recv(BUFSIZ) if not data: break print data tcpCliSock.close()
二、 使用SocketServer模組實現TCP伺服器端和客戶端
SocketServer是標準庫中的一個高階模組,用於簡化伺服器端與客戶端的實現。
客戶端程式碼,server.py:
from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH) from time import ctime HOST = '' PORT = 20123 ADDR = (HOST, PORT) #繼承SRH類,並重寫handle()函式。當有客戶訊息進來時,handle()函式就會被呼叫。StreamRequestHandler類支援像操作檔案一樣對套接字進行輸入輸出 #操作。通過readline()函式得到客戶訊息,write()函式把訊息返回給客戶。 class MyRequestHandler(SRH): def handle(self): print '...connect from:', self.client_address self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline())) #利用主機資訊和請求處理類來建立TCP伺服器 tcpServ = TCP(ADDR, MyRequestHandler) print 'waiting for connection...' #無限迴圈,等待與處理客戶請求 tcpServ.serve_forever()
客戶端程式碼,client.py:
from socket import * HOST = 'localhost' PORT = 20123 BUFSIZ = 128 ADDR = (HOST, PORT) while True: client = socket(AF_INET, SOCK_STREAM) #由於SocketServer的請求處理器的預設行為是接受連線,得到請求,然後關閉連線。這使得程式在執行時不能一直保持連線狀態,因此,每次傳送資料前都要 建立一個新的套接字 client.connect(ADDR) data = raw_input('>') if not data: break #由於伺服器端的處理器類像檔案一樣操作套接字,所以每次都要傳送行結束符(回車與換行)。伺服器保留並重用客戶端傳送的行結束符。當從伺服器端得到資料 時,使用strip()函式去掉它們 client.send('%s\r\n' % data) data = client.recv(BUFSIZ) if not data: break print data.strip() client.close()