【问题标题】:using Websocket api in Tabris.js to connect to socket.io server在 Tabris.js 中使用 Websocket api 连接到 socket.io 服务器
【发布时间】:2020-03-02 10:14:38
【问题描述】:

我正在尝试为 android 构建一个 Tabris 应用程序,作为我的 socket.io 服务器的客户端。我正在阅读并看到 tabris.js 支持 WebSocket API,所以我尝试连接到我的套接字。像这样的io服务器

var socket = new WebSocket('ws://159.89.92.113:4343');

但我收到此错误

The WebSocket protocol has too be a string or an array of strings

然后我试着用我能想到的唯一的东西来填充那个参数

var socket = new WebSocket('ws://159.89.92.113:4343', 'ws');

然后我得到这个错误

Can not 'send' WebSocket message when WebSocket state is CONNECTING

老实说,我不知道如何完成这项工作,我尝试了很多不同的东西。

【问题讨论】:

    标签: javascript websocket socket.io tabris


    【解决方案1】:

    关于protocols 参数,WHATWG Standard 是这样说的:

    protocols 是字符串或字符串数​​组。如果它是一个字符串,则相当于一个仅由该字符串组成的数组;如果省略,则相当于空数组。数组中的每个字符串都是一个子协议名称。只有当服务器报告它已选择这些子协议之一时,才会建立连接。子协议名称必须符合 WebSocket 协议定义的包含 Sec-WebSocket-Protocol 字段值的元素的要求。

    因此,如果有的话,请参阅您的服务器的实现,了解该参数的发送内容。


    “当 WebSocket 状态为 CONNECTING 时无法‘发送’WebSocket 消息”消息在正在连接 时不应出现,但如果您尝试过早发送则很可能会出现; the message 特别是在连接阶段调用 send() 时发生。您可以延迟发送消息,直到建立连接为止:

    const socket = new WebSocket('ws://159.89.92.113:4343'); 
    socket.onopen = (event) => {
        socket.send('Hello World');
    };
    

    最后,这是一个使用 Tabris.js 应用作为客户端客户端和 websocket 服务器的 WebSocket 设置的端到端工作示例:

    https://github.com/eclipsesource/tabris-js/tree/2.x/examples/web-socket

    简单地说:

    git clone https://github.com/eclipsesource/tabris-js
    cd tabris-js
    git checkout 2.x
    cd examples/web-socket
    npm install
    tabris serve
    

    并在另一个窗口中启动服务器,从同一目录npm run server

    *请注意,这是为 Tabris.js 2.x 编写的,因此您需要使用 2.x 客户端或 migrate it to 3.x 对其进行测试。

    【讨论】:

    • 我找不到 socket.io 指定的任何协议,它只是没有连接我看到的人们连接到那里的所有其他示例 socket.io 服务器似乎也没有指定协议。
    • 尝试一个空数组作为第二个参数
    • 没什么变化 :( idk 伙计们真的很想让这个工作谢谢你的帮助
    • 使用空字符串作为“协议”,并在调用“发送”之前等待 onopen 事件。您还可以检查 websocket 实例的“readyState”是否为 1(“open”)。如果您在发送时仍然收到相同的错误,那将非常奇怪。
    • 这听起来也不是 tabris 特有的;所以你也可以在本地使用节点运行它来测试它
    【解决方案2】:

    好的,所以问题一直是我需要在 github 上指定协议,有人指出他们通常使用“聊天协议”作为参数,所以一旦我做到了,它就可以完美运行

    const socket = new WebSocket('ws://157.230.66.208:4343/socket.io/?EIO=3&transport=websocket','chat-protocol');
    

    还要使用常规网络套接字与 socket.io 通信,您必须像这样格式化字符串

    socket.send('42' + JSON.stringify(['checkLogin' , username, password]));
    

    像魅力一样工作只需要弄清楚如何让承诺和回调像那样工作

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多