Python 使用asyncore读取套接字缓冲区

Python 使用asyncore读取套接字缓冲区,python,sockets,buffer,asyncore,Python,Sockets,Buffer,Asyncore,我是Python新手(不过我已经用Java编程多年了),我正在开发一个简单的基于套接字的网络应用程序(只是为了好玩)。我的想法是,我的代码连接到远程TCP端点,然后侦听从服务器推送到客户端的任何数据,并对其执行一些解析 从服务器->客户端推送的数据是UTF-8编码的文本,每行由CRLF(\x0D\x0A)分隔。您可能已经猜到了:这个想法是客户端连接到服务器(直到用户取消),然后读取和解析输入的行 我已经设法做到了这一点,但是,我不确定我这样做是否完全正确。因此,我的实际问题(代码如下): 在Py

我是Python新手(不过我已经用Java编程多年了),我正在开发一个简单的基于套接字的网络应用程序(只是为了好玩)。我的想法是,我的代码连接到远程TCP端点,然后侦听从服务器推送到客户端的任何数据,并对其执行一些解析

从服务器->客户端推送的数据是UTF-8编码的文本,每行由
CRLF
\x0D\x0A
)分隔。您可能已经猜到了:这个想法是客户端连接到服务器(直到用户取消),然后读取和解析输入的行

我已经设法做到了这一点,但是,我不确定我这样做是否完全正确。因此,我的实际问题(代码如下):

  • 在Python中,这是正确的方法吗(即,它真的这么简单吗)
  • 关于缓冲区/
    asyncore
    的任何提示/技巧/有用资源(参考文档除外)
  • 目前,数据的读取和缓冲如下:

    def handle_read(self):
        self.ibuffer = b""
    
        while True:
            self.ibuffer += self.recv(self.buffer_size)
            if ByteUtils.ends_with_crlf(self.ibuffer):
                self.logger.debug("Got full line including CRLF")
                break
            else:
                self.logger.debug("Buffer not full yet (%s)", self.ibuffer)
    
        self.logger.debug("Filled up the buffer with line")
        print(str(self.ibuffer, encoding="UTF-8"))
    

    ByteUtils.ends\u with\u crlf
    函数只需检查缓冲区的最后两个字节是否有
    \x0D\x0A
    。第一个问题是主要问题(答案基于此),但任何其他想法/提示都将不胜感激。谢谢。

    TCP是一个流,不能保证缓冲区不会包含一条消息的结尾和下一条消息的开头。 因此,在缓冲区末尾检查\n\r不会在所有情况下都像预期的那样工作。您必须检查流中的每个字节

    而且,我强烈建议您使用Twisted而不是asyncore。 类似这样的内容(从内存中,可能无法开箱即用):


    TCP是一个流,不能保证缓冲区不包含一条消息的结尾和下一条消息的开头。 因此,在缓冲区末尾检查\n\r不会在所有情况下都像预期的那样工作。您必须检查流中的每个字节

    而且,我强烈建议您使用Twisted而不是asyncore。 类似这样的内容(从内存中,可能无法开箱即用):


    它甚至更简单——看看它的原理和方法(以及该模块中其他有用的花絮)。数量级更丰富、功能更强大,但是,对于足够简单的任务,asyncore和asynchat(设计用于顺利互操作)确实非常易于使用,正如您已经开始观察到的那样。

    它甚至更简单——请看它及其方法(以及该模块中其他有用的花絮)。在数量级上更丰富、功能更强大,但是,对于足够简单的任务,asyncore和asynchat(设计为平滑互操作)确实非常易于使用,正如您已经开始观察到的那样。

    我很好奇代码中的字节在哪里,所以我在谷歌上搜索了“python字节”…谷歌给了我这个帖子——在它创建15分钟后!令人印象深刻:)我很好奇你的代码中的ByteUtils在哪里,所以我在谷歌上搜索了“python ByteUtils”…谷歌给了我这个线程——在它创建15分钟后!这令人印象深刻:)我知道服务器通过“行”发送数据,这些行都以CRLF结尾,因此我确信在某个时间点缓冲区会被终止(除非服务器端出现问题,我想这会在短时间内导致某种形式的缓冲区溢出)。我已经读过Twisted,但它还不适合Python 3,这可能有点过头了。您仍然有可能在当前代码中获得多行而不是一行。我很少推荐Twisted,但是,是的,它比古老的asyncore框架好得多!我知道服务器通过以CRLF结尾的“行”发送,因此我确信在某个时间点缓冲区将被终止(除非服务器端出现问题,我猜这会在任何时候将其发送到某种形式的缓冲区溢出)。我已经读过Twisted,但它还不适合Python 3,这可能有点过头了。您仍然有可能在当前代码中获得多行而不是一行。我很少推荐Twisted,但是,是的,它比古老的asyncore框架好得多!我先尝试了asynchat,但遇到了一点问题,我无法马上解决(与缓冲区有关),所以我又回到了Asynchore。+1使用Asynchore/AsynchHat代替Twisted来完成这些简单的任务。@Denis:我认为上面的Twisted示例非常简单明了,不是吗?我先尝试了AsynchHat,但是遇到了一点问题,我无法马上解决(与缓冲区有关),所以我又回到了asyncore。+1使用asyncore/asynchat代替Twisted来完成这些简单的任务。@Denis:我认为上面的Twisted示例非常简单明了,不是吗?
    from twisted.internet import reactor, protocol
    from twisted.protocols.basic import LineReceiver
    
    
    class MyHandler(LineReceiver):
    
        def lineReceived(self, line):
            print "Got line:", line
    
    
    f = protocol.ClientFactory()
    f.protocol = MyHandler
    reactor.connectTCP("127.0.0.1", 4711, f)
    reactor.run()