Чи реалізований клієнт WebSocket для Python? [зачинено]


100

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


2
Спробувати Autobahn? tavendo.de/autobahn
— Лен Холгейт

3
Оскільки Autobahn заснований на Twisted, можливо, варто також зазначити, що Twisted також має дуже гарну підтримку для XMPP, тобто metajack.im/2008/09/04/… Таким чином, ви можете мати Autobahn для WebSockets + XMPP, що працює на одному закрученому екземплярі . Відмова: Я є автором Autobahn.
— oberstet

Відповіді:


165

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
— Mark Lakata

@bryan полює, як поводитися з випадком, коли сервер відключається, як у мене трапляються помилки в трубі - написання в закриту трубу / socket / fd (можливо, клієнт відключений) !!!
— Канваль Пракаш Сінгх

Як передати URL-адресу в командному рядку під час запуску. наприклад, якщо мені потрібно надати URL-адресу ws ("ws: // localhost: 8080 / websocket") у командному рядку .. ws = create_connection ("ws: // localhost: 8080 / websocket") .. як ws = create_connection (sys.argv)
— Soundarya Thiagarajan

1
@KanwalPrakashSingh Ви вирішили проблему з відключенням клієнта?
— Джей

Гейз, не користуйся sudo. Використовуйте --user.
— Перфі

22

Autobahn має хорошу реалізацію клієнта для веб-сокетів для 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 autobahn ?? яку функцію мені потрібно викликати для цього?
— Джоннідеп

Ей, @Johnydep Так, я вважаю, що це частина специфікації, що обидва учасники підключення до веб-розетки можуть ініціювати "закриття". Не цитуйте мене, хоча. У будь-якому разі, я подивився вихідний код і є: "dropConnection" і "sendClose", я б просто підключити їх і перевірити :)
— chrisallick

2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWSє правильним імпортом для новіших версій autobahn. stackoverflow.com/questions/21381454 / ...
— evan54

1
Ймовірно, добре пояснити, що робить код, якщо ви збираєтеся ввести новий API.
— user650261

1
він буде підтримувати wss?
— Арун

10

Оскільки я останнім часом проводив трохи досліджень у цій галузі (січень, 12 рік), найперспективнішим клієнтом є насправді: WebSocket for Python . Він підтримує звичайний сокет, який ви можете викликати так:

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

clientМоже бути Threadedабо на основі IOLoopз Торнадо проекту. Це дозволить вам створити клієнт з декількома одночасними з'єднаннями. Корисно, якщо ви хочете провести стрес-тести.

Клієнт також надає onmessage, openedі closedметоди. (Стиль WebSocket).


1
Щодо одночасності: ми протестували клієнт Autobahn до 60 кВт вихідних з'єднань і сервер Автобану до вхідних 180k WS-з'єднань. У Windows це було протестовано за допомогою реактора Twisted IOCP (IO Completion Ports), а на FreeBSD це було протестовано за допомогою реактора kqueue. Відмова: Я є автором Autobahn.
— оберстеть

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). Його публікація в блозі за адресою: Веб-сокети в Торнадо та API для впровадження клієнта показані на сайті tornado.websocket у розділі підтримки клієнта.

1
але мені потрібна веб-сітка в пітоні без торнадо
— diegueus9

@sw. Елемент № 3 недійсний, оскільки це не клієнт WebSocket, а швидше сервер WebSocket.
— Зоран Павлович

@ZoranPavlovic дивіться на: tornadoweb.org/en/stable/websocket.html він має клієнтську реалізацію WebSocket.
— ш.

@sw. Так, але посилання в пункті 3 стосується сервера python та клієнта javascript. Ви повинні оновити його з новим URL-адресом, який ви тільки що опублікували, і дякую за знайдене! Це саме те, що я шукав.
— Зоран Павлович
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.