RxJS.fromWebSocket 与 Socket.io

Posted

技术标签:

【中文标题】RxJS.fromWebSocket 与 Socket.io【英文标题】:RxJS.fromWebSocket with Socket.io 【发布时间】:2015-01-02 21:47:13 【问题描述】:

我正在尝试使用带有 Socket.io 的 Rx.DOM.fromWebSocket 创建主题。我真的迷路了——我在哪里可以找到 Socket.io 实现的协议?

var rxSocket = Rx.DOM.fromWebSocket(
        'ws://localhost:12345',
        'ws',
        function (e) 
            console.log('Opening');
        );

rxSocket.subscribe(function (next) 
    console.log('Received data: ' + next);
);

rxSocket.onNext('data');

这就是我现在所拥有的。我正在尝试在本地连接到运行 Socket.io 的服务器。当我刚刚使用标准的io.connect() 时,一切运行顺利,所以我的服务器已启动并运行 Socket.io。我试过谷歌,但不知道在哪里可以找到 Socket.io 的套接字协议实现。

【问题讨论】:

【参考方案1】:

另一种方法是使用 RxJS Observable.fromEvent。

var socket = io('ws://localhost:8080');

var dataStream = Rx.Observable.fromEvent(socket, 'data');

dataStream.subscribe(function(payload) 
  console.log(payload);
);

在本例中,允许 socket.io 处理连接。

RxJs 处理事件并创建一个 Observable 流来订阅。

【讨论】:

【参考方案2】:

Socket.io 不提供 websockets,它提供 'websockets',websockets 如果可用,但如果没有,则回退,即使它建立了 websocket 连接,它也不会发送 rxSocket 期望的那种消息。如果你想使用 Rx.DOM.fromWebSocket 你应该简单地使用 ws 模块。

所以选项:

RX.DOM.formWebSocket + ws(只支持真正的 websocket,但做的更好) socket.io + hacks(完整的浏览器/“有用的”代理支持,但很笨重)

【讨论】:

是的,我认为它与回退有关,但认为如果明确声明它可以使用 ws-connection。感谢您的回答。当我实现原始 WS 时,用我自己的答案投票和回复。编辑:你有一个例子说明 Socket.io 的“笨拙”实现是什么样的吗? 基本上只使用 io.connect() 然后将事件发布到 RX @Apansson 只需使用source of fromWebSocket 并用socket.io API 替换websocket API(即用.on(...) 替换.addEventListener(...) 的东西,替换事件名称等),使用Observable.create代替AnonymousObservable,使用Observer.create代替Observercreate。遵循公式并使其与socket.io 一起使用是相当简单的。【参考方案3】:

我知道,无耻的自我推销,但我为此提出了rxjs-socket.io。有了它,你真正要做的就是:

import IO, ioEvent from 'rxjs-socket.io'

const socket = new IO();
const onHelloWorld = new ioEvent(name: "hello-world", once: false, count: 0);

socket.listenToEvent(onHelloWorld);
socket.connect('http://localhost:1337');

onHelloWorld.event$.subscribe((state) => 
    console.log('new state', state);
);

【讨论】:

以上是关于RxJS.fromWebSocket 与 Socket.io的主要内容,如果未能解决你的问题,请参考以下文章

(linux)mysql.sock文件不存在智能重装

socket.shutdown 与 socket.close

流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较

socket的相关操作

PHP连接mysql报错

为啥套接字(AF_INET、SOCK_DGRAM、IPPROTO_UDP)会失败?