2014-01-09 4 views
0

Я довольно новичок в Python и беру некоторые курсы онлайн-безопасности. Должен признаться, что вся концепция классов не кристально чиста, поэтому, вероятно, поэтому я не полностью понимаю концепцию. С сайта python.org они говорят:Python SocketServer - Назначение подкласса BaseRequestHandler

Создание сервера требует нескольких шагов. Во-первых, вы должны создать класс обработчика запросов путем подкласса класса BaseRequestHandler и , переопределяя его метод handle(); этот метод будет обрабатывать входящие запросы . Во-вторых, вы должны создать экземпляр одного из классов сервера, , передавая ему адрес сервера и класс обработчика запроса.

Может кто-нибудь объяснить это лучше? Почему вы должны создать подкласс? Я могу понять силу использования классов с теоретической точки зрения, я просто недостаточно использовал их в своих тестовых сценариях, чтобы получить этот момент «ах-ха». Вот сценарий от курса я беру:

#!/usr/bin/python 
import SocketServer 

class EchoHandler(SocketServer.BaseRequestHandler): 
    def handle(self): 
     print "Got Connection from : ", self.client_address 
     data = 'dummy' 

     while len(data): 
      data = self.request.recv(1024) 
      print "Client sent: " + data 
      self.request.send(data) 
     print "client left" 

serverAddr = ("0.0.0.0", 9000) 

server = SocketServer.TCPServer(serverAddr, EchoHandler) 
server.serve_forever() 
+0

Возможно, это не яблоки для яблок, но в концепции это похоже на использование чего-то вроде: от потоковой импорта Thread и import threading? Когда я пишу это, я не уверен, что аналогия даже отдаленно подобна, но является ли SocketServer.BaseRequestHandler формой структуры, которую вы используете в разделе подкласса для вызова? – user2565554

ответ

1

SocketServer.BaseRequestHandler шаблон, который обрабатывает под капотом обработки. Но на самом деле он ничего не делает с запросами.

Подкласс позволяет использовать этот шаблон, добавляя только часть, специфичную для вашей реализации, но при этом сохраняющую всю силу базы. Вы определяете def handle(self) и выполняете конкретную обработку необходимых данных.

1

BaseRequestHandler обрабатывает запросы на ваш сервер. Чтобы получить доступ к этому классу, вам необходимо создать подкласс, который (в силу того, что он является подклассом) предоставит вам доступ к различным методам BaseRequestHandler, которые вам нужно получить, чтобы обрабатывать запросы на вашем сервере. Посмотрите на BaseRequestHandler класса from the source, и обратите внимание, что метод ручка просто имеет pass, как она стоит (и так ничего не делает):

class BaseRequestHandler: 

    """Base class for request handler classes. 

    This class is instantiated for each request to be handled. The 
    constructor sets the instance variables request, client_address 
    and server, and then calls the handle() method. To implement a 
    specific service, all you need to do is to derive a class which 
    defines a handle() method. 

    The handle() method can find the request as self.request, the 
    client address as self.client_address, and the server (in case it 
    needs access to per-server information) as self.server. Since a 
    separate instance is created for each request, the handle() method 
    can define arbitrary other instance variariables. 

    """ 

    ... 

    def handle(self): 
     pass 

    ... 

Ваш код должен сделать этот handle метод сделать что-то, и вы делаете это, создавая подкласс BaseRequestHandler.

Смежные вопросы