Python 服务器/客户端远程执行问题
我正在做一个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 个回答
我在你之前的问题的回答里已经告诉你问题是什么了:
我不是开玩笑,我试过你的代码,找到了问题所在,并告诉你怎么解决。
再强调一遍:
当你在套接字上使用makefile(),然后再用readlines()时,readlines()会一直读取数据,直到遇到文件结束。在套接字的情况下,文件结束是指另一端关闭了连接。所以在连接关闭之前,你不会得到任何输出,因为readlines()不会停止读取,直到连接关闭。
在这种情况下,readlines()和makefile()对我来说都没有意义,特别是你在每个命令后都创建并关闭它。你只需要在两端使用send()和recv()就可以了。
你可能还想要有一种实际的“协议”,这样服务器可以告诉客户端“这里有一个响应”和“响应结束了”,这样客户端就知道了。否则就很难知道什么时候该停止等待更多的响应。:)