Настройте прослушиватель TCP в PHP - PullRequest
2 голосов
/ 05 августа 2011

В настоящее время мы используем систему, которая принимает входящий JSON-запрос по TCP и отвечает также с помощью JSON.В настоящее время я настроил свой сокет так в PHP:

$socket = fsockopen($host, $port, $errno, $errstr, $timeout);

if(!$socket)
{
  fwrite($socket, $jsonLoginRequest); // Authentication JSON

  while(json_decode($loginResponse) == false) // We know we have all packets when it's valid JSON.
  {
     $loginResponse .= fgets($socket, 128);
  }

  // We are now logged in.

  // Now call a test method request
  fwrite($socket, $jsonMethodRequest);

  while(json_decode($methodResponse) == false) // We know we have all packets when it's valid JSON.
  {
     $methodResponse .= fgets($socket, 128);
     echo $methodResponse; // print response out
  }

  // Now we have the response to our method request.
  fclose($socket);
}
else
{
  // error with socket
}

В данный момент это работает, и сервер отвечает на запрос метода.Тем не менее, некоторые методы будут отвечать таким образом, чтобы подтвердить вызов, но также будут отвечать позже с результатами, которых я добиваюсь.Так что мне действительно нужен TCP-слушатель.Кто-нибудь может посоветовать, как я могу написать слушатель TCP, используя fsock, как у меня выше?

Спасибо

1 Ответ

3 голосов
/ 05 августа 2011

Для создания прослушивающего сокета используйте следующие функции:

Я не уверен, если fwrite() / fread() работает с этими сокетами, в противном случае вы должны использовать следующие функции:

Message-петля

Теперь я написал некоторую функцию для чтения отдельных ответов JSON, предполагая, что несколько ответов разделены CRLF. Вот как я бы это сделал (при условии, что ваш php-скрипт имеет неограниченное время выполнения):

// ... your code ... 

function readJson($socket) {
    $readData = true;
    $jsonString = '';
    while(true) {
        $chunk = fgets($socket, 2048); 
        $jsonString .= $chunk;

        if(($json = json_decode($jsonString)) !== false) {
            return $json;
        } elseif(empty($chunk)) {
            // eof
            return false;
        }
    }
}

// ....
// Now call a test method request
fwrite($socket, $jsonMethodRequest);

$execMessageLoop = true;
while($execMessageLoop) {
    $response = readJson($socket);
    if($response === false) {
        $execMessageLoop = false;
    } else {
        handleMessage($socket, $response);
    }
}

function handleMessage($socket, $response) {
    // do what you have to do
}

Теперь вы можете реализовать функцию handleMessage, которая анализирует ответ и реагирует на него.

...