Websockets:从 php 服务器向客户端发送消息
Websockets : Send message from php server to clients
我正在尝试从我的文件 index.php(服务器)向使用 websockets 连接的客户端发送消息。
我的 javascript 创建客户端连接的文件:
var websocket_server = new WebSocket("ws://localhost:4950/");
websocket_server.onopen = function(e) {
console.log("connected");
}
websocket_server.onmessage = function(e)
{
console.log('message received from server');
}
index.php:
$msg = "Message from server";
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");
socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR,1) or die("prbl options\n");
socket_connect($sock, '127.0.0.1', 4950) or die("could not connect\n");
socket_write($sock, $msg, strlen($msg));
客户端连接到 websocket 成功,但是当我 运行 PHP 文件时,我什么也没得到(控制台中没有错误和消息)。
换句话说,javascript 不会将我的 socket_write 视为消息 :/
有什么想法吗? :)
感谢@ADyson,我找到了解决方案;)
我现在正在使用 SSE 服务器发送的事件并且它有效!但我想知道我的代码是 'proper' 还是有更多 'adequate' 方式。
我正在使用会话超全局将服务器信息更改传递到另一个文件,该文件不断将其作为事件流读取(这就是 SSE 的工作方式)。
index.php :
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<script type="text/javascript" src="jquery.js">
</script>
<script type="text/javascript" src="stream.js">
</script>
</head>
<body>
<a>Receive message</a>
</body>
</html>
stream.js(监听服务器):
var serv = new EventSource("server.php");
serv.onmessage = function(e) {
var jdata = JSON.parse(e.data);
console.log(jdata.message);
};
serv.onopen = function(e) {
console.log('Connection opened');
}
$(document).ready(function(){
$('a').click(function(){
receive_msg();
});
});
function receive_msg(){
$.ajax({
type: "POST",
url: 'controller.php',
data: {action: 'send'}
});
}
controller.php :
<?php
session_start();
if (isset($_POST['action'])) {
$_SESSION['server']="you have received a message";
}
server.php :
<?php
session_start();
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
if (isset($_SESSION['server'])) {
$data = array(
'message'=> $_SESSION['server']
);
$data = json_encode($data);
echo "data: {$data}\n\n";
unset($_SESSION['server']);
}
它的工作方式:
客户端连接到 server.php 并不断读取文件。当服务器要向客户端发送消息时,它会创建一个会话变量。 Server.php 读取变量并将其传递到我的 js 文件。然后变量被销毁,所以我们只传递一次消息。
我正在尝试从我的文件 index.php(服务器)向使用 websockets 连接的客户端发送消息。
我的 javascript 创建客户端连接的文件:
var websocket_server = new WebSocket("ws://localhost:4950/");
websocket_server.onopen = function(e) {
console.log("connected");
}
websocket_server.onmessage = function(e)
{
console.log('message received from server');
}
index.php:
$msg = "Message from server";
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");
socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR,1) or die("prbl options\n");
socket_connect($sock, '127.0.0.1', 4950) or die("could not connect\n");
socket_write($sock, $msg, strlen($msg));
客户端连接到 websocket 成功,但是当我 运行 PHP 文件时,我什么也没得到(控制台中没有错误和消息)。
换句话说,javascript 不会将我的 socket_write 视为消息 :/
有什么想法吗? :)
感谢@ADyson,我找到了解决方案;) 我现在正在使用 SSE 服务器发送的事件并且它有效!但我想知道我的代码是 'proper' 还是有更多 'adequate' 方式。
我正在使用会话超全局将服务器信息更改传递到另一个文件,该文件不断将其作为事件流读取(这就是 SSE 的工作方式)。
index.php :
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<script type="text/javascript" src="jquery.js">
</script>
<script type="text/javascript" src="stream.js">
</script>
</head>
<body>
<a>Receive message</a>
</body>
</html>
stream.js(监听服务器):
var serv = new EventSource("server.php");
serv.onmessage = function(e) {
var jdata = JSON.parse(e.data);
console.log(jdata.message);
};
serv.onopen = function(e) {
console.log('Connection opened');
}
$(document).ready(function(){
$('a').click(function(){
receive_msg();
});
});
function receive_msg(){
$.ajax({
type: "POST",
url: 'controller.php',
data: {action: 'send'}
});
}
controller.php :
<?php
session_start();
if (isset($_POST['action'])) {
$_SESSION['server']="you have received a message";
}
server.php :
<?php
session_start();
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
if (isset($_SESSION['server'])) {
$data = array(
'message'=> $_SESSION['server']
);
$data = json_encode($data);
echo "data: {$data}\n\n";
unset($_SESSION['server']);
}
它的工作方式:
客户端连接到 server.php 并不断读取文件。当服务器要向客户端发送消息时,它会创建一个会话变量。 Server.php 读取变量并将其传递到我的 js 文件。然后变量被销毁,所以我们只传递一次消息。