php ZMQ 通过 http 推送集成

php ZMQ push integration over http

我正在尝试使用 php 和本机 zmq 实现推送集成。我已成功将消息发送到服务器,但我的问题是我无法使用 js Websocket() 将消息推送到浏览器。我说 WebSocket 连接到 'ws://127.0.0.1:8080/' 失败:WebSocket 握手期间出错:无效状态行

这是我的客户端代码:

<?php
 try {
   function send($data) {
      $context = new ZMQContext();
      $push = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
      $push->connect("tcp://localhost:5555");

      $push->send($data);
    }    

    if(isset($_POST["username"])) {
      $envelope = array(
        "from" => "client",
        "to" => "owner",
        "msg" => $_POST["username"]
      );
      send(json_encode($envelope)); # send the data to server
    }
 }
 catch( Exception $e ) {
   echo $e->getMessage();
 }

?>

客户

这是我的服务器:

$context = new ZMQContext();

$pull = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$pull->bind("tcp://*:5555"); #this will be my pull socket from client

$push = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$push->bind("tcp://127.0.0.1:8080"); # this will be the push socket to owner

while(true) {
    $data = $pull->recv(); # when I receive the data decode it
    $parse_data = json_decode($parse_data);

    if($parse_data["to"] == "owner") {
        $push->send($parse_data["msg"]); # forward the data to the owner
    }
    printf("Recieve: %s.\n", $data);
}

这是我的 owner.php 我希望数据通过浏览器中的 Websocket 发送:

<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h2>Message</h2>
    <ul id="messagelog">
    </ul>
    <script>
        var logger = document.getElementById("messagelog");
        var conn = new WebSocket("ws://127.0.0.1:8080"); # the error is pointing here.

        conn.onOpen = function(e) {
            console.log("connection established");
        }
        conn.onMessage = function(data) {
            console.log("recieved: ", data);
        }

        conn.onError = function(e) {
            console.log("connection error:", e);
        }
        conn.onClose = function(e) {
            console.log("connection closed~");
        }
    </script>
</body>

请告诉我我缺少什么。谢谢。

您不能将 websocket 连接到 zmq 套接字*,它们是不同的通信协议(websocket 更像是传统套接字,zmq 套接字更像是一种添加额外功能的抽象)。您需要在您的服务器上设置一种方式来接收 websocket 连接。

*您 可能 能够使用 RAW 套接字类型来完成这项工作,但是这有点高级,除非您知道自己在做什么,否则不应进入.

你根本没有建立协议通信。您设法收到了该消息,但您从未通过解析它并发送适当的响应来确认您的服务器确实是一个 WebSocket 服务器。

由于您已经在使用 PHP 和 ZeroMQ,最简单的方法是使用 Mongrel2,除其他外,它能够理解 WebSocket 协议并将其传送到编码的 ZeroMQ 端点作为 tnetstring(一种类似于 json 的编码格式,解析起来很简单)。

另一种解决方案是在您的代码中完全支持 WebSocket 协议 - 这超出了本问答的范围。