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.