Python - 套接字行为奇怪吗?

时间:2017-02-27 09:06:51

标签: python sockets

我有一个客户端/服务器应用程序,它非常基础。客户端向服务器发送包含文件名信息的消息,然后服务器在服务器目录中创建该文件,客户端将继续将客户端选择的文件中的所有二进制数据发送到服务器(和服务器)将其写入新形成的文件中)。然后,服务器需要运行此文件并将所有输出发送回客户端。它工作正常,直到我达到这个死胡同并且它一直循环。这是服务器上代码的简化版本:

if data_received.startswith("COMMAND:run_file"): #client tells server to create new file
    #create file
    while True:
        #Get binary data from client
        #If data is blank break
        #Write data to new file
    #Close file
    #Open up new file using subprocess
    p = Popen("python " + data[17:], shell=True,stdin=PIPE,stdout=PIPE,stderr=STDOUT)
    print p.stdout.read() #Print output

现在无论何时运行此代码,服务器都会收到客户端文件的二进制数据,但它只会坐在那里......等待某事,而不是等待来自客户端的新命令(我知道的很多)。我很困惑,所以有人能发现我在某处发生的(可能)非常明显的错误吗?

修改
我找到了它被卡住的地方,它是在

之后
print p.stdout.read()

现在我不知道为什么会被卡住。

2 个答案:

答案 0 :(得分:0)

正如我在评论中所说,如果您启动的子流程是Python,我建议使用multiprocessing模块。

但是,为了回答您的问题,我认为stdout已缓存,stdout.read()仅在子流程结束时返回。

解决方案是使用stdout.readline()代替stdout.read()。 另外,如果您没有阅读stderr,请不要将PIPE重定向到stderr

答案 1 :(得分:-1)

如果你使用conn.recv(1024),它会等到它收到数据。由于你处于一个真正的循环中,它会不断尝试接收数据,如果发送了所有数据,它就不会收到任何东西(而不是'空白数据')。因此,您的'if data is blank'永远不会成立。