【问题标题】:Socket.IO request does not receive a responseSocket.IO 请求没有收到响应
【发布时间】:2019-05-24 12:44:49
【问题描述】:

我有一个 Node.js 应用程序,它使用 socket.io-client 向使用 socketio 包的 Python 服务器发送请求。

在 Node.js 中:

const sio_socket = require('socket.io-client')('http://localhost:7284');

app.post('/test', function(req, res) {
  console.log("sending test message");
  sio_socket.emit("test", "test data",
    (data) => {
      if (err) {
        console.log("error during test: " + err);
      } else {
        console.log("test answer: " + data)
      }
    });
    res.end();
});

在 Python 中:

import socketio
import eventlet

sio = socketio.Server()
app = socketio.WSGIApp(sio)

@sio.on('connect')
def connect(sid, environ):
    print('connect ', sid)

@sio.on('test')
def respond_test(sid, data):
    print("received test message: {}".format(data))
    return "test success"

@sio.on('disconnect')
def disconnect(sid):
    print('disconnect ', sid)

if __name__ == '__main__':
    eventlet.wsgi.server(eventlet.listen(('', 7284)), app)

我用curl 向 Node.js 应用发送请求:

$ curl -P 3000 -X POST localhost:3000/test

Node 应用收到它:

sending test message
POST /test 200 1.263 ms - -

但是 Python 服务器什么也没打印。只有当我关闭 Node 应用程序(使用 Control-C)时,它才会打印一些东西:

127.0.0.1 - - [24/May/2019 14:42:43] "GET /socket.io/?EIO=3&transport=polling&t=Mhft8LT&b64=1&sid=75d4fb4223044bc6984d877c92132faf HTTP/1.1" 200 0 59.018009

我希望 Node 应用程序打印“测试答案:测试成功”,因为这是 Python 处理程序的返回值,并且我已经读到这个返回值被发送回客户端。

我做错了什么?

【问题讨论】:

  • 这是哪个版本的python?我收到 AttributeErrors:module 'socketio' has no attribute 'Server'
  • @C.Nivs 这是 Python 3.7.2,来自 pip 的 socketio 0.1.7。
  • 如果 python 中没有打印任何内容,则客户端消息不会到达 python 服务器。
  • 不是,我只是注意到了这一点。所以这个事件不是由 Python 服务器处理的。
  • 我尝试使用节点服务器和节点客户端,如果你愿意,我会分享代码

标签: python node.js socket.io python-3.7


【解决方案1】:

示例 Socket IO 节点客户端和服务器

节点服务器版本 2.2.0

const io = require('socket.io')();

io.on('connection', function (socket) {
    socket.on('ferret', function (name, word, fn) {
      fn(name + ' says ' + word);
    });
  });
io.listen(3000);

节点客户端版本 2.2.0

const sio_socket = require('socket.io-client')('http://localhost:3000');

sio_socket.emit('ferret', 'tobi', 'woot',
(data) => {
    console.log(data);
});

【讨论】:

  • 谢谢,但我需要服务器使用 Python。你知道 Python 的 socketio 包相当于 io.listen(3000) 吗?该文档在我的问题中使用eventlet,但我不确定我是否正确使用它。
  • 尝试声明 sio 并启动 eventlet,如此处所述 --> python-socketio.readthedocs.io/en/latest/server.html#eventlet
  • 这就是我在问题中所做的。还是我错过了什么?
猜你喜欢
  • 2016-01-12
  • 2019-12-06
  • 2021-12-25
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2016-03-30
  • 2019-04-25
  • 1970-01-01
相关资源
最近更新 更多