簡體   English   中英

PHP掛在socket_read上

[英]PHP hanging on socket_read

我正在嘗試從我在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

這是預期的。

在PHP客戶端程序中,在套接字寫入和讀取之間插入usleep(500)

代碼被掛起的原因是因為您的緩沖區大於要發送的數據。

如果將緩沖區從1000字節降低到1字節,則會看到腳本不再掛起。

從PHP手冊中:

可選的type參數是一個命名常量:

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")...

只是在黑暗中拍攝,但我會嘗試的。

編輯:

這是對我有用的代碼片段:

$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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM