Чи реалізований клієнт 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.