Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于http的php ZMQ推送集成_Javascript_Php_Websocket_Zeromq_Pushstate - Fatal编程技术网

Javascript 基于http的php ZMQ推送集成

Javascript 基于http的php ZMQ推送集成,javascript,php,websocket,zeromq,pushstate,Javascript,Php,Websocket,Zeromq,Pushstate,我正在尝试使用php和本机zmq实现推送集成。我已成功地将消息发送到服务器,但我的问题是无法使用js Websocket()将消息推送到浏览器。我说WebSocket连接到“ws://127.0.0.1:8080/”失败:WebSocket握手时出错:状态行无效 以下是我的客户代码: <?php try { function send($data) { $context = new ZMQContext(); $push = new ZMQSocket($c

我正在尝试使用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();
 }

?>
这是我的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>

消息
var logger=document.getElementById(“messagelog”); var conn=newwebsocket(“ws://127.0.0.1:8080”)#错误指向这里。 conn.onOpen=功能(e){ 控制台日志(“建立连接”); } conn.onMessage=函数(数据){ console.log(“接收:”,数据); } conn.onError=功能(e){ 日志(“连接错误:”,e); } conn.onClose=函数(e){ log(“连接关闭~”); }


请告诉我我错过了什么。谢谢。

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


*您可以使用原始套接字类型来完成这项工作,但这有点高级,除非您知道自己在做什么,否则不应该输入。

您根本没有建立协议通信。您成功地接收到了消息,但从未通过解析消息并发送适当的响应来确认您的服务器确实是WebSocket服务器

由于您已经在使用PHP和ZeroMQ,最简单的方法是使用它,除其他外,它能够理解WebSocket协议,并将其交付给编码为tnetstring的ZeroMQ端点(类似json的编码格式,不需要解析)

另一个解决方案是在代码中完全支持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>