Socket在写入之前正在等待客户端写入

时间:2013-08-25 00:03:19

标签: php apache sockets ubuntu websocket

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

这当然是一种考验。

问题:输出'running'仅在客户端发送数据时发送。似乎循环暂停等待客户端回写。

代码:

$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

2 个答案:

答案 0 :(得分: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 Client Server Example

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

答案 1 :(得分:1)

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

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

请记住,telnet是一个实际的协议(http://tools.ietf.org/html/rfc854),而nc只是直接的TCP。

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