PHP висит на socket_read - PullRequest
       2

PHP висит на socket_read

0 голосов
/ 06 января 2012

Я пытаюсь прочитать ответ из сокета, который я написал в приложении Java.Однако PHP просто висит.Вот код, который я использую для чтения из сокета:

while($resp = socket_read($socket, 1000)) {
   $str .= $resp;
   if (strpos($str, "\n") !== false) {
        break;
   }
}

Когда я запускаю вызов сокета из терминала, ответ определенно появляется.Это то, что мой код ответа в Java:

out.println(request.seed);

Где request.seed является int.Я также пытался:

out.println(request.passcode + "\n");

Но это не решило проблему.


Когда я запрашиваю в терминале следующее:

josephs-macbook:~ jf$ echo "pairBankRequest|userID=305,bankID=12," | nc 127.0.0.1 3030

Я получаюследующий ответ:

830039

что и ожидается.

Ответы [ 3 ]

1 голос
/ 15 апреля 2012

В клиентской программе PHP вставьте usleep(500) между записью в сокет и чтением.

0 голосов
/ 24 мая 2013

Причина, по которой ваш код зависает, состоит в том, что ваш буфер больше, чем отправляемые данные.

Если вы уменьшите буфер с 1000 байтов до 1 байта, вы увидите, что скрипт больше не зависает.

0 голосов
/ 07 января 2012

Из руководства по PHP:

Необязательный параметр типа является именованной константой:

PHP_BINARY_READ (по умолчанию) - использовать системную функцию recv (). Безопасен для чтения двоичных данных. PHP_NORMAL_READ - чтение останавливается на \ n или \ r.

Источник: http://www.php.net/manual/en/function.socket-read.php

Вы пытались использовать PHP_NORMAL_READ в качестве третьего аргумента для socket_read ()? Это также устранит необходимость проверки на strpos($str, "\n")....

Просто выстрел в темноте, но я бы попробовал.

Edit:

Вот фрагмент кода, который работает для меня:

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

...
// connecting the socket, etc
...

$result = '';
$numBytes = 100;
$numRead = 0;

while ($numRead < $numBytes)
{
  $tmp = socket_read($socket, $numBytes - $numRead, PHP_BINARY_READ);
  if ($tmp === false)
  {
    $error = socket_last_error();
    socket_close($socket);
    $socket = null;
    throw new Exception('Read error ('.$error.')');
  }
  $numRead += strlen($tmp);
  $result.= $tmp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...