问题描述
我需要为工作建立聊天功能。 决定使用棘轮PHP,这是我们需要的:
- 常规聊天室:在这里,已连接的用户向所有已连接的用户发送消息
- 车间聊天室::在此,连接的用户可以向所有与发送方具有相同WorkshopId的连接用户发送消息。
我从普通聊天室开始。 运行正常:如果我发送一条消息,则表明其他已连接的用户正在接收该消息
这是我的代码(仅相关部分):
-chat.html
<script>
function connect() {
var conn = new WebSocket('ws://localhost:8080?token={{ user.user_id }}');
// OPEN THE CONNECTION
conn.onopen = function (e) {
console.log("Connection established!");
};
// SEND A MESSAGE
$(".send_message").click(function() {
var userId = '{{ user.user_id }}';
var userName = '{{ user.name }}'+' '+'{{ user.insertion ? user.insertion : '' }}'+' '+'{{ user.surname }}';
var msg = $(".message_input").val();
var data = {
userId: userId,userName: userName,msg: msg
};
conn.send(JSON.stringify(data));
var messageBlock = '' +
'<li class="message right">' +
'<div class="text_wrapper">' +
'<div class="sending_informations">' + data.userName +'</div>' +
'<div class="text">' + data.msg + '</div>' +
'</div>' +
'</li>';
// append in .messages >
$('ul.messages').append( messageBlock );
// SET THE INPUT EMPTY after sending
$(".message_input").val("");
});
// WHEN A MESSAGE ARRIVE
conn.onmessage = function(e) {
var data = JSON.parse(e.data);
var messageBlock = '' +
'<li class="message left">' +
'<div class="text_wrapper">' +
'<div class="sending_informations">' + data.userName +'</div>' +
'<div class="text">' + data.msg + '</div>' +
'</div>' +
'</li>';
// append in .messages >
$('ul.messages').append( messageBlock );
};
conn.onclose = function(e) {
console.log('Socket is closed. Reconnect will be attempted in 3 second.',e.reason);
setTimeout(function() {
connect();
},1000);
};
conn.onerror = function(err){
console.log('Error' + err);
conn.close();
};
}
connect();
</script>
-chat.php
/**
* Class Chat
* @package Ddis\controller
*/
class Chat implements MessageComponentInterface
{
/**
* @var SplObjectStorageAlias
*/
protected $clients;
/** @var array */
private $channel;
/** @var array */
private $users;
/** @var Connection */
private $database;
/**
* Chat constructor.
* @param Connection $database
*/
public function __construct(Connection $database)
{
$this->clients = new SplObjectStorageAlias;
$this->channel = [];
$this->users = [];
$this->database = $database;
}
/**
* @param ConnectionInterface $conn
*/
public function onOpen(ConnectionInterface $conn)
{
// Store the new connection to send messages to later
$this->clients->attach($conn);
$querystring = $conn->httpRequest->getUri()->getQuery();
parse_str($querystring,$queryarray);
$this->users[isset($queryarray['token']) && $queryarray['token'] != '' ? $queryarray['token'] : $conn->resourceId] = $conn;
echo "New connection! ({$conn->resourceId})\n";
}
/**
* @param ConnectionInterface $from
* @param $msg
*/
public function onMessage(ConnectionInterface $from,$msg)
{
$numRecv = count($this->clients) - 1;
echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n",$from->resourceId,$msg,$numRecv,$numRecv == 1 ? '' : 's');
$data = json_decode($msg,true);
foreach ($this->clients as $client) {
if ($from !== $client) {
// The sender is not the receiver,send to each client connected
$client->send($msg);
}
}
}
/**
* @param ConnectionInterface $conn
*/
public function onClose(ConnectionInterface $conn)
{
// The connection is closed,remove from connection list
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected\n";
}
/**
* @param ConnectionInterface $conn
* @param \Exception $e
*/
public function onError(ConnectionInterface $conn,\Exception $e)
{
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
现在,我必须开始该项目的第二部分:
车间聊天室
这里是一些上下文:在我的数据库中,每个用户都作为一个字段“ workshopId”。 这个想法是:如果用户X(workshopID = 1)正在发送一条消息,那么在另一个视图中,所有工作坊ID = 1的用户都将收到该消息。
因此,我想拥有> 2个视图:
- chat.html>对于主要的Chat,您已经在上面看到了代码
- workshopChat.html>用于讲习班的聊天室,代码中只有一个区别:
var conn = new WebSocket('ws:// localhost:8080?token = {{user.user_id}}&channel = {{user.workshop_id}}');
因此对于Chat.php,我现在需要能够检查我是否具有频道参数:
public function onOpen(ConnectionInterface $conn)
{
// Store the new connection to send messages to later
$this->clients->attach($conn);
$querystring = $conn->httpRequest->getUri()->getQuery();
parse_str($querystring,$queryarray);
print_r($queryarray);
die("CHANNEL PARAM ?");
$this->users[isset($queryarray['token']) && $queryarray['token'] != '' ? $queryarray['token'] : $conn->resourceId] = $conn;
echo "New connection! ({$conn->resourceId})\n";
}
我可以在我的print_r()中看到该参数。
我现在的问题是如何处理:因此,如果存在此参数,如何仅发送给特定用户?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)