2017-01-14 6 views
0

Я пытаюсь создать простой сервер, получающий опцию и возвращающий метод.Python socket с методами

Так что я искал несколько примеров, и я нашел, что это один:

def start_server(ip="0.0.0.0", port=8820): 
    sock = socket.socket() 
    sock.bind((ip, port)) 
    sock.listen(1) 
    print "Server started listening on %s:%d" % (ip, port) 

    return sock 


def new_client(sock): 
    c_sock, c_addr = sock.accept() 
    print "got new client %s" % c_addr 

    return c_sock, c_addr 

Как создать сервер и клиент звонков начала?

Я хочу, чтобы клиент отправил опцию, и сервер вернет метод с циклом, который заканчивается вызовом метода quit.

как пример метода, если клиент нажал "имя":

def get_name(): 
    return "My name is Server!" 

спасибо!

+0

вы можете использовать 'socketserver' https://docs.python.org/2/library/socketserver.html (и есть хорошие примеры) – rsm

+0

спасибо, но это мне не поможет понять, где я должен положить цикл while-True (на клиенте или на сервере?) и как правильно называть методы –

+0

построить обычный веб-сервер, и у вас будет меньше проблем. вы можете использовать 'flask',' bottle', 'django' и т. д. – furas

ответ

0

Вот небольшой пример, который создает сервер «эхо». (Это просто посылает все данные, которые он получает от клиента к клиенту.)

Добавьте это к концу существующего кода:

import select 
def main(): 
    lsock = start_server() 
    rfds=[lsock] 
    while True: 
     readyfds, _, _ = select.select(rfds, [], []) 
     for fd in readyfds: 
      if fd == lsock: 
       csock, caddr = new_client(lsock) 
       rfds.append(csock) 
      else: 
       rdata = fd.recv(1024) 
       if rdata: 
        print("Got some data from client socket %s" % fd) 
        # Send data back to client 
        fd.send(rdata) 
       else: 
        print("Client socket closed %s" % fd) 
        rfds.remove(fd) 
        fd.close() 

main() 

Аннотация: Мы используем select здесь, чтобы один поток, чтобы ждать нескольких дескрипторов файлов сразу. Всякий раз, когда запрос на подключение приходит от клиента, гнездо для прослушивания становится «готовым»; мы затем принимаем соединение и добавляем новый сокет в набор дескрипторов в нашем списке выбора.

Когда мы получаем данные из любого другого сокета, мы вызываем recv. Если это удастся, мы отправим те же данные обратно клиенту (очевидно, реальный сервер сделает что-то более полезное с данными). Если recv возвращает ноль, это означает, что клиент закрыл сокет, поэтому мы удалим дескриптор из списка выбора.

Еще одна вещь: В строке print "got new client %s" % c_addr, c_addr есть кортеж (адрес и порт), поэтому форматирование выходит из строя из-за TypeError: not all arguments converted during string formatting. Легко исправить это: print "got new client %s" % str(c_addr)