首页 > 解决方案 > python-socketio 客户端无法获取公共数据,但 NodeJS socket.io-client 没有

问题描述

我正在尝试从https://www.paymium.com/public下载公开可用的数据。数据提供者在他们的网站上提供了一个关于如何使用 NodeJS 访问数据的示例。以下程序有效。

var io = require('socket.io-client');

var socket = io.connect('https://www.paymium.com/public', {
  path: '/ws/socket.io'
});

console.log('CONNECTING');

socket.on('connect', function() {
  console.log('CONNECTED');
  console.log('WAITING FOR DATA...');
});

socket.on('disconnect', function() {
  console.log('DISCONNECTED');
});

socket.on('stream', function(publicData) {
  console.log('GOT DATA:');
  console.log(publicData);
});

我使用 python-socketio 实现了这个“等效”程序,但它不起作用。

import socketio
sio = socketio.Client(logger=True, engineio_logger=True)

@sio.event
def stream(publicData):
    print('GOT DATA:')
    print(publicData)

@sio.event
def connect():
    print("CONNECTED")
    print('WAITING FO DATA...')

@sio.event
def disconnect():
    print("DISCONNECTED")

print('CONNECTING')
sio.connect('https://www.paymium.com/public', socketio_path='/ws/socket.io')
sio.wait()

我的 python 等效程序中缺少什么参数、回调或命名空间声明?

我使用 npm socket.io-client 2.3.0、python 3.7.6 和 python-socketio 4.6.0 在 macOS Catalina 10.15.4 上运行了这两个程序。

标签: pythonnode.jswebsocketpython-socketio

解决方案


您没有正确翻译 JavaScript 客户端。这是工作的 Python 客户端代码:

import socketio
sio = socketio.Client(logger=True, engineio_logger=True)

@sio.event(namespace='/public')
def stream(publicData):
    print('GOT DATA:')
    print(publicData)

@sio.event(namespace='/public')
def connect():
    print("CONNECTED")
    print('WAITING FO DATA...')

@sio.event(namespace='/public')
def disconnect():
    print("DISCONNECTED")

print('CONNECTING')
sio.connect('https://www.paymium.com', namespaces=['/public'], socketio_path='/ws/socket.io')
sio.wait()

JS 和 Python 客户端之间的主要区别在于命名空间的实现方式。


推荐阅读