我正在研究一个Python项目,我遇到了麻烦。我问过这么多人,但他们似乎无法帮助我:/我正在编写一个执行系统命令的小程序。这个想法是一台机器打开服务器而另一台打开客户机并连接到IP /端口。从那里,他们可以执行系统命令并获得输出。唯一的问题是,每当我运行服务器它成功打开然后当我打开客户端并连接到服务器我得到shell但是当我键入命令它只是挂起直到服务器关闭然后我得到命令的输出客户。
Server.py:
import sys, os, socket
host = ''
port = 50105
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print("Server started on port: ", port)
s.listen(1)
while (1):
conn, addr = s.accept()
print 'New connection from ', 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()
答案 0 :(得分:1)
我告诉你在上一个问题的答案中到底出了什么问题:
Python - Server and client problems
我不是在开玩笑或其他什么,我尝试了你的代码,我弄清楚问题是什么,我告诉你如何修复它。
再次强调:
当你在套接字上makefile()然后在它上面使用readlines()时,readlines()将继续读取行,直到你到达文件的末尾,在套接字的情况下它从另一端关闭。 因此,在关闭连接之前,您不会获得任何输出,因为readlines()在连接关闭之前不会停止读取行。
在这种情况下,readlines()和makefile()都没有任何意义,特别是因为你创建它并在每个命令后关闭它。只需在两端使用send()和recv()。
您可能还希望拥有某种实际的“协议”,以便服务器告诉客户“此处有响应”和“这是响应的结束”,以便客户知道。否则很难知道何时停止等待更多响应。 :)