socket_read($ spawn,2480)在/ n或/ r之后不读取完整输入

时间:2017-11-22 05:39:57

标签: php sockets tcp tcp-ip php-socket

我有一台TCP服务器与IOT设备连接,该设备通过XML格式向服务器发送数据。我编写了PHP服务器代码并从客户端IOT读取输入数据并将它们存储在日志中。

问题:

IOT XML输入带有许多由“/ n”分隔的xml数据。现在的问题是,当我读取套接字输入时,它没有采用所有IOT XML输入。得到“/ n”之后停止阅读之后的内容。

我需要做什么,读取套接字服务器的所有传入输入,包括“/ n”和所有?

这是我的套接字服务器代码:

     <?php
    // set some variables
    $host = "XXXXXXXXXXX";
    $port = 5008;
    // don't timeout!
    set_time_limit(0);
    // create socket
    $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
    // bind socket to port
    $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
    // start listening for connections
    $result = socket_listen($socket, 3) or die("Could not set up socket listener\n");

    // accept incoming connections
    // spawn another socket to handle communication
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
    // read client input

    while ($input = socket_read($spawn, 15360, PHP_BINARY_READ) or die("Could not read input\n")) { 
        $file = date("Ymd")."_uid.txt";
        // clean up input string
        $input = trim($input);
        // $xml = simplexml_load_string($input);
        // $json = json_encode($xml);
        file_put_contents($file, $input, FILE_APPEND | LOCK_EX);

        echo "[" . $input . "]"; 
        // reverse client input and send back
        $output = strrev($input);
        socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");

        if ($input != "") { 
            break; 
        } 
    }

    // close sockets
    socket_close($spawn);
    socket_close($socket);

    ?>

输入XML格式为

<?xml version="1.0"?><Message><TerminalType>M50</TerminalType> <DeviceUID>037f6c</DeviceUID> <TerminalID>1</TerminalID> <DeviceSerialNo>69201707250004</DeviceSerialNo> <TransID>0</TransID> <Event>TimeLog</Event> <Year>2017</Year> <Month>11</Month> <Day>22</Day> <Hour>9</Hour> <Minute>54</Minute> <Second>44</Second> <UserID>4</UserID> <AttendStat>Duty On</AttendStat> <VerifMode>FP</VerifMode> <JobCode>0</JobCode> <APStat>None</APStat> <Photo>No</Photo> </Message>

我的代码出了什么问题?我无法获得所有物联网日志。

0 个答案:

没有答案