2009-11-26 47 views
1

我是Python新手(虽然我已经使用Java进行了多年的编程,但是我正在研究一个简单的基于套接字的网络应用程序(仅仅为了好玩))。我的想法是,我的代码连接到远程TCP端点,然后监听从服务器推送到客户端的任何数据,并对此执行一些解析。使用asyncore读取套接字缓冲区

从服务器 - >客户端推送的数据是UTF-8编码文本,每行由CRLF\x0D\x0A)定界。你可能猜到了:这个想法是,客户端连接到服务器(直到被用户取消),然后读取和解析这些线路。

我已经设法让这个工作,但是,我不确定我是否以正确的方式来做这件事。所以因此我的实际问题(代码如下):

  1. 这是做在Python正确的方式(即是不是真的这样简单的)?
  2. 有关缓冲区/ 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_with_crlf该功能简单地检查缓冲区\x0D\x0A的最后两个字节。第一个问题是主要的问题(答案是基于此),但任何其他的想法/提示都值得赞赏。谢谢。

+0

我很好奇ByteUtils在您的代码中的位置,所以我使用“python ByteUtils”...和谷歌给了我这个线程 - 创建15分钟后!这是令人印象深刻的:) – truppo 2009-11-26 18:23:59

回答

6

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

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

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() 
+0

我知道服务器通过所有以CRLF结束的“线路”发送,所以我确信在一个时间点缓冲区将被终止(除非服务器端出现错误,发送这个到一些形式的缓冲区溢出,我猜没有任何时间)。 我已经阅读了关于Twisted的文章,但是对于Python 3还没有完成AFAIK,并且可能会为此过度使用。 – tmbrggmn 2009-11-26 19:29:14

+0

您目前的代码仍然存在多行而不是一行的风险。 – truppo 2009-11-26 22:26:39

+0

耶! +1扭曲! – nosklo 2009-11-27 02:38:11

6

这是更简单 - 看asynchat及其set_terminator方法(和模块中其他有用的花絮)。 Twisted的数量级更丰富和更强大,但是,对于足够简单的任务,asyncore和asynchat(旨在顺利进行互操作)确实非常易于使用,正如您开始观察的那样。

+1

我先尝试了asynchat,但遇到了一些我无法直接解决的问题(与缓冲区有关),所以我恢复为asyncore。 – tmbrggmn 2009-11-26 19:30:27

+3

+1使用asyncore/asynchat而不是Twisted来处理这些简单的任务。 – 2009-11-27 06:07:19

+0

@Denis:我认为上面这个扭曲的例子非常简单,直截了当,不是吗? – nosklo 2009-11-30 12:49:11