[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Общий форум » Python » Сетевая библиотека PodSixNet (Просто и в тему)
Сетевая библиотека PodSixNet
k0tДата: Вторник, 15.01.2013, 18:01 | Сообщение # 1
Подполковник
Группа: Пользователи
Сообщений: 104
Награды: 0
Репутация: 4
Статус: Offline
Я пишу небольшую игрушку, и мне понадобилась сетевая библиотека.
Варианты были:
1. Написать самому, отмел - т.к. времени итак немного. Возможно, позже заморочусь, но если это будет работать нормально - то зачем? smile
2. Взять готовую и известную библиотеку. Остановился на Twisted сначала, даже приспособил кое-как. Результат - куча лишнего кода и необходимость дорабатывать библиотеку еще и еще. Отмел. Хотя в другом проекте использовать буду, скорее всего.
3. Поискал получше. Нашел PodSixNet. Остановился, присмотрелся.

Оказалось, что автор думал также, как и я, но опыта у него было побольше, и он написал свою библиотеку, заточенную на мультиплеер.
С ее помощью можно легко и непринужденно передавать питоновские структуры данных, чего мне не хватало в twisted, а сам код получается легкий и понятный. Документации, можно сказать, нет, но немного усилий - и все работает.

Для начала покажу, как создать простой сервер и не менее простой клиент.
Итак, приступим. Сервер.
Сервер должен принимать сообщения от клиента и давать какой-то ответ. Пока что остановимся на первом: пусть он просто висит и принимает сообщения.
Для начала - нужные импорты!
Код
from PodSixNet.Channel import Channel
from PodSixNet.Server import Server
from time import sleep

Надо объяснять? Думаю, что все понятно. Импортируем парочку базовых классов.

Теперь создаем свои классы...
Код
class ClientChannel(Channel):
       def Network(self, data):
           print data
       def Network_myaction(self, data):
           print "We are Borg!"

Что делает данный класс? Когда бы то клиент не послал данные (что-то вроде "connection.Send(mydata)"), выполняется Network. Если в данных есть ключ под названием "action", то вызывается функция Network_myaction, где myaction - значение ключа.
Пример, mydata = {"action": "myaction", "blah": 123, ... }
Думаю, все ясно.
Теперь создадим класс сервера.
Код
class MyServer(Server):
       channelClass = ClientChannel
       def Connected(self, channel, addr):
           print 'new connection:', channel

Первая строка - используем свой кастомный канал, функция Connected вызывается при подключении нового клиента.

Ну и финал, надо всю эту штуку запустить.
Код
def main():
       print 'start'
       myserver = MyServer()
       while True:
           myserver.Pump()
           sleep(0.0001)

if __name__ == '__main__':
       main()

myserver.Pump() - собственно, получаем данные. Также в данном loop вполне можно реализовать игровую логику сервера. В общем и целом, готово.

Теперь клиент.

Импорты:
Код
from PodSixNet.Connection import ConnectionListener, connection

Используем единственный класс в модуле для создания своего listener:
Код
class MyListener(ConnectionListener):

       def Network(self, data):
           print 'network data:', data

       def Network_connected(self, data):
           print "connected to the server"

       def Network_myaction(data):
           print "myaction:", data

Собственно, первая функция вызывается при любом телодвижении, вторая - при получении от сервера данных с action равным myaction.
Осталось запустить наше творение в свободное плавание -
Код
c = MyListener()
c.Connect()
connection.Send({"action": "myaction", "blah": 123, "things": [3, 4, 3, 4, 7]})

while 1:
       connection.Pump()
       c.Pump()

Создаем новый listener, подсоединяем его, отправляем тестовое сообщение. Отсылать сообщения могут оба соединения, и connection (встроенный сингленгтон) и наш собственный, но на сайте библиотеки рекомендуют использовать именно connection. Пока не до конца разобрался с этим делом smile

Да, если что - сервер посылает сообщения примерно также - channel.Send({"action": "my_action", "something": 10})

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


Сообщение отредактировал k0t - Вторник, 15.01.2013, 18:09
 
serg-kkzДата: Вторник, 15.01.2013, 18:22 | Сообщение # 2
Генерал-лейтенант
Группа: Модераторы
Сообщений: 690
Награды: 3
Репутация: 16
Статус: Offline
Немножко не в том разделе, нужно было в примеры кода.

ООП  -  
 
ninthДата: Вторник, 15.01.2013, 23:29 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Не, я думаю всё правильно. Или здесь или в полезности - эта библиотека к Панде непосредственно не относится.
 
Форум Panda3D - по русски » Общий форум » Python » Сетевая библиотека PodSixNet (Просто и в тему)
Страница 1 из 11
Поиск: