【发布时间】:2016-08-11 16:40:12
【问题描述】:
还有一个问题。 我开始习惯 websocket 的工作方式。 我什至设法实现了跨域通信。 但现在我还没有达到另一个里程碑。
这是我当前实现的一个 sn-p
public function onMessage(ConnectionInterface $conn, $msg)
{
$msgjson = json_decode($msg);
$tag = $msgjson->tag;
global $users;
if($tag == "[msgsend]")
{
foreach($this->clients as $client)
{
$client->send($msg);
}
}
else if($tag == "[bye]")
{
foreach($this->clients as $client)
{
$client->send($msg);
}
foreach($users as $key => $user)
{
if($user->name == $msgjson->uname)
{
unset($users[$key]);
}
}
$this->clients->detach($conn);
}
else if($tag == "[connected]")
{
//store client information
$temp = new Users();
$temp->name = $msgjson->uname;
$temp->connection = $conn;
$temp->timestamp = new \DateTime();
$users[] = $temp;
usort($users, array($this, "cmp"));
//send out messages
foreach($this->clients as $client)
{
$client->send($msg);
}
}
else if($tag == "[imalive]")
{
//update user timestamp who sent [imalive]
global $users;
foreach($users as $user)
{
if($msgjson->uname == $user->name)
{
$user->timestamp = new \DateTime();
}
}
}
}
现在我的问题是。正如我们所看到的,在 onMessage() 函数和我做过的教程中,我知道如何读取和解析 JSON 数据,理解消息,知道消息来自谁($conn)......
但是,当我在 JSON 数据包中发送消息时,我想包括消息来自谁的昵称以及消息将要发送给谁。 这将允许我在我正在构建的社交网络和聊天室中实现私人即时消息传递。
我只想向特定的客户端发送消息,而不是使用 for 循环向所有连接的客户端发送消息。我知道客户有一个属性($this->$client->resourceID 或类似的东西),但也不知道如何将它合并为解决方案。我还希望用户在跳转到网站上的不同页面时保持连接,即使在刷新后,仍然能够继续发送消息。我假设每次刷新都会断开客户端的连接。所以我必须有一种方法,让服务器每次都能知道谁是谁,消息来自哪里以及它们要去哪里。
但是,是的,私人消息。我不想向所有人或非预期目标发送不必要的信息。我怎样才能做到这一点? 我希望我的问题是有道理的。谢谢。
【问题讨论】:
-
如果某个答案解决了您的问题,请考虑接受该答案。以下是meta.stackexchange.com/questions/5234/… 然后返回此处并对勾号/复选标记执行相同操作直到它变为绿色的方法。这通知社区,找到了解决方案。否则,其他人可能会认为问题仍然悬而未决,可能想要发布(更多)答案。您将获得积分,并鼓励其他人帮助您。 欢迎来到 Stack!
-
如果您认为这是不友好的,那么我建议您不了解社区以及投票的含义。否决票(将鼠标悬停在向下箭头上)意味着选民认为该问题没有得到很好的研究或没有表现出任何努力。当你出轨时,你会吸引额外的眼球,突然你的积分水平像摩天大楼上的石头一样下降。这不是个人的,这些选票尤其不应该是。我在上面发布的内容是“如果”,而不是“你必须”。这只是一个建议。如果您没有获得帮助,请询问如何获得帮助。不要咒骂、尖叫和踢你的脚
-
我的 cmets 被删除的方式很有趣(因为你知道我是对的)但你的回复不是。不。我不了解社区或我的问题如何“没有用”或“没有显示任何研究工作”(当我将鼠标悬停在向下箭头上时,这就是它所说的)。研究了另一个线程中的问题。在我什至在这里询问它之前,我花了几天的时间。最终,在前几天的粗鲁之后,我自己弄清楚了,这是一个比这里任何其他人建议的更容易的解决方案。但是我不会发布解决方案,因为您不应该得到这些信息。
-
你的cmets不是我删除的,我没有那种权力。 mod是唯一可以删除cmets的。如果您的 cmets 不具有建设性、粗鲁或冒犯性,它们最终将被删除。如果您不想发布一个很好的解决方案,那么它不会从任何人的鼻子上掉下来。
标签: javascript php jquery websocket ratchet