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的主要内容,如果未能解决你的问题,请参考以下文章
socket.shutdown 与 socket.close