avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 RpcService.php receive 没有收到数据
文章

RpcService.php receive 没有收到数据

发表于 2026-06-15 更新于 2026-06- 15
作者 mdo
5~7 分钟 阅读

我来分析一下为什么 RPC 服务端的 receive 事件没有收到数据。通过查看代码,我发现了几个关键问题:

  1. 在 RpcClient.php 中,数据发送使用了 JsonProtocol::encode() 进行编码,它会在 JSON 数据后添加换行符 "\n" 作为结束标记。

  2. 在 RpcService.php 中,服务端配置了固定包头协议(代码被注释掉了),但实际处理时没有使用任何协议解析。

  3. 在 RpcService.php 中,receive 事件处理器直接接收原始数据,没有处理可能的粘包问题。

解决方案:

  1. 首先需要取消注释并配置服务端的协议设置:

代码位置:RpcService.php

修改为:

// 设置 RPC 端口的独立参数(使用换行符作为分包协议)
$rpcPort->set([
    'open_eof_check' => true,
    'package_eof' => "\n",
    'open_eof_split' => true,
]);
  1. 修改 receive 事件处理逻辑,添加数据验证:

代码位置:RpcService.php

修改为:

$rpcPort->on('receive', function (SwooleServer $serv, int $fd, int $reactorId, string $data)
{
    if (empty($data)) {
        return;
    }
    file_put_contents(runtime_path() . '/rpc.log', date('Y-m-d H:i:s') . " Received: " . $data . "\n", FILE_APPEND);
    $this->handleRpcRequest($serv, $fd, $reactorId, $data);
});
  1. 在 handleRpcRequest 方法中添加更详细的日志记录:

代码位置:RpcService.php

修改为:

protected function handleRpcRequest(SwooleServer $serv, int $fd, $reactorId, string $data)
{
    try {
        // 记录接收到的原始数据
        file_put_contents(runtime_path() . '/rpc.log', date('Y-m-d H:i:s') . " Processing: " . $data . "\n", FILE_APPEND);
        
        // 去掉换行符
        $data = trim($data);
        
        // 解析 JSON 数据
        $request = json_decode($data, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new \Exception("Invalid JSON data: " . json_last_error_msg());
        }
  1. 确保响应数据也添加换行符:

代码位置:RpcService.php

修改为:

// 响应客户端(添加换行符作为结束标记)
$sendData = json_encode($response) . "\n";
return $serv->send($fd, $sendData, $reactorId);

这些修改的主要目的是:

  1. 配置 Swoole 使用换行符作为分包协议,确保正确处理数据包边界

  2. 添加数据验证和错误处理

  3. 增加详细的日志记录,便于调试

  4. 确保服务端和客户端使用相同的协议格式

修改后,请检查 runtime_path() . '/rpc.log' 文件,查看是否有数据接收记录。如果仍然没有数据,可能需要检查:

  1. 客户端连接的地址和端口是否正确

  2. 防火墙是否阻止了连接

  3. Swoole 服务是否正常启动并监听在指定端口

知识库
许可协议:  CC BY 4.0
分享

相关文章

10月 7, 2026

比尔盖茨的智慧:想多赚钱,就每天循环做这3件事

我们总有一种非常固执的错觉,认为那些站在财富金字塔顶端的人,必然拥有某种超越常人的特异功能。我们在脑海中给比尔盖茨这样的大佬描绘了一幅极其悲壮的奋斗画像。大家总觉得,他之所以能富可敌国,肯定是因为他每天只睡三个小时,同时对着八个电脑屏幕疯狂敲击键盘,每一秒钟都在做出价值几亿美金的生死抉择。 为了模仿

9月 28, 2026

程序员越想创业,越不要急着动手

一个能源方面的前辈找到我,希望通过我把一些人工的工作 AI 自动化。 能源方面我不懂,找 Gemini 聊完发现这个是可以复制的,非常兴奋。我跟老婆说,这个项目做好以后可以做成平台,推广到其他公司,你就等着做总裁夫人吧! 她听完以后跟我说,这个项目还是太定制化,和我之前做的一个项目很像。 那个项目一

9月 25, 2026

忍了一年多,我终于对i18n下手了过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道

前言 大家好,我是奈德丽。 过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道。熟悉我的朋友都知道,我这个人比较“惜力”(并不是,实际上只是忍不下去了),对于重复笨拙的工作非常抵触,于是,我开始思考如何优化团队的多语言管理模式。 痛点背景 先说说我们在机票项目中遇到的

下一篇

think-swoole4.0通过监听端口自定义rpc服务 

上一篇

think-swoole WebSocket 的核心步骤与代码实现

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。