2015-08-16 3 views
7

Ich versuche, Push-Integration mit PHP und native zmq zu implementieren. Ich habe erfolgreich gesendet meine Nachricht an den Server senden, aber mein Problem ist, ich kann nicht die Nachricht an den Browser mit js Websocket() schieben. Ich sagt WebSocket-Verbindung zu 'ws: //127.0.0.1: 8080 /' ist fehlgeschlagen: Fehler bei der WebSocket-Handshake: Ungültige Statuszeilephp ZMQ Push-Integration über http

hier ist mein Code für Client:

<?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(); 
} 

?> 

Kunde

hier ist mein Server:

$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); 
} 

und hier ist mein owner.php ich erwarte die Daten durch Websocket in Browser senden werden:

<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> 

Bitte Sag mir, was ich vermisse. Danke.

Antwort

1

Sie können keinen Websocket mit einem zmq-Socket * verbinden, sie sind verschiedene Kommunikationsprotokolle (ein Websocket ist mehr wie ein traditioneller Socket, ein zmq-Socket ist eher eine Abstraktion, die zusätzliche Funktionen hinzufügt). Sie müssen einen Weg auf Ihrem Server einrichten, um eine Websocket-Verbindung zu erhalten.

* Sie können in der Lage, dies mit RAW-Socket-Typen arbeiten, aber das ist ein bisschen fortgeschrittener und sollte nicht eingegeben werden, wenn Sie wissen, was Sie tun.

2

Sie haben überhaupt keine Protokollkommunikation eingerichtet. Sie haben zwar die Nachricht erhalten, aber Sie haben nicht bestätigt, dass Ihr Server tatsächlich ein WebSocket-Server ist, indem Sie ihn analysieren und entsprechende Antworten senden.

Da Sie bereits PHP und ZeroMQ verwenden, ist der einfachste Weg, Mongrel2 zu verwenden, der unter anderem das WebSocket-Protokoll verstehen und an einen ZeroMQ-Endpunkt senden kann, der als tnets-Encoding kodiert ist Format, trivial zu analysieren).

Die andere Lösung ist die vollständige Unterstützung des WebSocket-Protokolls in Ihrem Code - etwas, das außerhalb des Umfangs dieser Frage und Antwort liegt.