Python - проблемы с сервером и клиентом - PullRequest
0 голосов
/ 16 января 2011

Я пытаюсь создать базовый сервер и клиентский скрипт. Идея заключается в том, что клиент может подключиться к серверу и выполнять команды. Вроде как 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 ]

2 голосов
/ 16 января 2011

Когда вы выполняете 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 голос
/ 16 января 2011

Ну, во-первых, вы подключаетесь к клиенту только один раз, а на сервере вы закрываете сокет после каждого чтения.

Вы должны взглянуть на этот пример.

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

Вы делаете несколько вещей неправильно.

...