【问题标题】:Connecting Python Client to Socket.io with custom socket.io events使用自定义 socket.io 事件将 Python 客户端连接到 Socket.io
【发布时间】:2014-09-09 16:36:29
【问题描述】:

我有一个 socket.io 服务器(在 node.js 中),我正在尝试将一个 python 客户端连接到它,主要是为我的套接字服务器提供一个命令行界面。

我正在使用 Python 的网络套接字,但是,我意识到它只支持四个“事件”:打开时、关闭时、出错时和消息时。

我的 socket.io 服务器定义了自定义事件,例如.on('connection')。如何在 python 中发出/接收此类自定义事件?

到目前为止,这是我的脚本,它只是启动和关闭,所以它不起作用。 导入网络套接字、请求、线程、时间 主机 = 'http://socket-url-server.com'

def on_open(ws):
    def run(*args):
        print 'did connect'
        for i in range(3):
            time.sleep(1)
            result =  ws.recv()
            print 'received:'
            print result
        time.sleep(1)
        ws.close()
        print "thread terminating..."
    thread.start_new_thread(run, ())

def on_message(ws, message):
    print message

def on_error(ws, error):
    print error

def on_close(ws):
    print "### closed ###"

print('Connecting to %s' % host)

socket = host.replace('http://', 'ws://')
print socket
websocket.enableTrace(True)
_ws = websocket.WebSocketApp(socket,
                             on_message = on_message,
                             on_error = on_error,
                             on_close = on_close)
_ws.on_open = on_open
_ws.run_forever()

否则我应该使用哪个库/方法?如果我自己握手并获取 socket.io 服务器密钥,那之后我如何发送/接收事件?

我也尝试过使用https://pypi.python.org/pypi/socketIO-client,但它的文档很差

我在下面为它编写了以下脚本,但我得到了No handlers could be found for logger "socketIO_client",它只是永远挂起。

from socketIO_client import SocketIO, BaseNamespace

class Namespace(BaseNamespace):

    def on_connect(self):
        print '[Connected]'

socketIO = SocketIO('http://socket-server-url.com', 80, Namespace)
socketIO.wait(seconds=1)

【问题讨论】:

    标签: python node.js sockets websocket socket.io


    【解决方案1】:

    我遇到了同样的问题,并且自己解决了这个问题。在这里,我写了一些关于 socketIO_client 库使用的 cmets,希望对您有所帮助。

    开发环境:服务器/客户端:python编写的nodejs/sio_client

    1. “找不到记录器“socketIO_client”的处理程序。这意味着它需要记录东西的处理程序。尝试“import logging; logging.basicConfig(level=logging.DEBUG)" 并记录了。
    2. “socketio_client 永远挂起”,因为它不断地重新连接到指定的服务器,即在 socketIO 对象初始化并返回之前,不会采用 Namespace 对象。我有其他线程(称为 thr_siohandle)初始化 socketio 对象,主线程使用命名空间中包含的队列,以检查是否有来自服务器的响应。在运行 sio_client 之前,您的服务器似乎应该一直可以访问,否则它会保持重新连接,除非您停止程序。虽然您可以将 wait_for_connection 设置为 True 来停止它,但您必须自己处理 socketIO_client.exceptions.ConnectionError。

    仅供参考

    [2014/02/19] 抱歉,请允许我在关于 py_SIOClient 的答案中附加一些 cmets。

    示例代码如下:

    class ChatNamespace(BaseNamespace):
        def on_connect( self ):
            print "connected."
        def on_sayhello_response( self, data ):
            print "response:", data 
    
    sio = SocketIO(host, port, ChatNamespace)
    chatns = sio.define(ChatNamespace, '/chat')
    
    while (1):
        chatns.emit('sayhello', {'name':'John'})
        chatns.wait(1)
    

    此示例中的命令“sayhello”将在连接重置时处于非活动状态,并且不再可以访问命名空间对象 chatns(也没有出现错误)。因此,可以通过每次在发出消息之前重新定义专用命名空间来解决它,因为我们不知道连接何时会被重置(我认为这并不重要)。 希望它对从事 py_SocketIO_Client 工作的人有所帮助。

    补充 2014/09/09 因为我使用 node(.js) 作为后端服务器,但是这个库似乎几个月都没有更新,它的 socket.io 只支持 socket.io 。提醒您在选择此库之前请检查您的软件包版本。希望它确实可以帮助人们面临像我一样的问题。

    【讨论】:

    • 其实我想发表评论,但我的信用不允许我这样做。我回答了。
    • btw,每次发出消息都必须让 SIO 对象等待,否则无法正常工作。我仍然对它的目的感到困惑。
    猜你喜欢
    • 2020-02-17
    • 2016-03-01
    • 2016-06-16
    • 1970-01-01
    • 2011-12-03
    • 2015-11-13
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多