1

愿望:我想连接到套接字并每秒向客户端发送“正在运行”。

这当然是一个考验。

问题:仅当客户端发送数据时才会发送输出“正在运行”。似乎循环正在暂停等待客户端回写。

代码:

$socket = @socket_create_listen("12345");

while (true) {
    $client = socket_accept($socket);
    $msg = "\nHello"."\r\n".chr(0);
    $length = strlen($msg);
    socket_write($client, $msg,$length);
    usleep(5);

    while (true) {
        $msg = 'running'."\r\n".chr(0);
        $length = strlen($msg);
        socket_write($client, $msg, $length);
        sleep(1);
    }
}

示例:上面的代码在我服务器上的一个文件中。如果我运行这个文件,然后使用 telnet 连接到我的服务器上的 12345 端口,telnet myip# 12345我希望每秒都会在控制台中看到“正在运行”。相反,“运行”只写一次。如果我在控制台中输入某些内容(即向服务器写入数据),则会再次显示正在运行的内容。因此,当我向服务器发送内容时,只会将运行发送到控制台。

什么可能导致这种情况?

谢谢 JT

4

2 回答 2

2

服务器看起来不错。问题很可能出在您的客户身上。我调整了您的服务器并编写了一个成功测试的客户端。我的调整是检查套接字是否关闭。否则,您将进入连续循环。

这是socketserver.php

echo "Starting Server" . "\n\r";
$socket = @socket_create_listen("55000");
while (true) {
    $client = socket_accept($socket);
    $msg = "\nHello"."\r\n".chr(0);
    $length = strlen($msg);
    socket_write($client, $msg,$length);
    usleep(5);

    while (true) {
        $msg = 'running'."\r\n".chr(0);
        $length = strlen($msg);
        $test  = socket_write($client, $msg, $length);
        sleep(1);
        if ($test === false) {
            echo "socket probably closed\n";
            exit;
        }

    }
}

这是socketclient.php

$address = '127.0.0.1';
$port = 55000;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    exit;
}

echo "\nStarting client";
echo "\nAttempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
echo "\n\nReading responses...\n\n";
while ($out = socket_read($socket, 2048)) {
    echo $out;
}

echo "\nClosing socket...";
socket_close($socket);

这是结果的屏幕截图。

PHP 客户端服务器示例

我意识到这是一个测试,但请注意,使用 UDP 设计的周期性状态服务器更有意义。

于 2013-08-25T01:17:33.597 回答
1

您是否尝试过使用任何其他客户端?nc (netcat) 非常适合测试事物。此外,在您的服务器中放置一些输出,以便在发送数据时记录(到屏幕或文件)。

我猜你的服务器工作正常,但你的客户端在某种程度上搞砸了。只需输入nc <my_ip> 12345,看看你得到什么。

请记住,telnet 是一个实际的协议(https://www.rfc-editor.org/rfc/rfc854),而 nc 只是直接的 TCP。

此外,NUL 终止字符串可能会导致奇怪的问题。丢失 chr(0) 位,看看是否会变得更好。

于 2013-08-25T01:11:56.190 回答