天道酬勤,学无止境

建立 Meteor Server 和 C 应用程序之间的 DDP 连接(Etablish DDP connection between Meteor Server and C app)

问题

我正在开发一个带有两个客户端的 Meteor 应用程序,一个是 JavaScript,另一个是 C。我实际上是在尝试使用 websocket 将我的 C 应用程序连接到服务器。 我将库 nopoll 用于 websocket (http://www.aspl.es/nopoll/html/index.html) 和 jansson 用于 JSON 序列化 (http://www.digip.org/jansson/)。

我阅读了 DDP 规范(https://github.com/meteor/meteor/blob/devel/packages/ddp/DDP.md)和这个简短(但很好)的解释(https://meteorhacks.com/introduction-to -ddp.html)。

这里的代码是websocket初始化

int main(int ac, char** av)
{
  // Create noPoll context
    noPollCtx* ctx = nopoll_ctx_new();
    if (! ctx)
  {
  puts("Error creating nopoll context");
  return EXIT_FAILURE;
  }
  puts("Context created");

  // Create connection
  noPollConn* conn = nopoll_conn_new(ctx, "localhost", "3000", NULL, "/websocket", NULL, NULL);
  if (! nopoll_conn_is_ok(conn))
  {
    puts("Error creating new connection");
    return EXIT_FAILURE;
  }
  puts("Connection created");

  // Wait until connection is ready
  if (! nopoll_conn_wait_until_connection_ready(conn, 5))
  {
     puts("Connection timeout");
     return EXIT_FAILURE;
  }
  puts("Connection ready");
  connection_to_DDP_server(conn);
  send_msg_loop(conn);
  nopoll_ctx_unref(ctx);
  return EXIT_SUCCESS;
}

以及与 Meteor 服务器的连接

void connection_to_DDP_server(noPollConn* conn)
{
  int ret = 0;
  json_t* connect = json_pack("{s:s,s:s,s:[s]}",
        "msg", "connect",
        "version", "1",
        "support", "1");
  char* content = json_dumps(connect, JSON_COMPACT);
  printf("DDP Connect - JSON string = %s\n", content);
  ret = nopoll_conn_send_text(conn, content, strlen(content) + 1);
  if (ret == -1)
  {
    puts("DDP Connect fail");
    exit(EXIT_FAILURE);
  }
  printf("%i bytes written\n", ret);
}

我在服务器控制台上有这个错误:

I20141201-08:54:13.498(1)? Discarding message with invalid JSON
{"msg":"connect","support":["1"],"version":"1"}

我不明白为什么......我正在发送有效的 JSON 并参考 DDP 文档我做得很好(至少我这么认为......)。

回答1

问题是我发送的字符比通常预期的多。 现在,我得到一个:

{"msg":"connected","session":"HupHMhcFK4avy4vwg"}

告诉我我已连接。

我正在发送 '\0' 并且 JSON 解析器无法识别它。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Etablish DDP connection between Meteor Server and C app
    I'm developing a Meteor application with two client, one is in JavaScript and the other one is in C. I'm actually trying to connect my C app to the server using websocket. I'm using the library nopoll for the websocket (http://www.aspl.es/nopoll/html/index.html) and jansson for the JSON serialization (http://www.digip.org/jansson/). I read the DDP Specification (https://github.com/meteor/meteor/blob/devel/packages/ddp/DDP.md) and this brief (but good) explanation (https://meteorhacks.com/introduction-to-ddp.html). Here is the code is the websocket initialization int main(int ac, char** av) { /
  • 两台服务器之间的DDP不会重新连接(DDP between two servers doesn't reconnect)
    问题 我在不同的服务器上有两个通过DDP连接的流星应用程序,服务器A将数据发送到服务器B。这就是它们的工作方式。 服务器A Items = new Meteor.Collection('items'); Items.insert({name: 'item 1'}); if (Meteor.isServer) { Meteor.publish('items', function() { return Items.find(); }); } 服务器B var remote = DDP.connect('http://server-a/'); Items = new Meteor.Collection('items', remote); remote.subscribe('items'); Items.find().observe({ added: function(item) { console.log(item); } }); 每次我调用服务器A上的Items.insert(something)时,服务器BI上都会在控制台上显示我保存在服务器A上的对象的日志。但是,如果服务器B断开了Internet连接,则不会出现插入服务器A上的数据重新连接到Internet时,在服务器B上不再存在。 服务器B通过路由器连接到Internet。 仅当我断开连接并重新连接路由器时才会发生此问题
  • 用于同步大量数据的 DDP 与直接 MongoDB 访问(DDP vs Straight MongoDB access for synching large amounts of data)
    问题 我们正在 Meteor 中构建一个将参与教育生态系统的应用程序。 有许多应用程序(例如成绩簿、学生信息系统、报告系统...)都需要将它们的数据存储与 Meteor 保持同步。 数据存储大小将在数十万个文档中。 我的理解是,DDP 用于将“客户端”连接到 Meteor 应用程序(通过在 Meteor 推送数据更改和 RPC 以将数据导入 Meteor 时订阅提要)。 并且“客户端”通常仅限于用户……因此与数据整体相比,数据集的大小相对较小(教师可能可以访问 250K 文档中的 100 个)。 如果我使用 DDP 将报告系统(作为“客户端”)连接到 Meteor,则商店中的所有数据都需要同步……这是否意味着每次报告系统失去与 Meteor 的连接时,所有数据都将被同步从 Meteor 重新发送到 DDP 客户端? (因为报告系统对所有数据都感兴趣)......如果是这样,DDP 就不是保持应用程序同步的方式,对吗?......它对于范围更小的数据集意味着更多...... ..而且我们可能应该直接与 Mongo 交互以保持同步。 谢谢! 麦克风 回答1 我认为 nate 的答案非常适合您应该做的事情,尤其是考虑到数据量。 如果您需要显示大量数据,如果您使用页面来使用分页订阅,以便您可以享受实时功能(如果您决定使用它),而无需一次性下载所有内容。 请记住,目前数据是这样发送的
  • 通过DDP(和SRP?)与Meteor进行身份验证(Authenticating with Meteor via DDP (and SRP?))
    问题 我似乎找不到有关如何使用Meteor的DDP对用户进行身份验证的任何有用信息。 这可能吗? 如果是这样,最好的方法是什么? 如何使用SRP远程登录Meteor? 我目前正在使用直节点(最终将使用Express),以及该节点ddp客户端。 回答1 要通过DDP登录,只需发送一个方法调用。 您可以根据自己的登录方式对其稍作更改。 我将使用ddp-tools尝试解释如何登录,因为它将与纯ddp通信。 以下示例中的登录详细信息是 用户名是USER_1,密码是QWERTY键盘(是的,我知道它的坏的),和电子邮件地址是email@email.com,登录令牌MxNY9BFPKra2uNWG7 格式为 ddp call <method call name> [<param1>..] 这与在ddpclient.call(<method call name>,<param1>,callback)中执行ddpclient.call(<method call name>,<param1>,callback)相同 使用电子邮件和密码登录 ddp call 'login' '{"password":"qwerty","user":{"email":"email@email.com"}}' 使用用户名和密码登录 ddp call 'login' '{"password":"qwerty","user"
  • 如何通过DDP(WebSocket)协议访问meteor.com上托管的应用程序?(How to access app hosted on meteor.com by DDP (WebSocket) protocol?)
    问题 我有一个Meteor应用程序A和另一个应用程序B ,未使用Meteor,但与应用程序A进行了一些数据交换。 当我在本地网络中的计算机上启动A时,它工作正常,但是当我在托管它的meteor.com上部署它时,它却无法正常工作。 服务器未回复。 B使用代码new WebSocket("ws://" + host + ":3000/websocket")进行连接(DDP协议)。 但是,当我将ws更改为wss时,即使使用LAN中的计算机也无法正常工作-它不会响应。 我在浏览器中打开应用程序A主页时使用的网址如下 wss://ddp--6774-{my host name}.meteor.com/sockjs/465/asf0b7da/websocket 。 问题: 如何使B使用安全的WebSocket(wss)进行连接? 如何将其连接到{my host name} .meteor.com上托管的A ? 如何强制A使用固定URL(例如ws://{my host name}.meteor.com:3000/websocket回复请求? 我如何强制它使用ws而不是wss? 我应该在config.js或settings.js中指定某些内容吗? 有什么方法可以为meteor.com托管指定环境变量,例如DDP_DEFAULT_CONNECTION_URL,NODE_OPTIONS? 回答1
  • 流星兼容性(Meteor compatibility)
    问题 我正在考虑使用 Meteor 创建我的下一个应用程序,但我之前有几个问题。 据我了解,服务器和客户端之间的通信使用 DDP 协议/WebSockets。 哪些浏览器支持 Meteor? Meteor 通信协议和 socket.io 之间有什么区别? 如果没有区别,是否有可能使用 socket.io 而不是本机 Meteor DDP 协议/WebSockets ? Meteor 是否可以与 Yeoman(由 Paul Irish 开发的工作流框架)结合使用? 非常感谢您提前! 回答1 让我们看看我是否可以按照它们出现的顺序回答你的问题...... Meteor 支持所有主流浏览器。 IE、Chrome、Safari。 有关 IE 的版本,请参阅上面的 Rahul 指针。 socket.io是一个消息级协议,负责发送、接收和路由消息。 相比之下,DDP(Meteor 的协议)是一种更高级别的协议,它对您的数据库到浏览器的部分复制以及 RPC 调用进行建模。 实际上,DDP 在sockjs使用了一种消息级协议: sockjs 。 打破 Meteor 的消息级传输以实现直接替换目前需要进行一定程度的重构,并且需要使用 Meteor 的源代码。 将来,消息级传输可能会更加封装,但是 Meteor 通常会在那里提供合理的默认值——它可能总是也可能不总是基于sockjs 。
  • 如何查看流星DDP流量?(how to view meteor DDP traffic?)
    问题 流星在袜子/ websockets上使用DDP。 如何获得浏览器调试控制台中正在发生的事情的任何类型的视图? 在chrome的网络面板中,至少只有一个“ websocket”连接,而没有关于运行在其上的流量的大量信息。 我知道arunoda的DDP分析器和代理,但是正在寻找其他方法来获取有关流量的基本信息。 我本以为chrome的调试工具将对HTTP以外的协议提供更多支持,并且想知道其他人认为还有什么用。 回答1 您可以尝试将消息记录为简单的起点。 解析消息使检查起来更好一些。 if (Meteor.isClient) { // log sent messages var _send = Meteor.connection._send; Meteor.connection._send = function (obj) { console.log("send", obj); _send.call(this, obj); }; // log received messages Meteor.connection._stream.on('message', function (message) { console.log("receive", JSON.parse(message)); }); }
  • 构建一个纯粹的离线Meteor应用(Building a pure offline Meteor app)
    问题 关于在Stack Overflow上没有互联网连接时如何可以离线使用Meteor似乎存在一些问题,但是我对是否有可能构建仅可以离线使用的Meteor应用程序感兴趣。 例如,是否可以生成一个文件夹,其中包含一个HTML文件和所有其他必需文件(图像以及可能的CSS文件和JavaScript文件(如果未嵌入到HTML文件中),如果没有一个文件,则一切正常可用)在浏览器中打开HTML文件? 据我测试,可以使用appcache程序包使其正常工作(一个人在线时访问一次页面,然后一个人离线时可以访问页面),但这似乎并不可靠。 我也注意到独立的blaze项目,但是我想利用Meteor的功能(开发过程中的热代码推送,软件包,minimongo等)。 那么,有人知道我想做的事是否可以通过某种方式实现吗? 回答1 您可以构建一个完全脱机的Meteor应用程序,但存在一些“怪异”的折衷方案。 在建立DDP连接时,Meteor有点强大,因此由于没有服务器,所以将它作为127.0.0.1进行空回送。 自从引入Cordova系统以来,Meteor已经以这种仅脱机的方式构建了该应用程序,因此它只是将其提取出来了。 有用于server , web.cordova和browser构建。 1)捆绑您的应用程序并将其提取出来 我将从todo应用程序中随机地举一个例子(它需要服务器端的位,但是请忽略掉它)
  • Meteor 只向客户端发送授权模板(Meteor send only authorized templates down to the client)
    问题 我知道流星将模板编译到客户端。 使用meteor-auth系统,是否有一种方法仅在用户有权查看模板时才发送模板(因此在客户端检查html代码时它们不可见)? 例如,我们不想总是向下发送一个管理部分到浏览器。 例如,如果我有 <template name="admin_main"> <h2>Admin Menu</h2> .... </template> 如果我的Meteor.user().profile.userlevel是5 ,那么我才希望将模板发布给用户。 否则我的其他用户可以通过一些 js 知识看到我的管理菜单 回答1 我不相信这是可能的,但。 对于 Admin 部分,您可以创建两个单独的应用程序,并让它们通过同一个 DDP 服务器进行通信。 然而,这会使共享代码更加困难。 DDP 可以与任何数据库、框架或编程语言一起工作,并且可以在服务器、客户端和移动设备上工作。 实际上,您可以调用 Meteor.connect 连接到任何 DDP 服务器——例如其他人编写的 Meteor 应用程序! -- 并对其发布的任何数据进行实时订阅。 http://meteor.com/blog/2012/03/21/introducing-ddp
  • DDP between two servers doesn't reconnect
    I have two meteor applications connected via DDP on different servers and server A send data to server B. This is the way they work. Server A Items = new Meteor.Collection('items'); Items.insert({name: 'item 1'}); if (Meteor.isServer) { Meteor.publish('items', function() { return Items.find(); }); } Server B var remote = DDP.connect('http://server-a/'); Items = new Meteor.Collection('items', remote); remote.subscribe('items'); Items.find().observe({ added: function(item) { console.log(item); } }); Every time I call Items.insert(something) on server A, on Server B I got a log on the console
  • How to access app hosted on meteor.com by DDP (WebSocket) protocol?
    I have a Meteor app A and another application B, not using Meteor, but making some data exchange with the app A. It works fine when I launch A on a machine in my local network, but when I deploy it on meteor.com hosting it doesn't. Server doesn't reply. B uses code new WebSocket("ws://" + host + ":3000/websocket") for connection (DDP protocol). But when I change ws to wss it doesn't work any more even with the machine in LAN - it doesn't reply. I saw that main page of app A when I open it in browser uses URLs like wss://ddp--6774-{my host name}.meteor.com/sockjs/465/asf0b7da/websocket
  • 使用节点ddp-client从Node插入流星集合(Using node ddp-client to insert into a meteor collection from Node)
    问题 我正在尝试通过node.js将一些syslog数据流式传输到Meteor集合中。 它工作正常,但是Meteor客户端的轮询周期大约为10秒,对于我的品味来说,这个周期太长了-我希望大约1秒。 通过控制台的客户端集合插入速度很快,并且所有客户端都在使用DDP,因此可以立即进行更新。 但是,从服务器端直接进行MongoDB插入将受客户端的轮询周期影响。 因此,目前看来,我仅限于使用DDP从我的节点守护程序插入更新。 在DDP-client包例子,我能看到我已经订阅了邮件,但我不明白如何通过DDP和node.js的实际发送新邮件到流星的收集,从而更新的所有客户端立刻... 有任何例子或指导吗? 我将不胜感激-作为Node和Meteor的新手,我很快就达到了极限。 回答1 根据此截屏视频,可以简单地调用集合声明的流星方法。 在您的情况下,代码如下所示: ddpclient.call('/counts/insert', [{hits: 1111}], function(err, result) { console.log('called function, result: ' + result); }) 回答2 好的,在仔细查看一些代码并意识到自己完全想得太多之后,我才开始使用它。 该协议实际上是非常简单的,RPC类的东西。 我很高兴地报告说,它绝对可以解决服务器端插入延迟
  • 流星在众多客户之间共享大量收藏品时的效率如何?(How efficient can Meteor be while sharing a huge collection among many clients?)
    问题 想象以下情况: 1,000个客户端连接到显示“ Somestuff”集合内容的Meteor页面。 “ Somestuff”是一个包含1,000个项目的集合。 有人将新项目插入“ Somestuff”集合 会发生什么: 客户端上的所有Meteor.Collection都将被更新,即将插入转发给所有客户端(这意味着一条插入消息已发送给1,000个客户端) 在服务器的CPU方面,确定需要更新哪个客户端的成本是多少? 仅将插入的值转发给客户,而不转发给整个列表,这是否准确? 这在现实生活中如何运作? 有如此规模的基准或实验可用吗? 回答1 简短的答案是,只有新数据通过网络发送。 这是它的工作方式。 Meteor服务器的三个重要部分用于管理订阅: publish函数,它定义订阅提供哪些数据的逻辑; Mongo驱动程序,它监视数据库中的更改; 合并框,它合并了客户端的所有活动订阅,并通过网络将其发送到客户端。 发布功能 每次Meteor客户端订阅一个集合时,服务器都会运行publish函数。 发布功能的工作是找出其客户端应具有的文档集,并将每个文档属性发送到合并框中。 它为每个新的订阅客户端运行一次。 您可以将任何所需的JavaScript放入发布函数中,例如使用this.userId任意复杂的访问控制。 publish函数通过调用this.added , this
  • 从外部应用程序验证meteor 用户(Authenticate meteor users from an external application)
    问题 我有一个流星应用程序(带有流星帐户),并且正在构建一个移动应用程序。 如何从移动应用验证用户。 我有一个可以将数据发送到移动客户端的 python 网络服务。 但我不知道如何从外部应用程序进行身份验证。 我确实看过 DDP 客户端,但没有“身份验证方法”。 有没有办法用纯 python 解决方案来做到这一点? 我可以访问“用户”集合 -> srp 验证器和盐。 注意:Python srp 不起作用。 python srp 生成的 salt 和 verifier 应该是字节。 但是我什至无法使用 bytes.decode(encoding) 解码它们 回答1 听起来您想使用 Meteor 中内置的开箱即用的帐户管理,然后显示一种机制,您的 PHP 代码可以调用该机制,以根据经过身份验证的人显示不同的信息。 如果这是正确的,我认为你最好的选择是: 构建一个 PHP DDP 客户端。 Meteor 并不是真正构建来公开传统意义上的 Web 服务,而是展示了他们所谓的 DDP 协议,用于外部源插入服务器端出版物。 也就是说,我还没有找到 PHP DDP 客户端,但这里有一个在 node 中,一个在 .NET 中。 您需要构建一个 PHP DDP 客户端,然后在 Meteor 服务器代码中编写 Meteor.method,您可以从 DDP 客户端远程调用该代码以检查用户的身份验证。
  • 流星如何与Android应用程序耦合?(how can meteor be coupled to an android app?)
    问题 流星主页 (www.meteor.com) 在第 8 点(“互操作性”)中说: 您可以将任何东西连接到 Meteor,从原生移动应用程序到遗留数据库再到 Arduinos。 只需实现简单的 DDP 协议即可。 问题:Android是Java,如何连接到meteor(js)? 任何有用资源/教程的链接将不胜感激! 回答1 仅供参考,我编写了一个更高级别的 Android DDP 层,它负责处理客户端状态,包括集合处理。 它在 github 上,并在 Maven Central 中包含 Maven 工件(我的 java-ddp-client 版本也在 Maven Central 中):https://github.com/kenyee/android-ddp-client 回答2 DDP 代表分布式数据协议,专用于 Meteor。 目前还没有内置的 Android/Java 支持,但这里有一个用 Python 编写的官方 Meteor DDP 客户端,您可以将其用作参考:https://github.com/meteor/meteor/tree/devel/examples/unfinished /python-ddp-客户端 更多信息: https://stackoverflow.com/questions/10128430/documentation-or-code
  • DDP vs Straight MongoDB access for synching large amounts of data
    We are building an app in Meteor that will be participating in an education ecosystem. There are a number of applications (e.g. a GradeBook, a Student Information System, a Reporting System...) that will all need to have their data stores kept in synch with Meteor. The datastore size will be in the hundreds of thousands of documents. My understanding is that DDP is used to connect "clients" to a Meteor app (by subscribing to feeds when Meteor is pushing data changes and RPC to get the data in to Meteor). And a "client" is generally scoped to a user...so the size of the data set is relatively
  • 没有蒙哥的流星(Meteor without mongo)
    问题 随着0.6.5版本的发布,可以使用流星开发非Web应用程序。 我从头开始为ARM处理器重建它,但我根本不需要DB支持。 (Mongo是一个处理器杀手,具有很高的占用空间,我根本不需要它) ARM应该仅作为DDP客户端使用,因此我在没有mongo的情况下手动构建它。 并尝试在开始时仅构建1个软件包(所有标准软件包均已删除)以构建最简单的应用程序 meteor 和服务器文件夹中的一个文件 main = function(argv){ return "DAEMON" } Meteor.setInterval(function(){ console.log("HellOnWorld"); },1000); 在安装了完整流星的机器上,它可以按预期工作,但未安装mongo时出现错误 Unexpected mongo exit code 127. Restarting. Unexpected mongo exit code 127. Restarting. Initializing mongo database... this may take a moment. Unexpected mongo exit code 127. Restarting. Can't start mongod 显然我没有,想要蒙哥。 有什么方法可以在不等待mongo db的情况下启动流星吗?
  • Digital Ocean上的流星(Mup)内存问题(Memory issue with meteor up (mup) on Digital Ocean)
    问题 我找不到与我的问题相关的现有帖子。 在Digital Ocean Droplet上,mup设置很好,但是当我尝试进行部署时,出现以下错误。 有任何想法吗? 谢谢! root@ts:~/ts-deploy# mup deploy Meteor Up: Production Quality Meteor Deployments Building Started: /root/TS/ Bundling Error: code=137, error: -------------------STDOUT------------------- Figuring out the best package versions to use. This may take a moment. -------------------STDERR------------------- bash: line 1: 31217 Killed meteor build --directory /tmp/dc37af3e-eca0-4a19-bf1a-d6d38bb8f517 以下是日志。 节点-v表示我正在使用0.10.31。 如何检查哪个脚本退出并出现错误? 还有其他想法吗? 谢谢! error: Forever detected script exited with code: 1 error
  • 如何在Meteor应用之间共享MongoDB集合?(How can I share MongoDB collections between Meteor apps?)
    问题 我希望能够为我的项目提供一个管理应用程序和一个客户端应用程序。 理想情况下,我希望能够拥有一个共享的MongoDB集合。 我将如何做到这一点? 我尝试在两个不同的应用程序中创建具有相同名称的集合,但发现Meteor会将数据分开。 知道我能做什么吗? 谢谢。 回答1 export MONGO_URL=mongodb://localhost:3002/meteor 然后运行流星应用程序,它将更改流星使用的默认数据库。 因此,共享数据库或馆藏将不是问题! 出于管理原因,除了使用流星内部的MongoDB之外,我将使用由我自己管理的单个MongoDB服务器。 回答2 一个合理的问题,可能值得超出此答案的讨论: MongoDB连接由Meteor应用程序进程本身处理,据我所读和理解,这是Meteors哲学的一部分,其目标是一种可以描述为以下方法的方法:一个数据源服务于属于它的一个应用程序,但许多客户订阅它。 考虑到这一点,在一个应用程序(即您的Meteor应用程序)中组合“ admin”和“ client”客户端可能是首选方法。 但是,从服务器管理的角度来看,连接由Meteor以这种方式处理,从而始终有默认的本地数据源驻留在您的项目目录中( .meteor/local/db ,尝试使用meteor mongo --url获取mongo连接)在流星应用程序进程运行时的字符串)。 但是
  • Using node ddp-client to insert into a meteor collection from Node
    I'm trying to stream some syslog data into Meteor collections via node.js. It's working fine, but the Meteor client polling cycle of ~10sec is too long of a cycle for my tastes - I'd like it be be ~1 second. Client-side collection inserts via console are fast and all clients update instantly, as it's using DDP. But a direct MongoDB insert from the server side is subject to the polling cycle of the client(s). So it appears that for now I'm relegated to using DDP to insert updates from my node daemon. In the ddp-client package example, I'm able to see messages I've subscribed to, but I don't see