【问题标题】:Make stream_socket_server to stay functional after first received data package使 stream_socket_server 在第一次收到数据包后保持功能
【发布时间】: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 调用中添加一个长的超时值

标签: php sockets tcp stream


【解决方案1】:

您的程序在循环返回以接受另一个传入连接之前只执行一次读取。

documentation for fread 声明它会在收到数据包后立即返回。也就是说,它不会等待完整的 1500 个字节。

鉴于人类打字的速度很慢,您最终会向您的服务器发送一个包含单个字符的数据包,该数据包被返回,然后它继续接受另一个传入的连接。

像这样围绕您的阅读设置一个循环:

for (;;)  {
    $client = stream_socket_accept($server);

    if ($client) {
        echo 'Connection accepted from ' . stream_socket_get_name($client, false) . "\n";
        for (;;) {
            $data = fread($client, 1500);
            if ($data == '') break;
            echo "Received Out-Of-Band: " . $data . "\n";
        }
        fclose($client);
    } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2019-02-23
    • 1970-01-01
    • 2018-11-14
    相关资源
    最近更新 更多