Согласно документам , ни TCPServer, ни BaseRequestHandler не закрывают сокет, если не будет предложено сделать это. Реализации по умолчанию handle()
и finish()
ничего не делают.
Может произойти пара вещей:
- Вы закрываете сам сокет или запрос, который его оборачивает, или вызываете
server_close
где-то.
- Возможно, истекло время ожидания сокета, и вы реализовали обработчик времени ожидания, который закрывает сокет.
- Клиент мог фактически закрывать сокет. Код действительно помог бы понять это.
Однако , мое тестирование подтверждает ваши результаты. Как только вы вернетесь с сервера handle
на сервере, независимо от того, подключаетесь ли вы через telnet или модуль Python socket
, ваше подключение будет показано удаленным хостом как закрытое. Кажется, работает обработка активности сокета в цикле внутри дескриптора:
def handle(self):
while 1:
try:
data = self.request.recv(1024)
print self.client_address, "sent", data
except:
pass
Краткий поиск кода Google подтверждает, что это типичный способ обработки запроса: 1 2 3 4 . Честно говоря, существует множество других сетевых библиотек, доступных для Python, на которые я мог бы обратить внимание, если бы столкнулся с разрывом между абстракцией SocketServer
и моими ожиданиями.
Пример кода, который я использовал для проверки:
from SocketServer import BaseRequestHandler, TCPServer
class TestRequestHandler(BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
print self.client_address, "sent", data
self.request.send(data)
class TestServer(TCPServer):
def __init__(self, server_address, handler_class=TestRequestHandler):
TCPServer.__init__(self, server_address, handler_class)
if __name__ == "__main__":
import socket
address = ('localhost', 7734)
server = TestServer(address)
server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)