Python 服务器/客户端远程执行问题

-3 投票
1 回答
2549 浏览
提问于 2025-04-16 10:34

我正在做一个Python项目,但遇到了一些麻烦。我问了很多人,但似乎没有人能帮我 :/ 我正在编写一个小程序,用来执行系统命令。这个程序的想法是,一台机器作为服务器,另一台机器作为客户端,连接到服务器的IP和端口。连接后,它们可以执行系统命令并获取输出。唯一的问题是,每当我运行服务器时,它都能成功启动,但当我打开客户端并连接到服务器时,我能得到一个命令行界面,但当我输入命令时,它就会卡住,直到服务器关闭后,我才会在客户端看到命令的输出。

Server.py:

import sys, os, socket

host = ''
port = 50105
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print("服务器已在端口启动: ", port)
s.listen(1)
while (1):
conn, addr = s.accept()
print '来自 ', addr 的新连接
try:
while True:
rc = conn.recv(2)
pipe = os.popen(rc)
rl = pipe.readlines()
fl = conn.makefile('w')
fl.writelines(rl[:-1])
fl.close()
except IOError:
conn.close()

Client.py:


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
port = input('Port: ')
s.connect((host, port))
while (1):
    cmd = raw_input('$ ')
    s.send(cmd) 
    file = s.makefile('r', 0)
    sys.stdout.writelines(file.readlines())
    sys.stdout.flush()
    file.close()

1 个回答

1

我在你之前的问题的回答里已经告诉你问题是什么了:

Python - 服务器和客户端的问题

我不是开玩笑,我试过你的代码,找到了问题所在,并告诉你怎么解决。

再强调一遍:

当你在套接字上使用makefile(),然后再用readlines()时,readlines()会一直读取数据,直到遇到文件结束。在套接字的情况下,文件结束是指另一端关闭了连接。所以在连接关闭之前,你不会得到任何输出,因为readlines()不会停止读取,直到连接关闭。

在这种情况下,readlines()和makefile()对我来说都没有意义,特别是你在每个命令后都创建并关闭它。你只需要在两端使用send()和recv()就可以了。

你可能还想要有一种实际的“协议”,这样服务器可以告诉客户端“这里有一个响应”和“响应结束了”,这样客户端就知道了。否则就很难知道什么时候该停止等待更多的响应。:)

撰写回答