gpt4 book ai didi

python - 使用 asyncore 读取套接字缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:48 25 4
gpt4 key购买 nike

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

从服务器-> 客户端推送的数据是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。第一个问题是主要问题(答案基于此),但欢迎任何其他想法/提示。谢谢。

最佳答案

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

关于python - 使用 asyncore 读取套接字缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1804980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com