Форум сайта python.su
0
Здравствуйте. С питом начал знакомство совсем недавно, начал разбирать с фреймворком twisted скачал пример реализации сервера чата:
"""The most basic chat protocol possible.
run me with twistd -y chatserver.py, and then connect with multiple
telnet clients to port 1025
"""
from twisted.protocols import basic
class MyChat(basic.LineReceiver):
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 lineReceived(self, line):
print "received", repr(line)
for c in self.factory.clients:
c.message(line)
def message(self, message):
self.transport.write(message + '\n')
from twisted.internet import protocol
from twisted.application import service, internet
factory = protocol.ServerFactory()
factory.protocol = MyChat
factory.clients = []
application = service.Application("chatserver")
internet.TCPServer(1025, factory).setServiceParent(application)
Отредактировано (Янв. 14, 2012 23:01:36)
Офлайн
25
Вопрос не понятен - Twisted как раз неблокирующие сокеты создает.
Если нужен второй чат сервер на той же машине - то нужно менять порт, два процесса не могут слушать один и тот же TCP порт.
Отредактировано (Янв. 15, 2012 01:54:28)
Офлайн
0
s0rg - “два процесса не могут слушать один и тот же TCP порт.”
Ошибаетесь, могут. Например в PHP - это будет что-то типа:
socket_set_nonblock($socket)
или
socket_set_option($sock, SOL_SOCKET, SO_REUSEPORT, 1)
В документации по Twisted ничего подобного не смог найти. Неужели никто не сталкивался с этим?
Офлайн
25
dobryakSO_REUSEPORT / SO_REUSEADDR следует применять только чтобы обеспечить безпроблемный перезапуск приложения.
Ошибаетесь, могут.
Офлайн
0
s0rgВ PHP фреймверке phpdaemon, реализованно именно так. В каждом воркере инициализируется например HTTP сервер и биндится к сокету. Далее при коннекте клиента в воркере проверяется может ли он обслужить этого клиента (Сверяется количетсво клиентов которое он уже обслуживает с макс заданым количеством) и аццептит соединение, таким вот образом происходит балансировка.
В других случаях - это быдлокод имхо.
Офлайн
25
dobryakЗачем???
А реализацию каждый инстанс чата на отдельном порту
Офлайн
0
s0rgМаштабируемость
Зачем???
Офлайн
25
Может, сначала стоит прочитать доку по Twisted и разобраться как он работает?
Офлайн
0
s0rgПотэтому я и обратился к Вам, потому как не нашел в док то, что мне нужно, а разбираться в исходниках твистеда займет много времени. Объясните тогда, пожалуйста, каким образом я смогу маштабировать приложение вот даже на этом примере сервера для чата? Заранее благодарен!
Может, сначала стоит прочитать доку по Twisted и разобраться как он работает?
Офлайн
2
dobryak
У Вас какая-то очень наваристая каша в голове:-)
Неблокирующий сокет это вовсе не то, что Вы подразумеваете. Неборкирующими становятся операции над ним (чтение, запись и т.д.), а не возможность биндить его адрес и порт из разных процессов. Twisted использует неблокирующий сокет по прямому назнаения – осущеставляет неблокирющий ввод/вывод.
Возможность задать сокету не эксклюзивный бинд, это совершенно иная задача. И это не рекомендуется для промышленного использования в том виде, в котором этого хотите Вы.
И кстати, как можно судить по документации php – приведенные Вами функции как раз делают эти две абсолютно разные операции над сокетами.
Правильный способ, которым пользуются многие веб и иные серверы – забиндить сокет один раз в одном процессе и потом разфоркаться. Тогда все дочернии процессы получают копию этого сокета и могут на нем принимать новые соединения. Именно этот способ Вам нужно использовать для реализации “воркеров” чата.
Офлайн