当前位置: 首页 > 知识库问答 >
问题:

NodeJS从PHP服务器接收数据

辛星宇
2023-03-14

我目前正在开发一个简单的NodeJS客户端,它使用网络类连接到PHP服务器。此外,NodeJS客户端还可以作为Socket.IO服务器,将从PHP服务器接收到的数据发送到与Socket.IO.连接的浏览器。

到目前为止,一切都很好。但是如果我连接另一个客户端到Socket。IO,PHP服务器必须向每个连接的客户端发送通知。因此,它向NodeJS客户机发送一个JSON编码的数组,由客户机处理JSON数据(解码并稍微修改一下)。

现在的问题是,有时PHP服务器发送的两条单独的消息会连接在NodeJS的onData事件处理函数中:

client.on("data", function(data) {

   var msgData = JSON.parse(data.toString("utf8"));
   [...]
}

变量数据现在有时(不是每次!)包含两个 JSON 字符串,例如:

 { "todo":"message", [...] } { "todo":"message", [...] }

这当然会导致JSON.parse函数抛出异常。我预计会调用onData-函数两次,变量data为:

{ "todo":"message", [...] }

在 PHP 服务器端,我必须遍历一个包含当前提供的所有 Socket.IO 连接的数组:

foreach($sockets as $id => $client) {

    $nodeJS->sendData($client, array("todo" => "message", [...]);
}

$nodeJS-

socket_write($nodeClient, json_encode($dataToSend));

$nodeJS-

我现在不知道PHP或NodeJS是连接这两个字符串。我想要的是,NodeJS每次调用$nodeJS-时都会调用onData-handler一次

有没有更容易的方法来实现这一点?

共有2个答案

曹自怡
2023-03-14

尝试在PHP端的JSON字符串后面添加一行。

洪越泽
2023-03-14

重要的是要记住,当您从套接字读取时,数据将以任意块的形式出现,完全取决于您的代码将它们拆分为有意义的处理单元;绝对不能保证每个块将对应于一个有意义的单位。

yannisgu已经为您提供了解决方案的第一部分(用换行符终止每个单元,这样您的代码可以知道它在哪里结束):现在您需要实现第二部分,即缓冲您的传入数据并将其拆分成单元。

在初始化时,执行以下操作

var buf = '';

并将< code>client的编码设置为utf8。

在您的“数据”处理程序中:[更新:合并了 josh3736 的建议]

buf += data;
var idx;
while ((idx = buf.indexOf('\n')) >= 0) {
   // there's at least one complete unit buffered up
   var unit = buf.slice(0, idx);
   // extract it
   if (unit.slice(-1) == '\r') {
     // CRLF delimited
     unit = unit.slice(0, -1);
   }
   if (unit.length) {
     // ignore empty strings
     var msgData = JSON.parse(unit);
     [...]
     // process it
   }
   buf = buf.slice(idx +1);
   // discard it
}
// at this point, buf is either empty or contains an incomplete
// unit which will be processed as soon as the rest of it comes in
 类似资料:
  • 我有一个nodejs聊天服务器,它有不同的事件“Connection”,“SendChat”,“Switchroom”... null Thx很多!

  • 我在做一个应用程序,把一些数据存储在数据库中,然后它再检索它。在服务器端,我使用的是PHP,在客户端,我有一个获取输入并将其传递给PHP文件的文件。 另外,我有这个JsonParser:

  • 有人知道netty服务器处理程序取消从web服务器接收数据的最佳方法吗?我有一个服务器处理程序,它将HttpRequests代理到web服务器。但是,当请求客户端取消请求时,我希望在不关闭服务器处理程序和web服务器之间的连接的情况下停止从web服务器接收服务器通道上的数据。 有谁知道我怎么才能做到这一点。你的答复将不胜感激。 非常感谢。

  • 我想连接到树莓Pi节点。我从网络外部设置的js服务器。 我的路由器声称端口是开放的。我尝试在127.0.0.0、0.0.0.0和我的公共IP地址运行服务器。 我曾尝试使用ngrok打开端口8080,服务器在其中托管一个简单的网页,但尝试访问myIP:8080不起作用。 有人能帮我吗?

  • 我想做的是: 为了学习游戏编程,我使用专用服务器和UDP创建了一个回声设置。专用服务器在不同的城市(也就是不在我的本地网络中)。 在我的本地计算机上,我有一个udp客户端和服务器(两个不同的程序)。当我第一次启动python服务器时,windows防火墙立即询问我是否要添加异常。在允许我的python服务器联网之后,我仍然没有收到任何消息。(客户- 我的问题是: 游戏如何解决这个问题?我没有为我想

  • 我试图用php执行nodejs,这样做非常简单 我的nodejs文件创建了一个带有Express的服务器。 当文件运行时,这就是输出 错误:侦听EACCES 127.0。0.1:82 bject.exports._errnoException(util.js:873: 11) 在出口方面_主机端口例外(util.js:896:20) 在服务器上_listen2(net.js:1237:19) 听(

  • 我有一个示例代码如下,套接字绑定到IP10.10.88.11和端口9876。我用下面的wireshark测试了2种情况。两台电脑都在同一个子网中。 从同一PC发送UDP数据包(10.10.88.11)-UDP服务器能够接收 从另一台电脑发送UDP数据包(10.10.88.10)-UDP服务器无法接收,但Wireshark(在10.10.88.11)能够捕获数据包 我在网上搜索过,但找不到解决办法。

  • 我试图让一些基于PAHO的客户机使用Vert.x MQTT服务器。我试图发布到我的接收客户端订阅的测试主题。我很难从客户端发布者向客户端订阅者发送消息。 使用我在Internet上看到的真实例子,我构建了一个MQTT代理。vert.x MQTT代理代码的代码如下所示: 我很确定我在这里错过了什么,但我想不出会是什么。有人能帮我把这个弄好吗??? 提前感谢您的任何帮助或见解。