Existe um cliente WebSocket implementado para Python? [fechadas]

100

Encontrei este projeto: http://code.google.com/p/standalonewebsocketserver/ para um servidor WebSocket, mas preciso implementar um cliente WebSocket em python, mais exatamente preciso receber alguns comandos do XMPP em meu servidor WebSocket.

diegueus9
fonte
2
Experimente o Autobahn? tavendo.de/autobahn
Len Holgate
3
Como o Autobahn é baseado no Twisted, também pode ser importante notar que o Twisted também tem um suporte muito bom para XMPP, ou seja, metajack.im/2008/09/04/… Você pode, portanto, ter o Autobahn para WebSockets + XMPP rodando em uma instância do Twisted . Isenção de responsabilidade: eu sou o autor da Autobahn.
oberstet

Respostas:

165

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

Ridiculamente fácil de usar.

 sudo pip install websocket-client

Código de amostra do cliente:

#!/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()

Amostra de código do servidor:

#!/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()
Bryan Hunt
fonte
4
@SSHThis pip installfunciona bem no Windows! Estou usando ActivePython 2.7 e executei pip install websocket-cliente funcionou. O único problema foi que pythonentrou em conflito com o cygwin python, então eu tive que executar explicitamente /cygdrive/C/Python27/pythonpara obter o ActivePython
Mark Lakata
@bryan hunt como lidar com o caso quando o servidor desconecta, como em eu recebo erros de pipe quebrado - escrevendo para um pipe / socket / fd fechado (provavelmente o cliente desconectou) !!!
Kanwal Prakash Singh
Como faço para passar o url na linha de comando durante a execução. por exemplo, se eu precisar fornecer o url de ws ("ws: // localhost: 8080 / websocket") na linha de comando .. ws = create_connection ("ws: // localhost: 8080 / websocket") .. como ws = create_connection (sys.argv)
Soundarya Thiagarajan
1
@KanwalPrakashSingh Você resolveu o problema de desconexão do cliente?
Jey
Nossa, não use sudo. Use --user.
Perfi de
22

Autobahn tem uma boa implementação de cliente de websocket para Python, bem como alguns bons exemplos. Testei o seguinte com um servidor Tornado WebSocket e funcionou.

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()
Chrisallick
fonte
hey chris, você sabe como alguém pode desconectar um cliente forçosamente do lado do servidor usando este servidor autobahn websocket? qual função devo chamar para fazer isso?
Johnydep
Ei, @Johnydep sim, eu acredito que faz parte das especificações que ambos os participantes em uma conexão de websocket podem iniciar um "fechamento". Não me cite embora. De qualquer forma, olhei o código-fonte e lá está: "dropConnection" e "sendClose", eu apenas os
plugaria
2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWSé a importação correta para versões mais recentes do autobahn. stackoverflow.com/questions/21381454/…
evan54
1
Provavelmente, é bom explicar o que o código está fazendo se você for apresentar uma nova API.
user650261
1
vai suportar wss?
Arun
10

Como tenho feito algumas pesquisas nessa área recentemente (janeiro de '12), o cliente mais promissor é na verdade: WebSocket para Python . Ele suporta um soquete normal que você pode chamar assim:

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

O clientpode ser Threadedou com base IOLoopna partir Tornado projeto. Isso permitirá que você crie um cliente de conexão simultânea. Útil se você deseja executar testes de estresse.

O cliente também expõe os onmessage, openede closedmétodos. (Estilo WebSocket).

Kidouk
fonte
1
Com relação à simultaneidade: testamos o cliente Autobahn com até 60 mil conexões WS de saída e o servidor Autobahn com até 180 mil conexões WS. No Windows, isso foi testado usando o reator IOCP (IO Completion Ports) Twisted em execução e no FreeBSD foi testado usando o reator kqueue. Isenção de responsabilidade: eu sou o autor da Autobahn.
oberstet
1
Falando em números, de minha parte, fiz alguns testes extensos com Tornado Websocket (e WS-for-py) e consigo facilmente 15k conexões. Não tanto, mas bom para um teste de qualquer maneira.
kiddouk
0

web2py tem comet_messaging.py, que usa Tornado para websockets, veja um exemplo aqui: http://vimeo.com/18399381 e aqui vimeo. com / 18232653

Bruno Rocha - rochacbruno
fonte
os vídeos são um péssimo veículo para explicar coisas como esta, por favor, considere postar em documentação ou tutoriais baseados em html.
Chris Withers
0
  1. Dê uma olhada no cliente de eco em http://code.google.com/p/pywebsocket/ É um projeto do Google.
  2. Uma boa pesquisa no github é: https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1 retorna clientes e servidores.
  3. Bret Taylor também implementou web sockets sobre Tornado (Python). Sua postagem no blog em: Web Sockets no Tornado e uma API de implementação do cliente é mostrada em tornado.websocket na seção de suporte do lado do cliente.
sw.
fonte
1
mas eu preciso de um sobcket da web em python sem tornado
diegueus9
@sw. O item número 3 não é válido porque não é um cliente WebSocket, mas sim um servidor WebSocket.
Zoran Pavlovic de
@ZoranPavlovic veja em: tornadoweb.org/en/stable/websocket.html ele tem uma implementação de cliente WebSocket.
sw.
@sw. Sim, mas o link no ponto 3 é para um servidor python e cliente javascript. Você deve atualizá-lo com o novo url que acabou de postar e obrigado pelo achado! É exatamente o que eu estava procurando.
Zoran Pavlovic