【问题标题】:Sending json data through PHP sockets in Windows 7 command line windows在 Windows 7 命令行窗口中通过 PHP 套接字发送 json 数据
【发布时间】:2015-02-17 20:11:08
【问题描述】:

我检查了 php sockets read json array from java server Sending configuration data to websocket 并花了一整天的时间寻找以下问题的解决方案。 我有Client.php

    <?php
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Couldn't create socket: [$errorcode] $errormsg \n");
}

echo "Socket created \n";

//Connect socket to remote server
if(!socket_connect($sock , '127.0.0.1', 23))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not connect: [$errorcode] $errormsg \n");
}

echo "Connection established \n";

 $data = file_get_contents ("C:\Users\(myUsername here)\Desktop\sockets\Test.txt");
        $json = json_decode($data, true);
        echo $data . " this is data from file\n";
        echo $json . " this is decoded version\n";
        echo json_encode($data) . " this is encoded version\n";
        $jsonSer = serialize($json);

//socket_write($sock,  count($json). "\n\r");
socket_write($sock, $jsonSer);
echo $jsonSer . " this is serialized version\n";
echo unserialize($jsonSer) . " this is unserialized message\n";
//Send the message to the server
//$sock , $message , strlen($message) , 0
//JSON.stringify(data)
if( ! socket_send($sock, $jsonSer, 1024, 0))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not send data: [$errorcode] $errormsg \n\r");
}

echo "Message send successfully \n";
?>

还有Server.php

<?php
// we create the socket (domain, type, protocol)
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
// AF_UNIX
// if false we pass error code to strerror to get a textual explanation of the error
// and exit execution of the code
if (!$socket) {
    echo "Couldn't create socket";
    exit(socket_strerror(socket_last_error()));
}
echo "Socket created.\n";

//$address = '127.0.0.1';
//$port = '23';
// we bind the name given in address to the socket
$socket_bound = socket_bind ($socket ,  '127.0.0.1', 23);
if (!$socket_bound) {
    echo "Couldn't bind socket";
    exit(socket_strerror(socket_last_error()));
}
echo "Socket bound.\n";

// we tell the socket to listen for incoming connections on socket and keep them in
// backlog (e.g. 25)
$backlog = 25;
$socket_is_listening = socket_listen($socket, $backlog);
if (!$socket_is_listening) {
    echo "Socket is not listening";
    exit(socket_strerror(socket_last_error()));
}
echo "Socket is listening...\n";

// we set socket to be non-blocking in order to fork connections
socket_set_nonblock($socket);
echo "Waiting for connections...\n";



$server_is_listening = true;
while($server_is_listening) {
    // Accept incoming connection
    $connection = socket_accept($socket);
    if (!$connection){
        // we check every 100ms for new connections
        usleep(100);
    }elseif($connection>0){
        // fork connections
        // update connections progress and tell the user
        // parse json to php object or array (2nd para = 1)
        //$database_data_php = json_decode($database_data_json,0);
        // accept incoming connection


       /* //display information about the client who is connected
        if(socket_getpeername($client , $address , $port))
        {
            echo "Client $address : $port is now connected to us.";
        }*/
        $response = "Amazing, server responded";
        echo "Yay !!! We have a connection\n";

        if(socket_getpeername($connection , $address , $port))
            {
                echo "Client $address : $port is now connected to us. \n";
                echo "Connection is: $connection\n";
            }
        //Now receive reply from server
        /*socket_recv ( $connection , $data , 2045 , MSG_WAITALL )*/
        //socket_read($connection, 512, PHP_NORMAL_READ);
        $input = socket_read($socket, $spawn, 1024);
        echo $input . " INPUT";
        $buffer = socket_recv($socket, $dataIn, 1024, 0);

        echo $buffer . " buffer";
        if(!socket_recv($socket, $dataIn, 1024, MSG_WAITALL)){
            $errorcode = socket_last_error();
            $errormsg = socket_strerror($errorcode);

            die("Could not receive data: [$errorcode] $errormsg \n");
        }

        //print the received message
        $response = unserialize($dataIn);
        echo $dataIn;
        //echo $buff;
        socket_write($connection, $response);
        //socket_close($connection);

    }else{
        echo "Error: ".socket_sterror($connection);
        die;
    }

}

我使用 Windows 7 atm,但该应用程序将在命令行中的 unix 系统上运行。我打开 2 个 cmd 窗口并首先启动 Server.php。我在第二个 cmd 窗口中启动 Client.php。我收到以下错误(Server.php)。

Socket created.
Socket bound.
Socket is listening...
Waiting for connections...
Yay !!! We have a connection
Client 127.0.0.1 : 50162 is now connected to us.
Connection is: Resource id #5
 C:\Users\(myUsername here)\Desktop\sockets\Server.php on line 70
 PHP Warning:  socket_recv(): unable to read from socket [0]: The operation completed successfully.
 in C:\Users\(myUsername here)\Desktop\sockets\Server.php on line 72

Warning: socket_recv(): unable to read from socket [0]: The operation completed successfully.
 in C:\Users\(myUsername here)\Desktop\sockets\Server.php on line 72
 PHP Warning:  socket_recv(): unable to read from socket [0]: The operation completed successfully.
 in C:\Users\(myUsername here)\Desktop\sockets\Server.php on line 75

Warning: socket_recv(): unable to read from socket [0]: The operation completed successfully.
 in C:\Users\(myUsername here)\Desktop\sockets\Server.php on line 75
Could not receive data: [0] The operation completed successfully.

当我发送一个字符串时没有问题。请问如何处理 json 数据?

【问题讨论】:

  • 是否有理由不使用运营商协议(HTTP 是显而易见的选择)?
  • 这将是数据库和本地计算机之间的本地连接。我发现“AF_INET IPv4 Internet based protocols。TCP 和 UDP 是这个协议族的常用协议。”在 php 手册中。最终“AF_UNIX 本地通信协议族。高效率和低开销使其成为 IPC(进程间通信)的一种很好的形式”。将会被使用。我想先在我的机器上测试它。您能向我解释一下在这种情况下如何使用 HTTP 吗?如果可行,我会试一试。谢谢
  • 这引发的问题比它回答的要多(高效率和 JSON 不是明显的伙伴)。但要回答您的问题 - 一个 REST 服务器。

标签: php json sockets


【解决方案1】:

已给出解决方案。我需要将 json 作为字符串发送并且它有效。 下面是client.php

$jsonString = "";
$handle = fopen("C:\Users\(myUsername)\Desktop\sockets\Test.txt", "r");
if ($handle) {
    while (($buffer = fgets($handle, 4096)) !== false) {
        echo $buffer."\n";
        //echo gettype($buffer)." buffer inside";
        $jsonString.=$buffer;
    }
    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
}
socket_write($sock, $jsonString);
fclose($handle);

Server.php 下面

$jsonString = "";
        if(!socket_last_error($socket)){
            while($buffer=socket_read($connection,2048)){
               //echo $buffer;
               $jsonString.=$buffer;
            }
        }
echo $jsonString;

我希望它可以帮助某人并避免一些头痛。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2021-01-31
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多