使用asyncore读取套接字缓冲区
问题描述:
我是Python新手(虽然我已经使用Java进行了多年的编程,但是我正在研究一个简单的基于套接字的网络应用程序(仅仅为了好玩))。我的想法是,我的代码连接到远程TCP端点,然后监听从服务器推送到客户端的任何数据,并对此执行一些解析。使用asyncore读取套接字缓冲区
从服务器 - >客户端推送的数据是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_with_crlf
该功能简单地检查缓冲区\x0D\x0A
的最后两个字节。第一个问题是主要的问题(答案是基于此),但任何其他的想法/提示都值得赞赏。谢谢。
答
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()
答
这是更简单 - 看asynchat及其set_terminator方法(和模块中其他有用的花絮)。 Twisted的数量级更丰富和更强大,但是,对于足够简单的任务,asyncore和asynchat(旨在顺利进行互操作)确实非常易于使用,正如您开始观察的那样。
我很好奇ByteUtils在您的代码中的位置,所以我使用“python ByteUtils”...和谷歌给了我这个线程 - 创建15分钟后!这是令人印象深刻的:) – truppo 2009-11-26 18:23:59