我在套接字服务器中使用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>');
}
});
答案 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);
}
}
但是,这并不能解释为什么您无法读取数据。