如何在 Ruby 中使用 Websocket (socket.io)?

问题描述

我需要在我们的 Rail 项目中实现 WebSocket 同步。 MetaApi 项目使用 Socket.Io 作为支持。仅找到 2 个项目 (websocket-client-simple) 并且与原生 socket.io 已过时。我们尝试使用 Faye-Websocketsocketcluster-client-ruby 实现这一点,但没有成功。

Code Example

import ioClient from 'socket.io-client';

const socket = ioClient('https://mt-client-api-v1.agiliumTrade.agiliumTrade.ai',{
    path: '/ws',reconnection: false,query: {
        'auth-token': 'token'
    }
});

const request = {
  accountId: '865d3a4d-3803-486d-bdf3-a85679d9fad2',type: 'subscribe',requestId: '57bfbc9f-108d-4131-a300-5f7d9e69c11b'
};

socket.on('connect',() => {
  socket.emit('request',request);
});

socket.on('synchronization',data => {
  console.log(data);
  if (data.type === 'authenticated') {
    console.log('authenticated event received,you can send synchronize Now');
  }
});

socket.on('processingError',err => {
  console.error(err);
});

解决方法

Socket.io 协议比简单的 websocket 连接稍微复杂一些,后者只是使用的传输方式之一,参见 description in official repository。 Websockets 仅在初始 http 握手后使用,因此您需要一个稍微完整的客户端。

我首先尝试使用来自浏览器的 js 客户端存根来使用事件,只是为了确保 api 按您的预期工作并确定使用的和兼容的 socket.io 版本(当前是 v4,陈旧的 ruby​​ 客户端主要是对于 v1)。您还可以在浏览器开发者工具中查看协议。

一旦你有一个成功的会话示例并阅读了上面的协议规范 - 制作一个最小的客户端就会更容易。