Реализован ли клиент WebSocket для Python? [закрыто]

101

Я нашел этот проект: http://code.google.com/p/standalonewebsocketserver/ для сервера WebSocket, но мне нужно реализовать клиент WebSocket на python, точнее, мне нужно получить некоторые команды от XMPP на моем сервере WebSocket.

Diegueus9
источник
2
Попробовать автобан? tavendo.de/autobahn
Лен Холгейт
3
Поскольку Autobahn основан на Twisted, стоит также отметить, что Twisted также имеет очень хорошую поддержку XMPP, то есть metajack.im/2008/09/04/… Таким образом, вы можете запустить Autobahn для WebSockets + XMPP на одном экземпляре Twisted. . Отказ от ответственности: я являюсь автором Autobahn.
oberstet

Ответы:

166

http://pypi.python.org/pypi/websocket-client/

До смешного просто использовать.

 sudo pip install websocket-client

Пример клиентского кода:

#!/usr/bin/python

from websocket import create_connection
ws = create_connection("ws://localhost:8080/websocket")
print "Sending 'Hello, World'..."
ws.send("Hello, World")
print "Sent"
print "Receiving..."
result =  ws.recv()
print "Received '%s'" % result
ws.close()

Пример кода сервера:

#!/usr/bin/python
import websocket
import thread
import time

def on_message(ws, message):
    print message

def on_error(ws, error):
    print error

def on_close(ws):
    print "### closed ###"

def on_open(ws):
    def run(*args):
        for i in range(30000):
            time.sleep(1)
            ws.send("Hello %d" % i)
        time.sleep(1)
        ws.close()
        print "thread terminating..."
    thread.start_new_thread(run, ())


if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://echo.websocket.org/",
                                on_message = on_message,
                                on_error = on_error,
                                on_close = on_close)
    ws.on_open = on_open

    ws.run_forever()
Брайан Хант
источник
4
@SSHT: pip installотлично работает на windows! Я использую ActivePython 2.7, запустил pip install websocket-clientи все заработало. Единственная проблема заключалась в pythonконфликте с cygwin python, поэтому мне пришлось явно запустить, /cygdrive/C/Python27/pythonчтобы получить ActivePython
Марк Лаката,
@bryan hunt, как справиться с случаем, когда сервер отключается, так как я получаю ошибки сломанного канала - запись в закрытый канал / сокет / fd (вероятно, клиент отключился) !!!
Канвал Пракаш Сингх
Как передать URL-адрес в командной строке при запуске. например, если мне нужно указать URL-адрес ws ("ws: // localhost: 8080 / websocket") в командной строке .. ws = create_connection ("ws: // localhost: 8080 / websocket") .. как ws = create_connection (sys.argv)
Саундарья Тиагараджан
1
@KanwalPrakashSingh Решили проблему отключения клиента?
Jey
Боже, не используй sudo. Используйте --user.
Perfi
23

У Autobahn есть хорошая реализация клиента websocket для Python, а также несколько хороших примеров. Я протестировал следующее на сервере Tornado WebSocket, и это сработало.

from twisted.internet import reactor
from autobahn.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS


class EchoClientProtocol(WebSocketClientProtocol):

   def sendHello(self):
      self.sendMessage("Hello, world!")

   def onOpen(self):
      self.sendHello()

   def onMessage(self, msg, binary):
      print "Got echo: " + msg
      reactor.callLater(1, self.sendHello)


if __name__ == '__main__':

   factory = WebSocketClientFactory("ws://localhost:9000")
   factory.protocol = EchoClientProtocol
   connectWS(factory)
   reactor.run()
Крисаллик
источник
Эй, Крис, ты знаешь, как можно принудительно отключить клиента от сервера, используя этот сервер websocket автобана ?? какую функцию мне нужно вызвать для этого?
Johnydep
эй, @Johnydep да, я считаю, что это часть спецификации, что оба участника соединения с веб-сокетом могут инициировать "закрытие". Но не цитируйте меня. В любом случае, я посмотрел исходный код и там: "dropConnection" и "sendClose", я просто подключил их и протестировал :)
chrisallick
2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS- правильный импорт для более новых версий автобана. stackoverflow.com/questions/21381454/…
evan54
1
Вероятно, было бы хорошо объяснить, что делает код, если вы собираетесь представить новый API.
user650261
1
он будет поддерживать wss?
Arun
10

Поскольку в последнее время (январь 2012 г.) я провел небольшое исследование в этой области, самым многообещающим клиентом на самом деле является WebSocket для Python . Он поддерживает обычный сокет, который можно вызвать так:

ws = EchoClient('http://localhost:9000/ws')

clientМожет быть Threadedили на основе IOLoopиз Торнадо проекта. Это позволит вам создать клиент с несколькими одновременными подключениями. Полезно, если вы хотите запустить стресс-тесты.

Клиент также предоставляет onmessage, openedи closedметоды. (Стиль WebSocket).

киддук
источник
1
Что касается параллелизма: мы протестировали клиент Autobahn до 60 000 исходящих соединений WS и сервер Autobahn до 180 входящих соединений WS. В Windows это было протестировано с использованием Twisted с запущенным реактором IOCP (IO Completion Ports), а в FreeBSD это было протестировано с использованием реактора kqueue. Отказ от ответственности: я автор автобана.
oberstet
1
Говоря о числах, со своей стороны, я провел несколько расширенных тестов с Tornado Websocket (и WS-for-py) и легко получил 15 тысяч соединений. Не так много, но все равно хорошо для теста.
kiddouk
0

web2py имеет comet_messaging.py, который использует Tornado для веб-сокетов, посмотрите пример здесь: http://vimeo.com/18399381 и здесь vimeo. com / 18232653

Бруно Роша - Рочакбруно
источник
видео - плохой инструмент для объяснения подобных вещей, рассмотрите возможность размещения в документации или руководствах на основе HTML.
Крис Уизерс,
0
  1. Взгляните на эхо-клиент на странице http://code.google.com/p/pywebsocket/. Это проект Google.
  2. Хороший поиск в github: https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1 возвращает клиентов и серверы.
  3. Брет Тейлор также реализовал веб-сокеты через Tornado (Python). Его сообщение в блоге: Веб-сокеты в Tornado и API клиентской реализации показано на tornado.websocket в разделе поддержки на стороне клиента.
sw.
источник
1
но мне нужен веб-сокет на питоне без торнадо
diegueus9
@sw. Пункт номер 3 недействителен, поскольку это не клиент WebSocket, а скорее сервер WebSocket.
Зоран Павлович
@ZoranPavlovic посмотрите: tornadoweb.org/en/stable/websocket.html, у него есть реализация клиента WebSocket.
sw.
@sw. Да, но ссылка в пункте 3 ведет к серверу python и клиенту javascript. Вы должны обновить его, указав новый URL, который вы только что опубликовали, и спасибо за находку! Это именно то, что я искал.
Зоран Павлович