gpt4 book ai didi

php - 在 PHP 中设置 TCP 监听器

转载 作者:行者123 更新时间:2023-12-03 11:52:23 27 4
gpt4 key购买 nike

我们目前使用的系统通过 TCP 接收传入的 JSON 请求并使用 JSON 进行响应。目前我已经在 PHP 中像这样设置了我的套接字:

$socket = fsockopen($host, $port, $errno, $errstr, $timeout);

if(!$socket)
{
fwrite($socket, $jsonLoginRequest); // Authentication JSON

while(json_decode($loginResponse) == false) // We know we have all packets when it's valid JSON.
{
$loginResponse .= fgets($socket, 128);
}

// We are now logged in.

// Now call a test method request
fwrite($socket, $jsonMethodRequest);

while(json_decode($methodResponse) == false) // We know we have all packets when it's valid JSON.
{
$methodResponse .= fgets($socket, 128);
echo $methodResponse; // print response out
}

// Now we have the response to our method request.
fclose($socket);
}
else
{
// error with socket
}

这目前有效,服务器响应方法请求。但是,有些方法会像这样响应以确认调用,但稍后也会响应我想要的结果。所以我真正需要的是一个 TCP 监听器。任何人都可以建议我如何使用 fsock 编写 TCP 监听器,就像我上面那样?

谢谢

最佳答案

要创建监听套接字,请使用以下函数:

  • socket_create_listen (这个很酷)
  • socket_accept

  • 我不确定 fwrite()/ fread()正在使用这些套接字,否则您必须使用以下功能:
  • socket_recv
  • socket_send

  • 消息循环

    我现在编写了一些函数来读取单个 JSON 响应,假设多个响应由 CRLF 分隔。
    这是我的方法(假设您的 php 脚本具有无限的执行时间):

    // ... your code ... 

    function readJson($socket) {
    $readData = true;
    $jsonString = '';
    while(true) {
    $chunk = fgets($socket, 2048);
    $jsonString .= $chunk;

    if(($json = json_decode($jsonString)) !== false) {
    return $json;
    } elseif(empty($chunk)) {
    // eof
    return false;
    }
    }
    }

    // ....
    // Now call a test method request
    fwrite($socket, $jsonMethodRequest);

    $execMessageLoop = true;
    while($execMessageLoop) {
    $response = readJson($socket);
    if($response === false) {
    $execMessageLoop = false;
    } else {
    handleMessage($socket, $response);
    }
    }

    function handleMessage($socket, $response) {
    // do what you have to do
    }

    现在您可以实现“handleMessage”函数来分析响应并对其采取行动。

    关于php - 在 PHP 中设置 TCP 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6957071/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com