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

Уроки по PHP, Javascript и т.п.

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

Сообщение совесть » 22 дек 2011, 22:36

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

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

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

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


рассмотрим простой пример чата, где нету ников и т.п., остальное, думаю, сами допилите)
думаю, просто код с комментариями будет понятен, если что-то не ясно, можно будет посмотреть в гугле(слава богу, информации там уйма).
 
  1. # -*- coding: utf-8 -*-
  2. from twisted.protocols import basic
  3. import json
  4. class MyChat(basic.LineReceiver):#создаем класс, тут будут обрабатываться все сообщения
  5.     clients = [] #массив, куда будут запоминаться все пользователи
  6.     def connectionMade(self):#ф-ия будет вызываться, если к нам подключились
  7.         print "Got new client!"
  8.         self.factory.clients.append(self)#добавляем юзверя в массив
  9.     def connectionLost(self, reason):#если от нас отключились
  10.         print "Lost a client!"
  11.         self.factory.clients.remove(self)
  12.     def dataReceived(self, line):#если получили что-то от кого-то
  13.         print "received", repr(line)
  14.         if line.startswith('<policy-file-request/>\x00'):#получили запрос POLICY файла
  15.             print "POLICY REQUEST"
  16.             msg = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"1025\" /></cross-domain-policy>\x00"
  17.             self.transport.write(msg)#отправляем пользователю, что все ок, и можешь к нам коннектиться и общаться
  18.             return#чтобы избежать дальнейшей проверки
  19.         try:
  20.         j = json.loads(line)#декодируем принятое сообщение
  21.             if j['type'] == "groupchat":#{"type":"groupchat","message":%сообщение%}
  22.                         snd_to_all(j)#отправляем всем сообщение(ф-я ниже)
  23.         except Exception as what:
  24.             self.message('{"error":"%s"}'%what.__str__())#если получили ошибку, отправляем пользователю что за ошибка
  25.     def snd_to_all(self,str):#а вот и ф-я отправки всем клиентам. прогоняемся по всему массиву клиентов, и отправляем им сообщение
  26.     for i in self.clients:
  27.         i.message(str)
  28.     def message(self, message):
  29.     if type(message) != type("test"):#на тот случай, если мы передаем не стринговое значение(можно было, конечно, написать != str, или "str", но не было время разбираться в каком формате ф-я type возвращает данные)
  30.         message = json.dumps(message)#переводим объект в строку
  31.         self.transport.write(message + '\n')#отправляем сообщение)
  32. from twisted.internet import protocol
  33. from twisted.application import service, internet
  34. factory = protocol.ServerFactory()
  35. factory.protocol = MyChat
  36. factory.clients = []
  37. application = service.Application("App")
  38. internet.TCPServer(1025, factory, interface='ВАШ ИП').setServiceParent(application)

вот и все. не так сложно, правда?
клиентскую часть оставлю как домашнее задание))
мы написали простой чат, где нету ников и т.п.


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



З.Ы.
 
чтобы отключить клиента:
ERROR 402, NO BEER

За это сообщение автора совесть поблагодарил:
Abarmotina
Аватара пользователя
совесть
Разработчик
Разработчик
 
Автор темы
Сообщения: 156
Зарегистрирован: 22 дек 2009, 23:58
Откуда: Санкт-Петербург
Благодарил (а): 4 раз.
Поблагодарили: 16 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



Вернуться в Уроки на другие темы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron