Давненько я обещал в этой заметке что опишу процесс создания логин сервера на Python-е для World of Warcraft. Вот и начинаю цикл статей на эту тему.
Итак с чего начать? Просто надо понимать как работают сокеты. :)
Приведу маленький код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# main server
class WoWLoginServer(Thread):
    """ Главный класс логин сервера для MMORPG World of Warcraft
    """
    db=''
    def __init__(self,port=3724):
        Thread.__init__(self)
        self.clist = {}
        self.ccount = 0
        global lssoketevent
        lssoketevent={}
 
        # ... код опущен 
 
        if pywowport!="":
            self.port=int(pywowport)
        else:
            self.port=int(port)
 
        self.servsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
        self.servsock.setsockopt(socket.SOL_SOCKET,socket.SO_KEEPALIVE,1)
        self.servsock.setblocking(0)
        self.servsock.bind(('',self.port))
        self.servsock.listen(10)
 
        # ... код опущен
 
    def run(self,timeout=1):
        while 1:
            try:
                input,output,exc = select.select(self.clist,[],[],timeout)
            except:
                return
            for sock in input:
                if sock == self.clist[self.servsock.fileno()].server.fileno():
                    self.accept_new_connection()
                else:
                    self.read_handlers(sock)

Самое основное что нам нужно понять в приведенном выше коде как это все работает. Этот отрывок кода из моей программы иллюстрирует работу с сокетами (соекты как будет вам известно основной механизм работы с сетью Unix, Linux-систем), а теперь по коду, начнем с конца. Главная процедура

   def run(self,timeout=1):

в данной процедуре бесконечный цикл пока(while 1:) в котором проверяется наличие пришедших новых пакетов для установки соединения и пакетов от клиентов уже установивших соединение.

 input,output,exc = select.select(self.clist,[],[],timeout)

— это собственно и есть механизм обработки потоков нас интересует только input, поэтому есть цикл

for sock in input:

в котором проверяется принадлежность пришедшего пакета к новому соединению

self.accept_new_connection()

, где происходит добавление нового клиента(его адреса и номера сокета) в словарь

self.clist={}

или уже установленному

self.read_handlers(sock)

, где происходит чтение и анализ поступившего пакета.
Естественно чтобы все это могло работать сокеты нужно инициализировать за это отвечает процедура

    def __init__(self,port=3724):

. Про инициализацию я дума сильно расписывать ненужно кому надо сам может найти описания данного «таинства». :)
Продолжение.

Комментарии закрыты.

Теперь у меня есть персональная страница на Я.ру — theblackravan!

Я.ру - это новый сервис Яндекса, на котором делятся с друзьями самым интересным, знакомятся, дружат или ссорятся, вывешивают фотки, комментируют свои, чужие записи, обмениваются ссылками и рассказывают о своем настроении.