2

我正在寻找一种与 python socketserver 保持连接的方法。我想避免以下情况。

轮询输入

例子:

class SingleTCPHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        while True:
            message = self.rfile.readline().strip()
            ... do something with message

我正在做的是不断检查是否收到了某些东西。我想避免这种情况,因为服务器是在 Raspberry pi 上运行的,所以我希望尽可能减少不必要的计算。


更新:2013 年 3 月 28 日

似乎 socket.recv() 是一个阻塞调用。根据socketserver的文档:

不同之处在于第二个处理程序中的 readline() 调用将多次调用 recv() 直到遇到换行符,而第一个处理程序中的单个 recv() 调用将只返回从客户端发送的内容sendall() 调用。

这意味着如果 socket.recv() 是一个阻塞调用,那么while True它不会导致不断检查新消息是否已经到达并且不会像我最初想象的那样消耗处理器。


每条消息一个连接

例子:

class SingleTCPHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        while True:
            message = self.rfile.readline().strip()
            ... do something with message

一旦收到消息,这将关闭连接。但是,消息每 60 毫秒发送一次,因此客户端每次都会初始化一个新连接。这给应该尽可能快的连接带来了开销。

问题

有没有办法在每次收到消息时获得某种“中断”?

(概念)示例:

class SingleTCPHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        if interrupt:
            message = self.rfile.readline().strip()
            ... do something with message

我之前问过一个类似的问题,但是这个问题总结了前一个问题中没有直接解决的问题的本质。

4

1 回答 1

2

为了我自己的利益,我继续实施了一个版本。

import asyncore, socket, time, signal, sys

finished = None

class EchoHandler(asyncore.dispatcher_with_send):

    def handle_read(self):
        data = self.recv(8192)
        if data:
            self.send(data)

    def handle_close(self):
        print 'Closing connection from %s' % repr(self.getpeername())
        self.close()

class Listner(asyncore.dispatcher):

    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)
        self.number_accepted = 1

    def handle_accept(self):
        pair = self.accept()
        if pair is not None:
            sock, addr = pair
            print 'Incoming connection from %s' % repr(addr)
            handler = EchoHandler(sock)
            self.number_accepted-=1
        if self.number_accepted < 0:
            finished = 1

client = Listner('127.0.0.1', 1033)
asyncore.loop()

while not finished:
    time.sleep(1)
于 2013-03-27T16:21:26.057 回答