【问题标题】:Python server / client remote execute problem [duplicate]Python服务器/客户端远程执行问题[重复]
【发布时间】:2011-01-25 14:23:36
【问题描述】:

我正在处理一个遇到问题的 Python 项目。我问了很多人,但他们似乎无法帮助我:/ 我正在编写一个执行系统命令的小程序。这个想法是一台机器打开服务器,另一台打开客户端并连接到IP /端口。从那里他们可以执行系统命令并获得输出。唯一的问题是,每当我运行服务器时,它都会成功打开,然后当我打开客户端并连接到服务器时,我会得到 shell,但是当我输入命令时,它会一直挂起,直到服务器关闭,然后我会得到命令的输出客户。

服务器.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()

客户端.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()

【问题讨论】:

  • 你在这个话题上基于yourpreviousquestions尝试了什么?您的代码看起来与您之前发布的代码大体相似,并且有很多答案建议您尝试不同的方法。
  • 我已经尝试了很多,但似乎都没有。
  • 在客户端,我会将 makefile 拉出循环并确保刷新发送的内容——我想你可能想在服务器上做类似的事情,确保你在哪里刷新您希望两者进行交流...
  • 我对两者都这样做了,但它仍然没有解决任何问题。

标签: python sockets client


【解决方案1】:

我在你之前的问题的这个答案中准确地告诉了你问题是什么:

Python - Server and client problems

我不是在开玩笑什么的,我试过你的代码,我找出了问题所在,我告诉你如何解决它。

再次强调:

当你在套接字上 makefile() 然后在它上面使用 readlines() 时,readlines() 将继续读取行,直到你到达文件的末尾,在套接字的情况下,当它从另一端关闭时。 因此在连接关闭之前您不会得到任何输出,因为 readlines() 在连接关闭之前不会停止读取行。

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

您可能还希望有某种实际的“协议”,以便服务器告诉客户端“这里有一个响应”和“这是响应的结束”,以便客户端知道。否则很难知道何时停止等待更多响应。 :)

【讨论】:

  • 我知道,但这对我来说毫无意义。我是 Python 套接字的新手,我真的不知道如何使用它们。我尝试在服务器中取出 while true: 语句中的代码并将其替换为 s.recv(1024) 然后 s.send(1024) 但它不起作用,因为我得到了一个损坏的管道。你能解释一下我如何对菜鸟这样做吗?
  • @AustinM:首先,你可以在上一个问题中说你没看懂。请删除此重复项。其次:您从删除所有 makefile 以及 readlines 和 writelines 开始,然后尝试仅使用 send() 和 recv() 执行您想要的操作。这样做你会学到很多东西。你需要明白你在做什么,如果我写你的代码,你就不会那样做。
  • 我不是要你写我的代码,我是要详细说明我将如何处理 send() 和 recv()。现在我只是和他们一起玩,看看我能做什么,但没有运气。我尝试将 cmd 声明为 s.recv() 然后用 os.system() 执行它并发送它,但也没有运气。
  • @AustinM:你使用 send()send 和使用 recv()recieve。很简单。 “我尝试将 cmd 声明为 s.recv()”我不知道你在这里想说什么,这句话毫无意义。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
相关资源
最近更新 更多