Skip to main content
 首页 » 编程设计

Python 的 asyncore 客户端向服务器发送周期性数据

2025年05月04日12exmyth

我需要连接到服务器(例如 smpp 服务器)并每 2 秒发送一次周期性数据,代码如下:

import asyncore, socket, threading, time 
 
class SClient(asyncore.dispatcher): 
    buffer = "" 
    t = None 
 
    def __init__(self, host): 
        asyncore.dispatcher.__init__(self) 
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
        self.connect( (host, 25) ) 
 
        print "sending data from __init__" 
        self.sendCommand("data_init") 
        self.t = SenderThread(self) 
        self.t.start() 
 
    def sendCommand(self, command): 
        self.buffer = command 
 
    def handle_close(self): 
        self.close() 
        self.t.stop() 
 
    def handle_read(self): 
        print self.recv(8192) 
 
    def writable(self): 
        print 'asking for writable ? len='+str(len(self.buffer)) 
        return (len(self.buffer) > 0) 
 
    def handle_write(self): 
        print "writing to socket" 
        sent = self.send(self.buffer) 
        self.buffer = self.buffer[sent:] 
        print "wrote "+str(sent)+" to socket" 
 
class SenderThread(threading.Thread): 
    _stop = False 
 
    def __init__(self, client): 
        super(SenderThread,self).__init__() 
        self.client = client 
 
    def stop(self): 
        self._stop = True 
 
    def run(self): 
        counter = 0 
        while self._stop == False: 
            counter += 1 
            time.sleep(1) 
            if counter == 2: 
                print "sending data from thread" 
                self.client.sendCommand("data_thread") 
                counter = 0 
 
client = SClient('127.0.0.1') 
asyncore.loop() 

这是运行时的输出:

$ python test.py  
sending data from __init__ 
asking for writable ? len=9 
writing to socket 
wrote 9 to socket 
asking for writable ? len=0 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
asking for writable ? len=11 
writing to socket 
wrote 11 to socket 
asking for writable ? len=0 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
asking for writable ? len=11 
writing to socket 
wrote 11 to socket 
asking for writable ? len=0 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 
sending data from thread 

我的线程每 2 秒通过缓冲区变量向服务器发送数据,但 asyncore 恰好每 1 分钟调用一次 writable 和 handle_write,我不明白为什么它在从线程填充缓冲区后不获取缓冲区?

请您参考如下方法:

查看 asyncore loop 的文档方法。

The timeout argument sets the timeout parameter for the appropriate select() or poll() call, measured in seconds; the default is 30 seconds.

它只会每 30 秒触发一次 handle_write。