【问题标题】:Is there a WebSocket client implemented for Python? [closed]是否有为 Python 实现的 WebSocket 客户端? [关闭]
【发布时间】:2011-03-09 17:36:43
【问题描述】:

我找到了这个项目:http://code.google.com/p/standalonewebsocketserver/ 用于 WebSocket 服务器,但我需要在 python 中实现一个 WebSocket 客户端,更确切地说,我需要在我的 WebSocket 服务器中接收来自 XMPP 的一些命令。

【问题讨论】:

  • 试试高速公路? tavendo.de/autobahn
  • 由于 Autobahn 基于 Twisted,值得注意的是 Twisted 对 XMPP 也有很好的支持,即metajack.im/2008/09/04/… 因此,您可以在一个 Twisted 实例上运行 Autobahn for WebSockets + XMPP .免责声明:我是《高速公路》的作者。

标签: python client-server xmpp websocket


【解决方案1】:

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

【讨论】:

  • @SSHThis pip install 在 Windows 上运行良好!我正在使用 ActivePython 2.7 并运行pip install websocket-client,它就可以正常工作。唯一的问题是 python 与 cygwin python 发生冲突,所以我必须显式运行 /cygdrive/C/Python27/python 才能获得 ActivePython
  • @bryan hunt 如何在服务器断开连接时处理这种情况,例如我遇到管道损坏错误 - 写入已关闭的管道/套接字/fd(可能是客户端断开连接)!!!
  • 运行时如何在命令行中传递url。例如,如果我需要在命令行中提供 ws ("ws://localhost:8080/websocket") 的 url .. ws = create_connection("ws://localhost:8080/websocket").. like ws = create_connection (sys.argv)
  • @KanwalPrakashSingh 客户端断线问题解决了吗?
  • 天啊,不要使用sudo。使用--user。
【解决方案2】:

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

【讨论】:

  • 嘿,克里斯,你知道如何使用这个高速公路 websocket 服务器强制断开客户端与服务器端的连接吗?我必须调用哪个函数才能做到这一点?
  • 嘿,@Johnydep 是的,我相信 websocket 连接中的两个参与者都可以启动“关闭”是规范的一部分。不过不要引用我的话。无论如何,我查看了源代码,其中有:“dropConnection”和“sendClose”我只需将它们插入并测试它们:)
  • from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS 是较新版本的高速公路的正确导入。 stackoverflow.com/questions/21381454/…
  • 如果您要引入新的 API,最好解释一下代码在做什么。
  • 会支持wss吗?
【解决方案3】:

由于我最近(2012 年 1 月)在该领域做了一些研究,最有前途的客户实际上是:WebSocket for Python。它支持一个普通的套接字,你可以这样调用:

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

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

客户端还公开了onmessage、opened 和closed 方法。 (WebSocket 风格)。

【讨论】:

  • 关于并发性:我们测试了高达 60k WS 传出连接的 Autobahn 客户端和高达 180k WS 传入连接的 Autobahn 服务器。在 Windows 上,这是使用 Twisted 运行 IOCP(IO 完成端口)反应器进行测试的,而在 FreeBSD 上,这是使用 kqueue 反应器进行测试的。免责声明:我是 Autobahn 的作者。
  • 谈到数字,就我而言,我已经使用 Tornado Websocket(和 WS-for-py)进行了一些扩展测试,并且很容易获得 15k 连接。没有那么多,但无论如何都适合测试。
【解决方案4】:
  1. 看看http://code.google.com/p/pywebsocket/下的echo客户端,这是一个谷歌项目。
  2. 在 github 中的一个很好的搜索是:https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1 它返回客户端和服务器。
  3. Bret Taylor 还通过 Tornado (Python) 实现了 Web 套接字。他的博文位于:Web Sockets in Tornado,客户端实现 API 显示在客户端支持部分的 tornado.websocket。

【讨论】:

  • 但我需要一个没有龙卷风的 python 网络套接字
  • @sw。第 3 项无效,因为它不是 WebSocket 客户端,而是 WebSocket 服务器。
  • @ZoranPavlovic 看看:tornadoweb.org/en/stable/websocket.html 它有一个 WebSocket 客户端实现。
  • @sw。是的,但第 3 点中的链接指向 python 服务器和 javascript 客户端。您应该使用刚刚发布的新网址对其进行更新,并感谢您的发现!这正是我想要的。
【解决方案5】:

web2py 有 comet_messaging.py,它使用 Tornado 进行 websockets 看一个例子:http://vimeo.com/18399381 和这里 vimeo。 com/18232653

【讨论】:

  • 视频不适合解释此类问题,请考虑发布到基于 html 的文档或教程中。
猜你喜欢
  • 2011-01-05
  • 2013-10-17
  • 2012-05-24
  • 2021-03-25
  • 2021-09-14
  • 2014-09-30
  • 1970-01-01
  • 2011-11-01
  • 2012-03-20
相关资源
最近更新 更多