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.


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()

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()

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).


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
  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.

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.