需要聊天:针对每个用户和特定用户

问题描述

我需要为工作建立聊天功能。 决定使用棘轮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 (将#修改为@)