PHP如何连接套接字并读取响应?

标签 php sockets response

标题说明了一切...

如何使用 tcp 协议(protocol)连接到 IP 并读取/获取响应? 我搜索了很多,但没有找到任何解决方案。

$socket = stream_socket_server("tcp://127.0.0.1:22", $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) {
echo fread($conn, 26);
    fclose($conn);
  }
  fclose($socket);
}

这段代码可以吗? 工作有吗? 因为它似乎没有完成这项工作...

提前致谢

最佳答案

按照其他人的建议;避免使用端口 22。我建议使用一个模糊的(未使用的)套接字端口号 > 1024,例如 4444。任何低于 1024 的端口通常都需要 root 访问权限。 如果您需要测试 22 的连接,请让您的服务器脚本运行其他功能。

至于将响应发送回连接的客户端,请使用 stream_socket_recvfrom($socket, $length, 0, $peer) 而不是 fread()

然后在客户端添加响应监听器:

client.php

$socket = stream_socket_client('tcp://127.0.0.1:4444');
if ($socket) {
    $sent = stream_socket_sendto($socket, 'message');
    if ($sent > 0) {
        $server_response = fread($socket, 4096);
        echo $server_response;
    }
} else {
    echo 'Unable to connect to server';
}
stream_socket_shutdown($socket, STREAM_SHUT_RDWR);

server.php

$conn = stream_socket_server('tcp://127.0.0.1:4444');
while ($socket = stream_socket_accept($conn)) {
    $pkt = stream_socket_recvfrom($socket, 1500, 0, $peer);
    if (false === empty($pkt)) {
        stream_socket_sendto($socket, 'Received pkt ' . $pkt, 0, $peer);
    }
    fclose($socket);
    usleep(10000); //100ms delay
}
stream_socket_shutdown($conn, \STREAM_SHUT_RDWR);

运行server.php,它将无限循环监听非空数据包 一旦 server.php 收到数据包,它将用接收到的数据包响应连接的客户端。

然后执行client.php,它将发送“消息”到server.php 发送后,它将检索并回显来自 server.php 的响应,该响应应为 'Received pkt message'

关于PHP如何连接套接字并读取响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18477639/

相关文章:

php - 如何在 PHP 应用程序中验证 Google Cloud Speech-To-Text 客户端?

c# - 如何在 Socket 类中使用动态端口?

java - REST - 如何在 javax.ws.rs.core.Response 实体中显示某些 getter

php - 使用 HTML 表单作为方案动态查询数据库

php - 如何将数据添加到数据库? PHP MySQL

c - 使用 C 语言的套接字编程,使用 select() 函数

javascript - 获取循环套接字对象nodejs的属性

javascript - jQuery get - 使用返回值

python - Falcon 框架响应对象 : resp. 媒体与 resp.body

php - 如何检索不同 php-html 页面上同一个表的最后插入的自动生成的 id