[Python] Сервер многопользовательской игры

Уроки по PHP, Javascript и т.п.
Ответить
Аватара пользователя
совесть
Разработчик
Разработчик
Сообщения: 156
Зарегистрирован: 22 дек 2009, 23:58

[Python] Сервер многопользовательской игры

Сообщение совесть »

Добрый вечер!

давно не был на форуме, давно ничего не писал... вот, сбылась моя мечта, найти способ построения сокет-сервера, в интернетах толковых уроков не навшел.

цель данного урока- показать, как можно общаться через сокеты с вашим сервером. думаю, нет смысла объяснять зачем нужны сокеты, и чем они "вкуснее".

что нам понадобится:
1. Python IDE
2. библиотека Twisted для Python
3. библиотека JSON для AS3
4.(опционально) сервер VPS(заказать можно от 300р, не слишком дорого, согласитесь?)


рассмотрим простой пример чата, где нету ников и т.п., остальное, думаю, сами допилите)
думаю, просто код с комментариями будет понятен, если что-то не ясно, можно будет посмотреть в гугле(слава богу, информации там уйма).
 

Код: Выделить всё

# -*- coding: utf-8 -*-from twisted.protocols import basicimport jsonclass MyChat(basic.LineReceiver):#создаем класс, тут будут обрабатываться все сообщения    clients = [] #массив, куда будут запоминаться все пользователи    def connectionMade(self):#ф-ия будет вызываться, если к нам подключились        print "Got new client!"        self.factory.clients.append(self)#добавляем юзверя в массив    def connectionLost(self, reason):#если от нас отключились        print "Lost a client!"        self.factory.clients.remove(self)    def dataReceived(self, line):#если получили что-то от кого-то        print "received", repr(line)        if line.startswith('<policy-file-request/>\x00'):#получили запрос POLICY файла            print "POLICY REQUEST"            msg = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"1025\" /></cross-domain-policy>\x00"            self.transport.write(msg)#отправляем пользователю, что все ок, и можешь к нам коннектиться и общаться            return#чтобы избежать дальнейшей проверки        try:        j = json.loads(line)#декодируем принятое сообщение            if j['type'] == "groupchat":#{"type":"groupchat","message":%сообщение%}                        snd_to_all(j)#отправляем всем сообщение(ф-я ниже)        except Exception as what:            self.message('{"error":"%s"}'%what.__str__())#если получили ошибку, отправляем пользователю что за ошибка    def snd_to_all(self,str):#а вот и ф-я отправки всем клиентам. прогоняемся по всему массиву клиентов, и отправляем им сообщение    for i in self.clients:        i.message(str)    def message(self, message):    if type(message) != type("test"):#на тот случай, если мы передаем не стринговое значение(можно было, конечно, написать != str, или "str", но не было время разбираться в каком формате ф-я type возвращает данные)        message = json.dumps(message)#переводим объект в строку        self.transport.write(message + '\n')#отправляем сообщение)from twisted.internet import protocolfrom twisted.application import service, internetfactory = protocol.ServerFactory()factory.protocol = MyChatfactory.clients = []application = service.Application("App")internet.TCPServer(1025, factory, interface='ВАШ ИП').setServiceParent(application)
вот и все. не так сложно, правда?
клиентскую часть оставлю как домашнее задание))
мы написали простой чат, где нету ников и т.п.


запускать так:
twistd -ny ВАШ_СКРИПТ.py //если с дебаггом(вывод весь идет в консоль)
twistd -y ВАШ_СКРИПТ.py //если запустить в фоне



З.Ы.
 
чтобы отключить клиента:

Код: Выделить всё

 self.transport.loseConnection()
Ответить