尝试打印从更多客户端收到的消息时出现问题

让我解释一下问题:我正在创建一个使用能够读取一些数据的传感器的系统,然后,每个传感器都必须将这些数据发送到服务器,该服务器将在页面上的新行中打印收到的每条消息。


Sensor.php


class Sensor extends Thread implements ISensor

{

    ....


    public function readValue(){

        $this->value = rand( -15 , 40 );

        $this->timestamp = date('Y-m-d H:i:s');

    }


    public function run(){

        $number = 0;

        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Couldn't create socket");

        $this->connectionResult = socket_connect($this->socket, $this->ip, (int)$this->port) or die("Couldn't connect to server");

        while($number <= $this->requestNumber){

            $number = $number + 1;

            $this->readValue();

            $this->sendData();

            sleep($this->frequency);

        }

        socket_close($this->socket);

    }


    public function sendData(){

        $input = $this->toString();

        socket_write($this->socket, $input, strlen($input)) or die ("Impossible send message");

    }

Server.php


set_time_limit (300);

$address = '127.0.0.1';

$port = 19000;


$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($sock, $address, $port) or die('Could not bind to address');

socket_listen($sock);


while (true) {

    $client = socket_accept($sock);

    while (0 != socket_recv($client, $message, 1024, 0))

    {

        echo $message . "<br>";

    }

    socket_close($client);

}

socket_close($sock);

预期的结果是,客户端可以连接到服务器并发送消息(这很好),而服务器只为收到的每条消息打印新行。


那部分起作用,我将用屏幕截图更好地解释(我实际上无法发布屏幕截图,如果您无法理解下面的文字说明问题,我将留下指向屏幕截图图像的链接)

http://img.mukewang.com/60a7577600013aa406410343.jpg

第一个传感器继续发送所有消息,服务器正确打印它们,然后,当线程结束时,服务器仅输出从第二个第二个传感器接收的所有消息的整行,而第一个传感器仍在运行,然后像这应该。

是因为while循环?如果删除while循环,则服务器仅为每个传感器打印一条消息。


慕仙森
浏览 116回答 1
1回答

天涯尽头无女友

终于找到了正确的密码,向我显示了包含此代码的页面ini_set('error_reporting', E_ALL ^ E_NOTICE);ini_set('display_errors', 1);// Set time limit to indefinite executionset_time_limit(0);// Set the ip and port we will listen on$address = '127.0.0.1';$port = 15000;//Implicit Flushob_implicit_flush();// Create a TCP Stream socket$sock = socket_create(AF_INET, SOCK_STREAM, 0);// Bind the socket to an address/portsocket_bind($sock, $address, $port) or die('Could not bind to address');// Start listening for connectionssocket_listen($sock);// Non block socket typesocket_set_nonblock($sock);// Clients$clients = [];// Loop continuouslywhile (true) {    // Accept new connections    if ($newsock = socket_accept($sock)) {        if (is_resource($newsock)) {            // Set Non-block for the new connection            socket_set_nonblock($newsock);            // Append the new connection to the clients array            $clients[] = $newsock;        }    }    // Polling for new messages    if (count($clients)) {        foreach ($clients AS $k => $v) {            // Check for new messages            $string = '';            if ($char = socket_read($v, 1024)) {                $string .= $char;            }            // New string for a connection            if ($string) {                echo "$string <br>";            } else {                if ($seconds > 30) {                    // Ping every 5 seconds for live connections                    if (false === socket_write($v, 'PING')) {                        // Close non-responsive connection                        socket_close($clients[$k]);                        // Remove from active connections array                        unset($clients[$k]);                    }                    // Reset counter                    $seconds = 0;                }            }        }    }    sleep(1);    $seconds++;}// Close the master socketssocket_close($sock);并完美地工作!
打开App,查看更多内容
随时随地看视频慕课网APP