PHP:socket_recv()失败;理由:成功?

时间:2017-06-29 06:04:32

标签: php websocket

我在套接字服务器中使用PHP。我创建套接字和写入套接字但无法读取。我已将所有客户端套接字附加到 clients 数组中。我使用标志 MSG_DONTWAIT ,因为如果我使用其他标志我不能与其他客户端握手。帮我在这里找到bug或者给我一些在这种情况下可以使用的代码。

foreach($clients as $client) {
    if ( socket_recv($client, $buf, 1024, MSG_DONTWAIT) >= 1) {
        print_r($buff);
    }  else {
       echo "socket_recv() failed; reason: " .                                 
              socket_strerror(socket_last_error($socket)) . "\n";
    }         
}

但是,我在下面收到消息。请帮助我找到接收客户的消息。

PHP: socket_recv() failed; reason: Success

Jquery代码:

$(document).ready(function() {

//create a new WebSocket object.
var wsUri = "ws://172.28.21.45:9000";   
var websocket = false;

websocket = new WebSocket(wsUri);

$("#messageform").click( function(ev) {

    ev.preventDefault();

    var message = $("#message").val();
    var packet = {
        message: message
    };

    console.log(packet);
    websocket.send(JSON.stringify(packet));

    $("#message").val('');
});

websocket.onopen = function(ev) {

    //ev.preventDefault();
    $(".notification").html('<a href="messagearchive.php"><img src="images/bell.svg" width="25px;"/><br/><span style="color: green;">Connected</span>    ');
}

websocket.onmessage = function(ev) {

    ev.preventDefault();
}
websocket.onerror = function(ev)  {
    $(".notification").append('<p>Socket has error</p>');
}
websocket.onclose = function (ev) {
    $(".notification").append('<p>Socket is closed</p>');
}   

});

1 个答案:

答案 0 :(得分:0)

如果出现错误(this information is in the manual),函数socket-recv将返回读取的字节数 false

断开连接上,您会收到0个字节,而您的if并未检查此情况。

我建议你稍微改变你的php阅读代码:

foreach($clients as $client) {
  $bytes = socket_recv($client, $buf, 1024, MSG_DONTWAIT);
  if ($bytes === false) {
    echo "socket_recv() failed; reason: " .                                 
          socket_strerror(socket_last_error($socket)) . "\n";
  } elseif ($bytes === 0) {
    echo "Disconnection\n";
  } else {
    print_r($buff);
  }
}         

但是,这并不能解释为什么您无法读取数据。