Я занимаюсь программированием сокетов в Python.Но у меня возникли проблемы с выяснением того, как мой эхосервер мог заметить, что эхоклиент закрыл соединение, без постоянного пинга / понга или тайм-аута.
echoclient.py
#echoclient
import sys
import socket
import os
import datetime
def log(s):
return datetime.datetime.now().strftime('%H:%M:%S') + ' - ' + s
s = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 9000))
while 1:
try:
foo = raw_input('what do you want to send?: ')
if len(foo) > 0:
s.send(foo)
except KeyboardInterrupt:
print 'shutting down connection'
s.close()
break
data = s.recv(1024)
if data:
print log('Recieved'), repr(data)
echoserver.py
#echoserver
import sys
import socket
import os
import datetime
def log(s):
return datetime.datetime.now().strftime('%H:%M:%S') + ' - ' + s
port = 9000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', port))
s.listen(5)
while 1:
conn, addr = s.accept()
conn.settimeout(10)
print 'Connected by', addr
while 1:
try:
data = conn.recv(1024)
if data:
print log(repr(data))
conn.send(data)
except KeyboardInterrupt:
print 'Closing connection ', addr
conn.close()
sys.exit(1)
except:
print 'Exception caught! closing connection ', addr
conn.close()
break
Теперь сервер знает, что клиент умер, только с помощью conn.settimeout (10)
Как получить исключение для моегосервер, когда клиент отключается, предпочтительно без сообщения ping / pong между ними или settimeout.
Мой следующий шаг - создать echoproxy между echoclient и echoserver, мне нужно будет использовать потоки/ многопроцессорность для достижения этой цели?Любые советы или указатели?
Любые комментарии по поводу плохих / хороших практик приветствуются
Спасибо!