PHP的ZMQ推送整合通过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协议并将其交付到编码为tnetstring的ZeroMQ端点(类似于json的编码格式,不重要的解析)。
另一种解决方案是在您的代码中完全支持WebSocket协议 - 这超出了这个问题和答案的范围。
链接地址: http://www.djcxy.com/p/28417.html