Python - 服务器和客户端问题

时间:2011-01-16 01:09:18

标签: python connection client

我正在尝试创建基本的服务器和客户端脚本。这个想法是客户端可以连接到服务器并执行命令。有点像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。不确定这是否重要。

2 个答案:

答案 0 :(得分:2)

当你在套接字上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

答案 1 :(得分:1)

嗯,有一件事你只是在客户端上连接一次,而在服务器上,你在每次阅读后关闭套接字。

你应该看看这个例子。

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

你做错了很多事。