Python有实现WebSocket客户端吗?

118

我发现了这个项目: http://code.google.com/p/standalonewebsocketserver/,它提供了一个WebSocket服务器, 但是我需要在python中实现一个WebSocket客户端,更确切地说,我需要在我的WebSocket服务器中从XMPP接收一些命令。


2
尝试使用Autobahn吗?http://www.tavendo.de/autobahn/ - Len Holgate
3
因为Autobahn是基于Twisted的,所以值得注意的是Twisted也对XMPP有很好的支持,例如http://metajack.im/2008/09/04/get-twisted-on-xmpp---the-future-of-twisted-words/因此,您可以在一个Twisted实例上运行Autobahn用于WebSockets + XMPP。免责声明:我是Autobahn的作者。 - oberstet
如果你正在使用FastAPI,你也可以尝试使用websockets - Prakash Dahal
5个回答

214

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
这个pip install在Windows上很好用!我使用的是ActivePython 2.7,在命令行输入pip install websocket-client就行了。唯一的问题是python与cygwin的python冲突,所以我必须显式地运行/cygdrive/C/Python27/python来获取ActivePython。 - Mark Lakata
@bryan hunt 当服务器断开连接时如何处理,例如我收到了“broken pipe”错误 - 写入已关闭的管道/套接字/fd(可能是客户端已断开连接)!!! - Kanwal Prakash Singh
1
@KanwalPrakashSingh,你解决了客户端断开连接的问题吗? - Jey
3
别用sudo,用--user - Dominik Stańczak
嗨!你提到的示例服务器代码,不是根据文档中的长连接示例吗?我想调用一个 WebSocket,但我真的很困惑这两个方法代表什么... - Mohammad Tayyab
显示剩余2条评论

24

Autobahn提供了Python的优秀websocket客户端实现以及一些不错的示例。我用以下代码测试了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()

嗨,克里斯,你知道如何在使用Autobahn WebSocket服务器时从服务器端强制断开客户端吗?我需要调用哪个函数来实现这个功能? - Johnydep
嘿,@Johnydep,是的,我相信WebSocket连接中的两个参与者都可以发起“关闭”的一部分规范。不过不要引用我。无论如何,我查看了源代码,有:“dropConnection”和“sendClose”,我会将它们插入并进行测试 :) - chrisallick
2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS 是较新版本的 Autobahn 中正确的导入方式。https://dev59.com/13vaa4cB1Zd3GeqPHslX - evan54
1
如果你要引入一个新的API,最好解释一下代码在做什么。 - user650261
1
它会支持wss吗? - Arun

10

最近我在这个领域进行了一些研究(2012年1月),最有希望的客户端实际上是:WebSocket for Python。它支持一个普通的 socket,您可以像这样调用它:

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

client 可以是基于 IOLoop 或者基于 Tornado 项目的 Threaded 。这将允许您创建一个多并发连接客户端。如果您想运行压力测试,这是非常有用的。

此外,该客户端还暴露了 onmessageopenedclosed 方法(类似 WebSocket)。


1
关于并发性:我们已经测试了Autobahn客户端高达60k个WS出站连接和Autobahn服务器高达180k个WS入站连接。在Windows上,这是使用Twisted运行IOCP(IO完成端口)反应器进行测试的,在FreeBSD上,这是使用kqueue反应器进行测试的。免责声明:我是Autobahn的作者。 - oberstet
1
谈到数字,就我而言,我已经对Tornado Websocket(和WS-for-py)进行了一些扩展测试,并且轻松获得了15k个连接。虽然不是很多,但对于测试来说还是不错的。 - kiddouk

0

1
但是我需要在Python中实现Web Socket,却不使用Tornado。 - diegueus9
@sw。项目编号3无效,因为它不是WebSocket客户端,而是WebSocket服务器。 - Zoran Pavlovic
@ZoranPavlovic 看看这个:http://www.tornadoweb.org/en/stable/websocket.html 它有一个WebSocket客户端实现。 - sw.
@sw。是的,但点3中的链接是一个Python服务器和JavaScript客户端。您应该使用您刚才发布的新URL进行更新,并感谢您的发现!这正是我一直在寻找的。 - Zoran Pavlovic

-1

web2py有comet_messaging.py,它使用Tornado进行Websockets。可以在这里查看示例:http://vimeo.com/18399381和这里vimeo.com/18232653


2
视频并不是解释这类内容的好工具,请考虑发布基于HTML的文档或教程。 - Chris Withers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接