【问题标题】:Python - Server and client problemsPython - 服务器和客户端问题
【发布时间】:2011-01-16 01:09:17
【问题描述】:

我正在尝试创建一个基本的服务器和客户端脚本。这个想法是客户端可以连接到服务器并执行命令。有点像 SSH,但非常简单。这是我的服务器代码:

import sys, os, socket


host = ''                
port = 50103
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', 0)
            fl.writelines(rl[:-1])
            fl.close()
    except IOError:
            conn.close()

这是我的客户:

import sys, socket
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())
    file.close()

这是我的问题。我启动服务器,然后在同一台机器上运行客户端。我输入端口并连接。然后我得到raw_input,它是'$'。如果我键入像“ls”这样的命令,它只会挂在客户端。我必须退出服务器才能让客户端接收 ls 的输出。顺便说一句,我正在运行 Ubuntu Linux。不确定这是否重要。

【问题讨论】:

  • 现在我还是为你写了代码。答案已更新。你仍然可以用 ssh 做任何你想做的事情,你知道的。
  • 请不要重新发明 SSH。一些可怜的家伙将不得不支持和维护它!

标签: python connection client


【解决方案1】:

当你在套接字上 makefile() 然后在它上面使用 readlines() 时,它会一直持续到你到达文件的末尾,在套接字的情况下,它是从另一端关闭的。

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

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

更新一个有效的例子:

server.py:

import sys, os, socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 50500))
print("Server started")
s.listen(1)
while True:
    print "Accepting"
    conn, addr = s.accept()
    print 'New connection from ', addr
    while True:
        try:
            rc = conn.recv(1024)
            print "Command", rc
            if not rc.strip():
                continue

            if rc.strip() == 'END':
                print "Close"
                conn.send("**END**")
                conn.close()
                break
            else:
                conn.send("This is the result of command %s\n" % rc)
        except Exception:
            conn.close()
            sys.exit()

client.py

import sys, os, socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 50500))
while True:
    cmd = raw_input('$ ')
    s.send(cmd) 
    result = s.recv(1024)
    print result
    if result == "**END**":
        print "Ending"
        break

【讨论】:

  • 谢谢。虽然它不起作用,因为我没有得到输出。我一直在玩代码。我做到了,所以它执行 output = os.system(rc),然后在下面我做了 conn.send(output)。所以现在它在服务器端执行命令,但不发送到客户端。有什么想法吗?
  • @AustinM:那么,发送它怎么样?而且您仍然可以通过键入“ssh ”来完成您现在正在尝试做的事情,但您仍然没有解释为什么不这样做。
  • 我确实尝试发送它我在输出设置为 os.system(rc) 时执行 conn.send(output)。这是一个我需要完成的简单项目。
  • @AustinM: os.system(rc) 将运行命令 rc。如果命令成功与否,它将返回。它不会返回输出。改用子流程。阅读文档,好吗?并确保变量包含您认为它们包含的内容。编程不是猜谜游戏。你不能只是去“我猜 os.system(rc) 返回输出”,你必须检查。显然,您发送东西时对您发送的内容一无所知。你为什么期望它起作用?这不是魔法咒语。
  • @AustinM:如果你需要完成这个项目:这样做ssh <theothercomputer>。登录,现在您有一个提示,它完全执行您在此处尝试执行的操作并且失败了。
【解决方案2】:

一方面,您只在客户端连接一次,而在服务器上,您在每次读取后关闭套接字。

你应该看看这个例子。

http://ilab.cs.byu.edu/python/socket/echoserver.html

你做错了很多事情。

【讨论】:

  • 谢谢。我已经尝试更新代码,但无论我尝试什么,它都会挂在客户端:/ 我已经尝试在该示例中实现一些东西,但它仍然无法正常工作。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多