World of Warcraft — логин сервер написаный на Python-е. Часть 1.
Написал: Евгений Фомин в категорию Linux & Игры, Python, Python: Статьи, WoW, tags: games, Python, WoWДавненько я обещал в этой заметке что опишу процесс создания логин сервера на 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): |
. Про инициализацию я дума сильно расписывать ненужно кому надо сам может найти описания данного «таинства».
Продолжение.