socket.send работает только один раз в коде Python для эхо-клиента - PullRequest
4 голосов
/ 01 декабря 2011

У меня есть следующий код для эхо-клиента , который отправляет данные на эхо-сервер с использованием сокетного соединения:

echo_client.py

import socket

host = '192.168.2.2'
port = 50000
size = 1024

def get_command():
    #..Code for this here

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
while 1:
    msg = get_command()
    if msg == 'turn on':
        s.send('Y')
    elif msg == 'turn off':
        s.send('N')
    elif msg == 'bye bye':
        break   
    else:
        s.send('X') 
    data = s.recv(size)
    print 'Received: ',data

s.close()

echo_server.py

import socket 

host = '' 
port = 50000 
backlog = 5 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
while 1: 
    client, address = s.accept() 
    data = client.recv(size) 
    if data: 
        client.send(data) 
client.close()

Проблема, с которой я сталкиваюсь, заключается в том, что в клиенте s.send работает только в первый раз хотя его в бесконечном цикле.Клиент аварийно завершает работу с тайм-аутом соединения, через некоторое время после завершения первой отправки / получения .

Почему s.send работает только один раз?Как я могу исправить это в моем коде?

Пожалуйста, помогите Спасибо

Ответы [ 2 ]

5 голосов
/ 01 декабря 2011

Код вашего сервера вызывает recv только один раз. Вам следует позвонить accept один раз, если вы хотите получить только одно соединение, но затем вам нужно зациклить вызов recv и send.

1 голос
/ 01 декабря 2011

Ваша проблема в том, что вы блокируете accept внутри цикла сервера.

Это означает, что сервер будет принимать соединения от более чем одного клиента.Если вы хотите, чтобы каждый клиент отправлял несколько команд, вам нужно будет создать новый поток (или процесс) после принятия с новым циклом while (для связи с клиентом) в этом потоке / процессе.

Чтобы ваш пример работал только с одним клиентом, вам нужно переместить команду accept вне цикла, например:

client, address = s.accept() 
while 1: 
    data = client.recv(size) 
    if data: 
        client.send(data) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...