TCPServer + BaseRequestHandler в SocketServer Python закрывают сокет после каждого вызова для обработки ()?

Я пишу клиент-серверное приложение в Python, и я считаю необходимым получить новое соединение с сервером для каждого запроса от клиента. Мой сервер просто наследовался TCPServer, и я наследовался BaseRequestHandler, чтобы сделать мою обработку. Я не называю self.request.close () нигде в обработчике, но так или иначе сервер, кажется, зависает на моем клиенте.Как дела?

10
задан Jeff Hammerbacher 14 January 2010 в 19:09
поделиться

4 ответа

Вот небольшая вариация вашего второго варианта. Создайте себе ресурс процессора QuureMaker. ПОМЕСТИТЕ ваши параметры в него и дайте ему возможность перенаправить вас на временный ресурс запроса, который вернет ваши результаты.

POST /QueryMaker
Body: Big Json representation of parameters

303: See Other
Location: http://example.org/TemporaryQueries/123213
-121--2224501-

Существует панель инструментов генератора отчетов Matlab, которая может сделать это очень просто. Конечно, это стоит денег.

Можно попытаться записать текст разметки из Matlab, а затем преобразовать его в PDF с помощью других инструментов. Возможные конвертеры:

  • запишите LaTeX, затем используйте Pdf LaTeX для создания PDF
  • Запись reStructuredText, затем используйте Python docutils для создания PDF
  • Запись DocBook XML, затем используйте любой конвертер DocBook в PDF
  • Запись HTML, затем распечатайте его с помощью браузера

Если вы этого не хотите, ознакомьтесь с документацией Matlab. Вы можете указать размер/разрешение изображения для опубликованных фигур, и я думаю, что существует возможность вставки разрывов строк.

-121--4904215-

Хорошо, я прочитал код (на моем Mac, SocketServer.py находится по адресу/System/Library/Framework/Python.framework/Versions/2.5/lib/python2.5/).

TCPServer действительно закрывает соединение. В BaseServer.handle _ request вызывается process _ request , вызывающий close _ request . В классе TCPServer close _ request вызывает self.request.close () , а self.request является только сокетом, используемым для обработки запроса.

Так что ответ на мой вопрос - «Да».

9
ответ дан 3 December 2019 в 17:58
поделиться

Я думал получить ServletContext () тогда использование realPath () может работать, но я не имеют ссылки на ServletContext

Да. Обратитесь к разделу (")/getServletContext ()

-121--2758847-

Вне интереса, использовать список < строка > ? Поскольку в .net 3,5 SP1 можно использовать метод HashSet и метод HashWith . Насколько я понимаю, HashSets специально оптимизированы для сравнения двух наборов.

-121--2433209-

Вы уверены, что клиент не повесил трубку на сервере? Это слишком расплывчато, чтобы действительно сказать, что происходит, но обычно сервер, который принимает данные от клиента, выходит из соединения чтения не возвращает никаких данных.

0
ответ дан 3 December 2019 в 17:58
поделиться

В соответствии с документами , ни 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 Code Search подтверждает, что это типичный способ обработки запроса: 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)
6
ответ дан 3 December 2019 в 17:58
поделиться
  1. tcpserver действительно закрывает соединение каждый раз после 'handle'
  2. , следующий код не работает при закрытии узла

     def handle (self):
    а 1:
    пытаться:
    данные = self.request.recv (1024)
    напечатать self.client_address, «отправлено», данные
    Кроме:
    проходят
    

    это может быть лучше:

     def handle (self):
    а (1):
    пытаться:
    self.data = self.request.recv (1024)
    если не self.data:
    напечатать "% s close"% self.client_address [0]
    ломать
    print "% s написал:"% self.client_address [0], self.data
    Кроме:
    печать "кроме"
    ломать
    
    1. reuseaddr не работает, так как уже слишком поздно после привязки
     server.socket.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
7
ответ дан 3 December 2019 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: