我刚刚为Ratchet WAMP +高速公路版本1做了一个聊天问候世界 full source code here if you want to see
JavaScript客户端发送聊天消息:
function click_send_btn() { var json_data = { "message": $.trim($("#input_message").val()) }; sess.publish("send_message", json_data, true); }
PHP Ratchet服务器发布消息:
public function onPublish(\Ratchet\ConnectionInterface $conn, $topic, $event, array $exclude, array $eligible) { switch ($topic) { case 'http://localhost/enter_room': $foundChater = $this->allChater[$conn]; $newChaterName = $event['username']; $foundChater->setChatName($newChaterName); break; case 'send_message': $foundChater = $this->allChater[$conn]; $event['username']=$foundChater->getChatName(); break; } $topic->broadcast($event); echo "onPublish {$conn->resourceId}\n"; }
我不明白为什么发布时却不能正常工作 在上面的2个firefox中,右边的firefox说:我是吧。消息不应该显示在他自己身上,但确实如此。
doc ref: autobahn version 1 javascript publish with excludeme
答案 0 :(得分:1)
我刚修好了。
我真是个傻瓜。我没有处理参数“array $ exclude”
我还使用$ topic->广播($ event)强制广播给所有人
现在我创建一个函数
/** * check whitelist and blacklist * * @param array of sessionId $exclude -- blacklist * @param array of sessionId $eligible -- whitelist * @return array of \Ratchet\ConnectionInterface */
private function getPublishFinalList(array $exclude, array $eligible) {
//array of sessionId
$allSessionId = array();
$this->allChater->rewind();
while ($this->allChater->valid()) {
array_push($allSessionId, $this->allChater->current()->WAMP->sessionId);
$this->allChater->next();
}
//if whitelist exist, use whitelist to filter
if (count($eligible) > 0) {
$allSessionId = array_intersect($allSessionId, $eligible);
}
//then if blacklist exist, use blacklist to filter
if (count($exclude) > 0) {
$allSessionId = array_diff($allSessionId, $exclude);
}
//return array of connection
$result = array();
$this->allChater->rewind();
while ($this->allChater->valid()) {
$currentConn = $this->allChater->current();
if (in_array($currentConn->WAMP->sessionId, $allSessionId)) {
array_push($result, $currentConn);
}
$this->allChater->next();
}
return $result;
}
在onPublish中,我不再使用$ topic->广播($ event)了。
$conn2PublishArray = $this->getPublishFinalList($exclude, $eligible); foreach ($conn2PublishArray as $conn2Publish) { $conn2Publish->event($topic, $new_event); }
连接类有一个方法'偶数',可以直接向'订阅者'发送消息 Ratchet.Wamp.WampConnection event method