【发布时间】:2015-06-29 13:49:23
【问题描述】:
我正在尝试通过 PHP 的 stream_socket_server() 使 tcp 套接字服务器创建和维护持久的双向通信。
简短的问题:
如何使用
stream_socket_server()保持创建 tcp 服务器 活着 - 在第一次成功数据后没有失败接收数据 接收,在我的情况下,在 telnet 之后在终端中键入一个字符 命令?
加长版 - 我期望达到的效果
只是为了说明,查看使用 smtp 服务器远程登录某些主机时的通信类型。您输入终端telnet somehost 25 并获得欢迎响应和(通常)smtp 横幅。 并且连接仍然存在。 然后你输入 hello 命令,你会再次得到响应,并带有继续发出进一步命令的选项。 再次,连接仍然存在,您得到了响应并选择继续。这正是我所追求的通信类型。
到目前为止我做了什么
这段代码:
<?php
$server = stream_socket_server("tcp://0.0.0.0:4444", $errno, $errorMessage);
if ($server === false) throw new UnexpectedValueException("Could not bind to socket: $errorMessage");
for (;;) {
$client = stream_socket_accept($server);
if ($client)
{
echo 'Connection accepted from ' . stream_socket_get_name($client, false) . "\n";
echo "Received Out-Of-Band: " . fread($client, 1500) . "\n";
#fclose($client);
}
}
如果您只是尝试通过另一个 PHP 脚本(即stream_socket_client())发送数据(每次拍摄一次),则效果很好。
此脚本创建的服务器无法维护我所描述的连接类型。在完成telnet localhost 4444 之后,我切换到终端模式来写消息。当我这样做时,在服务器端我得到了第一个键入的字符 - 仅此而已。无论我尝试过什么,我都无法通过键入来捕获从客户端发送的新包。就像stream_socket_accept() 在收到第一个字符数据包后阻止或忽略所有。
那么,我做错了什么 - 如何解决这个问题?
【问题讨论】:
-
你可能会学到一些东西,你可以在你的 stream_socket_accept 调用中添加一个长的超时值