python-socketio 客户端无法获取公共数据,但 NodeJS socket.io-client 没有

Posted

技术标签:

【中文标题】python-socketio 客户端无法获取公共数据,但 NodeJS socket.io-client 没有【英文标题】:python-socketio client fails to get public data but NodeJS socket.io-client does not 【发布时间】:2020-05-24 17:57:24 【问题描述】:

我正在尝试从 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 上运行了这两个程序。

【问题讨论】:

【参考方案1】:

您没有正确翻译 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 客户端的主要区别在于命名空间的实现方式。

【讨论】:

以上是关于python-socketio 客户端无法获取公共数据,但 NodeJS socket.io-client 没有的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Android 应用程序连接到 python-socketio 后端?

无法在我的服务器上获取已连接客户端的公共 IP

如何在线程中运行 python-socketio?

获取客户端公共 IP 的最可靠方法

如何在servlet java中获取客户端公共IP地址[重复]

让频道与 Python-socketio 中的房间一致,以及一般的 pubsub 问题