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
分享

相关文章

7月 21, 2026

think-orm 2.0.62 单独设置数据表字段缓存驱动和数据缓存驱动

think-cache 拥有强大的多通道(Multi-store)管理能力,但问题的根源在于 think-orm 底层的调用机制太死板。即使您在 think-cache 中配置了 file 和 redis 两个完全独立的通道,think-orm 默认也只会向您通过 Db::setCache() 注入

7月 1, 2026

WebSocket Server + 独立 RPC Server

从架构角度来说,它已经接近 think-swoole 能做到的极限了,但是我仍然不建议继续这样维护。 原因不是代码写法,而是 think-swoole 本身的事件模型。 第一处问题:addListener() 仍然共享 Worker 你的代码: $rpcServer = $server->addLi

6月 25, 2026

Linux | Reqable · API抓包调试 + API测试一站式工具

Reqable是什么? Reqable = Fiddler + Charles + Postman 极简的设计、极高的性能、丰富的功能、桌面手机多端平台。 多协议流量分析 基于经典的MITM中间人代理方案捕获和分析您的应用流量,自适应HTTP/HTTPS/SOCKS4/SOCKS5等多种代理协议,并

下一篇

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

上一篇

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

最近更新

  • 完美地解决 TP3 老系统数据的平滑读取
  • thinkphp3 redis序列化和反序列化
  • Table 空间极易发生哈希冲突并溢出
  • 将监控程序直接跑在云端
  • AI 驱动型 Facebook 群组关键词监控 Chrome 浏览器插件

热门标签

API CodeGeex Gitkraken Management Manticore Premiere Sublime Swoole ThinkPHP ThinkPHP5

目录

©2026 mdo. 保留部分权利。