【问题标题】:Python socket.accept() blocking code before call?Python socket.accept() 在调用之前阻塞代码?
【发布时间】:2019-03-23 19:50:44
【问题描述】:

我正在尝试学习 Python 套接字,但使用 socket.accept() 方法遇到了麻烦。据我了解该方法,一旦我调用accept,线程将坐下来等待传入连接(阻止所有以下代码)。但是,在下面的代码中,我从 https://docs.python.org/2/library/socket.html 获得并使用 localhost。我在服务器的第一行添加了一个 print('hello') 。然而,直到我断开客户端后,打印才会出现。为什么是这样?为什么在我绑定套接字之后,accept 似乎在我的打印之前运行?

# Echo server program
import socket

print('hello') # This doesn't print until I disconnect the client
HOST = 'localhost'              
PORT = 50007              
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()
# Echo client program
import socket

HOST = 'localhost'    # The remote host
PORT = 50007              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

【问题讨论】:

  • 您是如何在命令行上或在可能尝试捕获其输出的交互式环境中运行服务器的?尝试在print 之后添加sys.stdout.flush()(记得在此之前还要import sys)。
  • @user4815162342 我在命令行中运行。然而,当我使用冲洗时,它起作用了!你能详细解释一下吗?谢谢!
  • 标准输出是一个缓冲流,这意味着当你打印一些东西时,输出会停留在一个内部缓冲区中,直到你打印足够的数据来填充它(不太可能在一个小程序中,自助餐是几个千字节大小),或者直到程序退出,当所有此类缓冲区都被自动刷新时。通常,当输出是终端时,IO 层会自动切换到行缓冲,每当打印换行符(print 自动插入)时,缓冲区就会被刷新。
  • 由于某种原因,这在您的系统上不起作用,您必须明确刷新。另一种选择是运行python -u,它应该强制使用无缓冲的标准流。
  • 好的!所以我在 Windows 上使用 git bash,这似乎是问题所在。我切换到我的 linux 终端,现在一切都按预期工作!感谢您的帮助:)

标签: python sockets blocking


【解决方案1】:

您可能在 Python 的 IO 无法识别为交互式的系统上使用输出设备。作为一种解决方法,您可以在print 之后添加sys.stdout.flush()

标准输出是一个缓冲流,这意味着当你打印一些东西时,输出会停留在一个内部缓冲区中,直到你打印足够的数据来填满整个缓冲区(不太可能在一个小程序中,自助餐的大小是几千字节),或者直到程序退出,当所有此类缓冲区都被自动刷新时。通常,当输出是终端服务时,IO 层会自动切换到行缓冲,每当打印换行符时也会刷新缓冲区(print 语句会自动插入)。

由于某种原因,这在您的系统上不起作用,您必须明确刷新。另一种选择是运行python -u,它应该强制使用无缓冲的标准流。

【讨论】:

    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多