最近看《python核心編程》,書中實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的1對(duì)1的TCPserver,但是在實(shí)際使用中1對(duì)1的形勢(shì)明顯是不行的,所以研究了一下如何在server端通過(guò)啟動(dòng)不同的線程(進(jìn)程)來(lái)實(shí)現(xiàn)每個(gè)鏈接一個(gè)線程。
其實(shí)python在類的設(shè)計(jì)上已經(jīng)考慮到了這一方面的需求,我們只要在自己的server上繼承一下SocketServer.BaseRequestHandler就可以了。
server端代碼如下:
#!/usr/bin/env python import SocketServer from time import ctime HOST = '' PORT = 21567 ADDR = (HOST, PORT) class MyRequestHandler(SocketServer.BaseRequestHandler): def handle(self): print '...connected from:', self.client_address while True: self.request.sendall('[%s] %s' % (ctime(),self.request.recv(1024))) tcpServ = SocketServer.ThreadingTCPServer(ADDR, MyRequestHandler) print 'waiting for connection...' tcpServ.serve_forever()客戶端代碼如下(基本和書中一模一樣,只是把循環(huán)中的關(guān)閉鏈接注釋掉了):
#!/usr/bin/env python from socket import * HOST = 'localhost' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) while True: tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) data = raw_input('> ') if not data: break tcpCliSock.send('%s/r/n' % data) data = tcpCliSock.recv(BUFSIZ) if not data: break print data.strip() #tcpCliSock.close()從客戶端的代碼可以看出,每次輸入都會(huì)建立一次新的請(qǐng)求。
測(cè)試一下,啟動(dòng)server和client之后,在client中輸入測(cè)試:


新聞熱點(diǎn)
疑難解答
圖片精選