【问题标题】:Python socket server and pipePython 套接字服务器和管道
【发布时间】:2026-02-19 04:40:01
【问题描述】:

我有三个文件。 client.py、server.py 和 test.py。 client.py 如下:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 6088))
while True:
    a = raw_input()
    s.send(a)
s.close()

server.py:

import socket
import sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1',6088))
s.listen(1)
print("Waitting for connection.....")
while True:
    socket,addr = s.accept()
    while True:
        data = socket.recv(1024)
        if data:
           print(data)
s.close()

test.py:

while True:
    a = raw_input()
    print("welcom "+ a)

我使用server.pytest.py 启动服务器,然后我使用client.py 启动客户端,但是当我在客户端输入内容时,服务器不显示任何内容。为什么?以及如何解决它。

【问题讨论】:

  • 您是否尝试过使用无缓冲输出,即python -u server.py | ....
  • 如果我错了,请纠正我,但是如果您不将其输出通过管道传输到测试脚本,我们可以假设您看到服务器打印消息吗?
  • 另外,我看到管道中的两个脚本并行运行的假设。这个假设是真的吗 - 或者 linux 上的管道命令按顺序执行(python test.py 在完成之前不会获得 server.py 的标准输出)。
  • @Todd 如果我不使用管道,我可以看到消息。问题可能是我以错误的方式使用管道。
  • @SteffenUllrich 谢谢它的工作!但为什么呢?

标签: python linux sockets pipe python-2.x


【解决方案1】:

默认情况下,出于性能原因,Python 的输出会被缓冲,除非 stdout 进入终端。这意味着来自print 的任何输出都不会立即发送到管道,而是首先在 Python 进程中缓冲,并且只有在缓冲区中积累了足够的数据时才会发送。要关闭它并使任何输出立即发送到管道,请使用python -uor similar
请注意,这种行为并不是 Python 独有的。其他命令(如 perl)显示类似的行为。

【讨论】:

    【解决方案2】:

    假设您不想完全关闭缓冲(这可能会导致代码的其他部分效率低下),只需在 server.py 中的每个打印语句之后调用 sys.stdout.flush()。

    【讨论】: