gpt4 book ai didi

python - 为什么我从套接字接收一个字符串,直到 python 中的\n 换行符转义序列?

转载 作者:太空狗 更新时间:2023-10-29 23:55:42 24 4
gpt4 key购买 nike

它应该从 tcp 套接字接收一个 2 行字符串,但实际上我只接收到新行之前的字符串。

     socket = socket(AF_INET,SOCK_STREAM)
socket.connect((ip,port))
data = socket.recv(1024)
print "%s" % data

如果现在调用接收函数,它将接收换行符后的字符串的第二部分。这实际上不是我想要的。它应该从第一次调用返回整个字符串。当我使用 nc 连接到服务器时,我在连接开始时正常接收字符串。为什么会这样?

最佳答案

因为 TCP 是一个 协议(protocol)(如 SOCK_STREAM 所示),所以没有固定的消息边界或数据包,而且您永远无法确定只用一次调用 recv。您只需在循环中调用 recv,添加到缓冲区,并在您认为足够时退出循环。大多数纯文本协议(protocol)使用换行符来告知读取已完成并对接收到的数据进行处理。其他协议(protocol)使用其他字符或字节序列。

在你的情况下,如果没有特殊字符表示已经到达当前数据的末尾,你有两种解决方案:

  1. 使用超时:当一段时间没有接收到新数据时,打印它。

  2. 非阻塞套接字:简单地循环读取,将数据附加到内部缓冲区。当对 recv 的调用抛出一个错误且 errno 等于 errno.EWOULDBLOCK 时,现在没有更多的内容可以读取并打印接收到的数据。

备选方案2,连同包裹select , 可能是最好的方法。

编辑

这是我的意思的一个简单例子。它可能不会像这样工作,需要进行一些调整,但希望它足以让您继续构建。

# Need to import: package socket, package select, package errno

# Create socket and connect to server

# Make the socket non-blocking (see http://docs.python.org/library/socket.html#socket.socket.setblocking)
socket.setblocking(0)

run_main_loop = True
while run_main_loop:
# Wait for events...
read_ready, _, _ = select.select([socket], None, None)

if socket in read_ready:
# The socket have data ready to be received
buffer = ''
continue_recv = True

while continue_recv:
try:
# Try to receive som data
buffer += socket.recv(1024)
except socket.error, e:
if e.errno != errno.EWOULDBLOCK:
# Error! Print it and tell main loop to stop
print 'Error: %r' % e
run_main_loop = False
# If e.errno is errno.EWOULDBLOCK, then no more data
continue_recv = False

# We now have all data we can in "buffer"
print '%r' % buffer

socket.close()

关于python - 为什么我从套接字接收一个字符串,直到 python 中的\n 换行符转义序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8386679/

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