socketserver(2.x中為socketserver)
class baserequesthandler:
def __init__(self, request, client_address, server):
self.request = request
self.client_address = client_address
self.server = server
self.setup()
try:
self.handle()
finally:
self.finish()
def setup(self):
pass
def handle(self):
pass
def finish(self):
pass
socketserver.py裡request handler的基類,最基本的使用方法是implement handle(self)。socketserver每次收到連線時,新開乙個執行緒,例項化requesthandler,並呼叫handle()處理request,如果想持續保持該執行緒,處理該連線發來的請求,則需要在handle()裡做迴圈監聽。不過requesthandler的初衷是模仿http伺服器的請求式互動,所以針對請求而非連線進行處理也是可以接受的。示例**:
import configparser
import socketserver
import time
import sys
import cmdproc
host = cmdproc.config.get('connect','address')
port = int(cmdproc.config.get('connect','port'))
addr = (host, port)
bufsize = int(cmdproc.config.get('connect','buffersize'))
overtime = int(cmdproc.config.get('connect','overtime'))
class myrequesthandler(socketserver.baserequesthandler):
def handle(self):
overtime = 0
while overtime < overtime:
try:
reqstr = str(self.request.recv(bufsize),'utf-8')#get request
if not reqstr:
time.sleep(0.5)
overtime += 1
else:
overtime = 0
result = cmdproc.check(reqstr, self.client_address)
self.request.send(bytes(result,'utf-8'))
except:
print('error in connection: '+str(sys.exc_info()))
break
tcpserv = socketserver.threadingtcpserver(addr, myrequesthandler)
print ('waiting for connection...')
tcpserv.serve_forever()
快取區大小bufsize可以設成很大,也占用了很大的記憶體,但是實際上只有8k左右的空間,如何收發更長的資訊,需要進一步了解。當然理想的方式應該是中介軟體或者分段傳送。順便提下python中的configparser模組,用來讀取配置檔案很方便
簡單的socket服務
服務端 usr bin python3 import socket socket模組 import subprocess 執行系統命令模組 host 127.0.0.1 port 50007 s socket.socket socket.af inet,socket.sock stream 定義so...
python 實現socket服務端併發的四種方式
服務端 多程序和多執行緒的開啟方式相同。缺點 1 由於cpython的gil,導致同一時間無法執行多個執行緒 2 不可能無限開進程式或執行緒 解決辦法 多程序 concurrent.futures.processpoolexecutor 執行緒池 import socket from multipr...
python中的socket伺服器(多執行緒)
最近在寫乙個客戶端和伺服器的專案,使用了socketserver模組,網上大多數都是tcp連線的例子,我在這總結乙個udp。直接貼上 import threading import socketserver class myudphandler socketserver.baserequesthan...