Я пишу клиент-серверное приложение в Python, и я считаю необходимым получить новое соединение с сервером для каждого запроса от клиента. Мой сервер просто наследовался TCPServer, и я наследовался BaseRequestHandler, чтобы сделать мою обработку. Я не называю self.request.close () нигде в обработчике, но так или иначе сервер, кажется, зависает на моем клиенте.Как дела?
Вот небольшая вариация вашего второго варианта. Создайте себе ресурс процессора QuureMaker. ПОМЕСТИТЕ ваши параметры в него и дайте ему возможность перенаправить вас на временный ресурс запроса, который вернет ваши результаты.
POST /QueryMaker
Body: Big Json representation of parameters
303: See Other
Location: http://example.org/TemporaryQueries/123213
-121--2224501- Существует панель инструментов генератора отчетов Matlab, которая может сделать это очень просто. Конечно, это стоит денег.
Можно попытаться записать текст разметки из Matlab, а затем преобразовать его в PDF с помощью других инструментов. Возможные конвертеры:
Если вы этого не хотите, ознакомьтесь с документацией 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
является только сокетом, используемым для обработки запроса.
Так что ответ на мой вопрос - «Да».
Я думал получить ServletContext () тогда использование realPath () может работать, но я не имеют ссылки на ServletContext
Да. Обратитесь к разделу (")/getServletContext ()
-121--2758847- Вне интереса, использовать список < строка >
? Поскольку в .net 3,5 SP1 можно использовать метод HashSet и метод HashWith . Насколько я понимаю, HashSets специально оптимизированы для сравнения двух наборов.
Вы уверены, что клиент не повесил трубку на сервере? Это слишком расплывчато, чтобы действительно сказать, что происходит, но обычно сервер, который принимает данные от клиента, выходит из соединения чтения не возвращает никаких данных.
В соответствии с документами , ни 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)
, следующий код не работает при закрытии узла
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
Кроме:
печать "кроме"
ломать
reuseaddr
не работает, так как уже слишком поздно после привязки server.socket.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)