python的socket伺服器元件

2021-06-16 20:02:00 字數 1921 閱讀 5943

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...