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


101

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


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 в разделе поддержки на стороне клиента.

1
но мне нужен веб-сокет на питоне без торнадо
diegueus9

@sw. Пункт номер 3 недействителен, поскольку это не клиент WebSocket, а скорее сервер WebSocket.
Зоран Павлович

@ZoranPavlovic посмотрите: tornadoweb.org/en/stable/websocket.html, у него есть реализация клиента WebSocket.
sw.

@sw. Да, но ссылка в пункте 3 ведет к серверу python и клиенту javascript. Вы должны обновить его, указав новый URL, который вы только что опубликовали, и спасибо за находку! Это именно то, что я искал.
Зоран Павлович
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.