Форум сайта python.su
Есть серверное приложение, принимает данные с клиентов.
В приложении есть несколько conn.recv().
Время от времени ожидание данных сильно затягивается и тормозит весь процесс.
Подскажите, есть ли какой-то вариант закрыть коннект через какое-то время?
Отредактировано xxnikolayxx (Июнь 28, 2013 04:44:05)
Офлайн
Офлайн
s0rgНе совсем.
Это?
conn, addr = s.accept()
conn, addr = s.accept()
Отредактировано xxnikolayxx (Июнь 29, 2013 06:16:09)
Офлайн
Так таймаут предлагается ставить не на слушающий сокет, а на подключение к клиенту
conn, addr = s.accept() conn.settimeout(3.0)
Офлайн
reclosedevВ этом случае таймаут отдается при ожидании коннекта клиента.
.recv()
while True: conn, addr = s.accept() data = conn.recv(1024) # Тут может быть большая задержка и нужно в случае задержки закрыть коннект conn.send('что-то') data = conn.recv(1024) # Тут может быть большая задержка и нужно в случае задержки закрыть коннект conn.close()
Отредактировано xxnikolayxx (Июнь 29, 2013 11:16:59)
Офлайн
xxnikolayxxПод подключением клиента я имел ввиду его сокет, который conn.
С коннектом все нормуль.
Проблемма возникает после отправки чего-то клиенту.
xxnikolayxxserver.py
]пришлите пожалуйста не большой пример.
import socket import time timeout = 2.0 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', 11000)) s.listen(1) while True: conn, addr = s.accept() conn.settimeout(timeout) try: data = conn.recv(1024) conn.send('ok') except socket.timeout: print addr, 'timeout' else: print addr, 'doing something with', data finally: conn.close()
import socket import time delay = 3.0 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('localhost', 11000)) time.sleep(delay) s.sendall('hello') resp = s.recv(512) print resp
Отредактировано reclosedev (Июнь 29, 2013 12:10:36)
Офлайн
reclosedevПрекрассный ответ, наверно самый лучший, который я когда либо получал на форумах =)
Офлайн