为了账号安全,请及时绑定邮箱和手机立即绑定

Websockets:从php服务器向客户端发送消息

Websockets:从php服务器向客户端发送消息

PHP
狐的传说 2023-04-02 14:59:11
我正在尝试将消息从我的文件 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');}索引.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 视为一条消息:/有任何想法吗?:)
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

我现在正在使用 SSE 服务器发送的事件并且它可以工作!但是我想知道我的代码是否“正确”或者是否有更“合适”的方法。


我正在使用会话 superglobals 将服务器信息更改传递给另一个文件,该文件不断将其作为事件流读取(这就是 SSE 的工作方式)。


索引.php:


      <!DOCTYPE html>

      <html 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'}

   });

  }

控制器.php:


    <?php

session_start();

if (isset($_POST['action'])) {

  $_SESSION['server']="you have received a message";

}

服务器.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 文件。然后变量被销毁,所以我们只传递一次消息。


查看完整回答
反对 回复 2023-04-02
  • 1 回答
  • 0 关注
  • 231 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信