2010-06-29 3 views
67

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

+2

Попробуйте автобана? http://www.tavendo.de/autobahn/ –

+3

Поскольку Autobahn основан на Twisted, также стоит отметить, что Twisted имеет очень хорошую поддержку для XMPP, то есть http://metajack.im/2008/09/ 04/get-twisted-on-xmpp --- the-future-of-twisted-words/ Таким образом, вы можете использовать Autobahn для WebSockets + XMPP на одном экземпляре Twisted. Отказ от ответственности: Я являюсь автором Autobahn. – oberstet

ответ

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). Его сообщение в блоге: Web Sockets in Tornado и API реализации клиента показано в tornado.websocket в разделе поддержки на стороне клиента.
+1

, но мне нужен веб-sobcket в python без торнадо. – diegueus9

+0

Я только что отредактировал ответ. Посмотрите на результаты поиска на github, есть много реализаций. –

+0

@sw. Пункт 3 недействителен, так как он не является клиентом WebSocket, а скорее сервером WebSocket. –

1

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

10

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

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

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

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

+1

Что касается параллелизма: мы протестировали клиента Autobahn до 60k WS исходящих соединений и сервера Autobahn до входящих соединений 180k WS. В Windows это было протестировано с использованием реактора IOCP (IO Completion Ports) с витой работой, а на FreeBSD это было протестировано с использованием реактора kqueue. Отказ от ответственности: Я являюсь автором Autobahn. – oberstet

+1

Говоря о цифрах, на моей стороне я провел несколько расширенных тестов с помощью Tornado Websocket (и WS-for-py), и я легко получаю 15k соединений. В любом случае, не так много, но хорошо для теста. – kiddouk

15

У 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() 
+0

hey chris, знаете ли вы, как можно отключить клиента с сервера с помощью этого сервера autobahn websocket? какую функцию мне нужно позвонить, чтобы сделать это? – Johnydep

+0

эй, @Johnydep да, я считаю, что это часть спецификации, что оба участника в соединении с websocket могут инициировать «закрытие». Не цитируйте меня. В любом случае, я посмотрел исходный код, и есть: «dropConnection» и «sendClose», я просто подключил их и проверил их :) – chrisallick

+1

'от autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS' - правильный импорт для новых версий автобана. http://stackoverflow.com/questions/21381454/autobahn-cannot-import-name-error – evan54

116

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 "Reeiving..." 
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() 
+5

Darn Я хочу, чтобы 'pip install' был прост в использовании на windows :( –

+4

@SSHThis' pip install' отлично работает на окнах! Я использую ActivePython 2.7 и запускаю 'pip install websocket-client', и он просто работал. проблема заключалась в том, что 'python' столкнулся с cygwin python, поэтому мне пришлось явно запускать'/cygdrive/C/Python27/python', чтобы получить ActivePython –

+0

@bryan hunt, как обрабатывать случай, когда сервер отключается, так как у меня получается сломанная труба ошибки - запись в закрытый канал/сокет/fd (возможно, клиент отключен) !!! –

Смежные вопросы