从 Meteor.js 打开一个 Websocket 连接

Posted

技术标签:

【中文标题】从 Meteor.js 打开一个 Websocket 连接【英文标题】:Open a Websocket connection from Meteor.js 【发布时间】:2014-03-04 15:39:28 【问题描述】:

我们如何从 Meteor 打开 Websockets 连接?

我们可以这样做吗:

ws = new WebSocket('ws://localhost/path');
ws.on('open', function() 
    ws.send('something');
);
ws.on('message', function(message) 
    console.log('received: %s', message);
);

错误:ReferenceError:未定义 WebSocket


使用 socket.io npm 包

var io = Meteor.require('socket.io')
var socket = io.connect('http://localhost');

Error: TypeError: Object # has no method 'connect'


使用 ws npm 包

var WebSocket = Meteor.require('ws');
var ws = new WebSocket('ws://localhost');

错误:错误:找不到模块'../build/default/bufferutil'

【问题讨论】:

【参考方案1】:

您可以尝试这里的解决方案: https://github.com/Akryum/meteor-socket-io

【讨论】:

【参考方案2】:

根据this question's answer指的是openshift博客文章, 你的回答是: (问题:How to set Meteor WebSocket port for clients?)

我为此苦苦挣扎了一段时间,并尝试了不同的方法。 在 OpenShift 中对我有用的解决方案是:

设置 DDP_DEFAULT_CONNECTION_URL 变量

//for http
process.env.DDP_DEFAULT_CONNECTION_URL = 'http://' + process.env.OPENSHIFT_APP_DNS + ':8000'
//for ssl
process.env.DDP_DEFAULT_CONNECTION_URL = 'https://' + process.env.OPENSHIFT_APP_DNS + ':8443'

根据这篇博文: https://www.openshift.com/blogs/paas-websockets

【讨论】:

【参考方案3】:

我创建了一个新的 Meteor 包joncursi:socket-io-client 来解决这个问题。有关更多详细信息和示例用法,请参阅https://atmospherejs.com/joncursi/socket-io-client。由于我已经为您将 NPM 二进制文件捆绑到一个包中,因此您不必担心安装 NPM 包、声明 NPM.require() 依赖项等。最重要的是,您可以毫不费力地部署到 .meteor.com

【讨论】:

有没有办法在没有socket.io连接的情况下将它用于普通的websockets连接?【参考方案4】:

有一个包叫Meteor Streams,可以让你做类似的事情,使用现有的meteor websocket连接到本地服务器:

chatStream = new Meteor.Stream('chat');

if(Meteor.isClient) 
  sendChat = function(message) 
    chatStream.emit('message', message);
    console.log('me: ' + message);
  ;

  chatStream.on('message', function(message) 
    console.log('user: ' + message);
  );

我不确定您想连接到另一台服务器还是本地服务器,如果是另一台服务器,您可以使用您提供的示例。在客户端不允许使用 websocket(因此需要 websocket 仿真)的情况下,我建议使用 SockJS 或 socket.io 之类的其他东西。

【讨论】:

我想连接一个非 Meteor Websocket 服务。使用我的示例,我得到错误ReferenceError: WebSocket is not defined。我尝试了socket.io npm 包,但使用Meteor.require('socket.io').connect('http://localhost'), I get the error Object # 没有方法'connect'` 你是在客户端的服务器上做这个吗? 如果来自服务器@npmjs.org/package/faye-websocket,请尝试使用faye-websockets npm 模块 我正在客户端尝试这个,尝试连接到 WebSocket 服务器。 发生这种情况是因为您的服务器是 socket.io 服务器,如果您有一个 websocket 服务器,则不会发生这种情况。这个 npm 模块应该可以帮助您使用 socket.io 服务器@npmjs.org/package/socket.io-client

以上是关于从 Meteor.js 打开一个 Websocket 连接的主要内容,如果未能解决你的问题,请参考以下文章

允许用户从公用文件夹 Meteor.js 下载文件

在 Meteor.js 中使用多个 Mongodb 数据库

Meteor JS如何从集合中的数组中获取特定对象?

meteor.js 和 npm 需要 fs

尝试运行android时出现Meteor.js错误

日期查询之间的 Meteor.js / MongoDB 不返回数据