用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的多線程TCP服務(wù)器的教程
最近看《python核心編程》,書(shū)中實(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()
客戶端代碼如下(基本和書(shū)中一模一樣,只是把循環(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è)試:
- python網(wǎng)絡(luò)編程之TCP通信實(shí)例和socketserver框架使用例子
- Python采用socket模擬TCP通訊的實(shí)現(xiàn)方法
- Python Socket實(shí)現(xiàn)簡(jiǎn)單TCP Server/client功能示例
- python實(shí)現(xiàn)簡(jiǎn)單的TCP代理服務(wù)器
- python實(shí)現(xiàn)TCP服務(wù)器端與客戶端的方法詳解
- Python中的TCP socket寫法示例
- Python實(shí)現(xiàn)TCP/IP協(xié)議下的端口轉(zhuǎn)發(fā)及重定向示例
- Python+Socket實(shí)現(xiàn)基于TCP協(xié)議的客戶與服務(wù)端中文自動(dòng)回復(fù)聊天功能示例
- Python socket網(wǎng)絡(luò)編程TCP/IP服務(wù)器與客戶端通信
- python3.5實(shí)現(xiàn)socket通訊示例(TCP)
- python中的TCP(傳輸控制協(xié)議)用法實(shí)例分析
相關(guān)文章
Python 經(jīng)典面試題 21 道【不可錯(cuò)過(guò)】
這篇文章主要介紹了Python 經(jīng)典面試題 21 道,在python面試過(guò)程中這21道是經(jīng)常被問(wèn)到了,感興趣的朋友跟隨小編一起看看吧2018-09-09Python 處理日期時(shí)間的Arrow庫(kù)使用
這篇文章主要介紹了Python 處理日期時(shí)間的Arrow庫(kù)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python中使用glob和rmtree刪除目錄子目錄及所有文件的例子
這篇文章主要介紹了python中使用glob和rmtree刪除目錄子目錄及所有文件的例子,需要的朋友可以參考下2014-11-11Pandas創(chuàng)建DataFrame提示:type?object?'object'?has?n
Pandas數(shù)據(jù)幀(DataFrame)是二維數(shù)據(jù)結(jié)構(gòu),它包含一組有序的列,每列可以是不同的數(shù)據(jù)類型,這篇文章主要給大家介紹了關(guān)于Pandas創(chuàng)建DataFrame提示:type?object?‘object‘?has?no?attribute?‘dtype‘的解決方案,需要的朋友可以參考下2023-02-02