Php 套接字客户端发送消息

Php 套接字客户端发送消息,php,sockets,Php,Sockets,我是插座连接的新手, 我想向套接字服务器发送一些命令,但我只能发送第一条消息,不能发送其他消息 客户: $fp = stream_socket_client("tcp://127.0.0.1:1000", $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $cmd_1 = "hello"; fwrite($fp, $cmd_1); while (!fe

我是插座连接的新手, 我想向套接字服务器发送一些命令,但我只能发送第一条消息,不能发送其他消息

客户:

$fp = stream_socket_client("tcp://127.0.0.1:1000", $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $cmd_1 = "hello";
    fwrite($fp, $cmd_1);
    while (!feof($fp)) {
        print_r(fgets($fp, 1024));
    }
    $cmd_2 = "second message";
    fwrite($fp, $cmd_2);
    while (!feof($fp)) {
        print_r(fgets($fp, 1024));
    }
    fclose($fp);
}

问题在下面一行:

while (!feof($fp)) {
它所做的是:它等待该套接字上的EOF(套接字通常关闭)。它获取第一个响应,并等待进一步的响应,而不发送任何进一步的请求(同时循环)。。您希望读取发送的每个请求消息的响应消息,对吗

这样修改代码(未经测试,但应该可以正常工作):

fgets(..)
从套接字读取一行后将返回。实际上,你不需要一个while循环


另外,开始定义通信的结构/协议也是一个很好的起点。在客户端,您正在逐行阅读,而不是服务器。(服务器上)读取的套接字可以返回部分消息。如果您决定了一种通信结构,可以将读取设计为在读取整个结构之前不返回。

问题在于

if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
    echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
    break 2;
}
不要将其与false进行比较,而是执行
='


否则,连接会过早关闭-请参见此处-

您的错误是什么?事实上,你的问题是什么?我可以只发送第一条消息,我只收到第一条消息的响应,而不是第二条。你确定你的服务器的行为吗?它是否需要对从客户机获得的每个输入做出响应?你应该检查fgets和fwrite函数的返回值。我使用的是非常基本的服务器,我还附加了服务器文件。你必须使用PHP吗?python比PHP好得多
$cmd_1 = "hello";
fwrite($fp, $cmd_1);
print_r(fgets($fp, 1024));

$cmd_2 = "second message";
fwrite($fp, $cmd_2);
print_r(fgets($fp, 1024));

fclose($fp);
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
    echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
    break 2;
}
if ('' === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
    echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
    break 2;
}