Как получить IP-адрес клиента в протоколе Autobahn Wamp?

#python #python-2.7 #autobahn

#python #python-2.7 #autobahn

Вопрос:

Я использую Autobahn Wamp для подключения к сокетам в Python. Я использую механизм PubSub для установления соединения. Соединение установлено успешно.

Но я не могу найти способ поддерживать список подключенных клиентов с сервером.

Пожалуйста, кто-нибудь может предложить способ, с помощью которого я могу поддерживать список IP-адресов подключенных клиентов и способ, которым я могу отправить ответ конкретным клиентам, используя соответствующий адрес?

Пожалуйста, ответьте как можно раньше.

Заранее спасибо

Комментарии:

1. autobahn wamp v1 или v2? кроме того, как именно вы устанавливаете соединение? -g

2. версия 0.8.9. Я устанавливаю соединение следующим образом:- если len(sys.argv) > 1 и sys.argv[1] == ‘debug’: log.startLogging(sys.stdout) debug = True иначе: debug = False log.startLogging(sys.stdout) ConnectionString=»ws://» str (args.host) «:» str(args.port) factory = WampServerFactory(ConnectionString , debugWamp = True) factory.protocol = MyWampServer factory.setProtocolOptions(allowHixie76 = True) listenWS(factory) выводит «Сервер запущен в %s» % ConnectionString reactor.run()

3. я использую Wamp v1

Ответ №1:

Это вопрос из двух частей. В части первой задается вопрос о том, как определить IP-адрес для подключенных веб-сокетов. Во второй части спрашивается, как направить сообщение на конкретный сеанс. Я начну со второй части. В комментарии выше есть заводская переменная. Это можно использовать везде, где оно находится в области, подобной этому:

 factory.dispatch("http://domain.com/topic", "payload", [ excluded sessions ], [ included sessions])
  

Идентификатор сеанса выглядит следующим образом TB15LhO8oS0MLsj6 и доступен для методов в протоколе, таких как onSessionOpen, OnClose, в переменной self.session_id. Я делаю что-то вроде этого :

 ses_var = {} 
  

Поместите это в начало вашего кода, глобальную переменную. Затем в onSessionOpen():

 def onSessionOpen(self):
    global ses_var

    ses_var[self.session_id] = self
    print "connection from ", self.peer.host, self.peer.port
  

Этот код дает вам дескриптор сеанса. Вам нужно будет управлять этой переменной и удалять сеанс из переменной в методе OnClose().

Итак, если вы записали все открытые сеансы в переменной ses_var, тогда вы можете публиковать сообщения для любого (и всех) из них, используя отправку, снова:

     factory.dispatch("http://domain.com/topic", "payload", [],
      factory.sessionIdsToProtos(ses_var.keys()))
  

Обратите внимание, что session_id НЕ является ожидаемым аргументом, вы должны преобразовать идентификатор в фактический объект сеанса.

Два массива в factory.dispatch определяют, кому не отправлять сообщение, и кому отправлять сообщение. Если вы передадите None в качестве второго массива, вы отправите сообщение всем клиентам, поэтому отправку для примера можно переписать как:

     factory.dispatch("http://domain.com/topic", "payload", [], None)
  

Если вы хотите отправить его на первый сеанс (например), вы могли бы сделать:

     factory.dispatch("http://domain.com/topic", "payload", [],
         factory.sessionIdsToProtos([ses_var[0].session_id]))
  

Комментарии:

1. Привет, Грег. Большое спасибо за ваш ответ. У меня возникла проблема с поиском «self.peer.host». Кроме того, я хотел бы знать, какую функцию написать на стороне клиента (html), чтобы получить данные, отправленные с сервера.

2. Привет. Я решил проблему, касающуюся узла. Было бы здорово, если бы вы предоставили мне способ отображения сообщения, отправленного с сервера клиенту на стороне клиента (Html)

3. Пожалуйста, примите этот ответ, если он ответил на ваши первоначальные опубликованные вопросы. Вы можете задать другой вопрос о HTML на стороне клиента. -g