【问题标题】:How to send and get data from the server using Ratchet如何使用 Ratchet 从服务器发送和获取数据
【发布时间】:2016-07-09 11:41:15
【问题描述】:

这是我第一次使用套接字并从 Ratchet 开始,但我真的无法适应它。仍然尝试将教程中的某些部分连接在一起,但面临一些问题。另外我想知道如何使用 autobahn.js 。教程不清楚。

我的问题

1) 如何向除当前用户以外的所有用户发送消息“ ...加入”并且“...”必须是用户的 ip。

我尝试了以下方法,但在终端上出现错误。

public function onOpen(ConnectionInterface $conn) {
           // Store the new connection to send messages to later
           $this->clients->attach($conn);
           $this->send('new');
           echo "New connection! ({$conn->remoteAddress})\n";    
}

调用未定义的方法 MyApp\Chat::send()

2) 怎么做才能在发送消息时让所有各方都能看到它,包括发送消息的人(这就是每个聊天的工作方式)?

JS

var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function(e) {
    //console.log("Connection established!");
    $("#chat_window #messages_list").append("<li class='join_disconnect'>127.0.0.1 Online</li>");
}
conn.onmessage = function(e) {
    //console.log(e.data);
    $("#chat_window #messages_list").append("<li class='thread'>"+e.data+"</li>");
}
conn.onclose = function(e) {
    //console.log("Connection Disconnected!");
    $("#chat_window #messages_list").append("<li class='join_disconnect'>127.0.0.1 Offline</li>");
};



$(document).ready(function(){

        disable_button();


        //EMERGENCY EXIT
        $('#exit').click(function(){
                window.location.replace('http://www.google.com');
        });


        //PREVENT BLANK INPUT
        $('#msg').on('keyup', function(e){

                if($(this).val().length>0){
                    enable_button();
                }
                else{
                    disable_button();
                }

        });

        //SEND MESSAGE
        $('#snd').click(function(){
            var thread = $('#msg').val();
            //console.log(thread);
            //conn.send(thread);
            $.ajax({
                type:'POST',
                url: './bin/send-message.php',
                data: {msg: thread},
                success: function(response){
                    //alert(response);
                    if(response!=1){
                        $('#msg').val('');
                        disable_button();
                    }
                }
            });
        });

        //ENABLE BUTTON
        function enable_button() {
            var element = document.getElementById('snd');
            $(element).addClass('active');
            element.style.pointerEvents = '';
        }

        //DISABLE BUTTON
        function disable_button() {
            var element = document.getElementById('snd');
            $(element).removeClass('active');
            element.style.pointerEvents = 'none';
        }


});

我知道这些问题很多,但我真的很想知道怎么做。如果有任何一步一步容易学习的教程,也欢迎。

【问题讨论】:

  • 你的第二个问题不清楚。请出示您的html,并告诉您您想做什么以及得到了什么。
  • 并告诉我们,如何您想使用 autobahn.js?干什么用的?
  • 根据文档,它说要在客户端使用 autobahn.js,但我不知道如何使用它。对于第二个问题,我问的是当客户发送消息时,他自己可以看到他在聊天区域发送的内容。那么该怎么做呢。
  • 用你的第二个问题更新了我的答案。关于autobahn.js,是的,它应该在客户端运行。但是你想使用它的原因是什么?你的目标是什么?
  • 我对这个库和如此多的依赖项完全感到困惑,真的不知道我在做什么。

标签: php websocket autobahn ratchet


【解决方案1】:

如果您尝试将示例从tutorial 更改为Rachet site,那么您的第一个问题解决方案是:

public function onOpen(ConnectionInterface $conn) {
    // first, you are sending to all existing users message of 'new'
    foreach ($this->clients as $client) {
        $client->send('new');
    }
    // than,
    // Store the new connection to send messages to later
    $this->clients->attach($conn);

    echo "New connection! ({$conn->resourceId})\n";
}

关于你的第二个问题,如果我猜对了,你应该向所有连接的客户端发送新消息,如下所示:

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');

    foreach ($this->clients as $client) {
        // remove this check
        // if ($from !== $client) { 
            // The sender is not the receiver, send to each client connected
            // $client->send($msg);
        // }

        // just send to all
        $client->send($msg);
    }
}

更新:完整的解决方案。

Chat.php中,需要修改一些方法:

public function onOpen(ConnectionInterface $conn) {
    // first, you are sending to all existing users message of 'new'
    foreach ($this->clients as $client) {
        $client->send('<status>' . $conn->remoteAddress . ' Online</status>'); //here we are sending a status-message
    }
    // than,
    // Store the new connection to send messages to later
    $this->clients->attach($conn);

        echo "New connection! ({$conn->remoteAddress})\n";
}

public function onClose(ConnectionInterface $conn) {
    // The connection is closed, remove it, as we can no longer send it messages
    $this->clients->detach($conn);

    //send to others clients message about disconnected user
    foreach ($this->clients as $client) {
        $client->send('<status>' . $conn->remoteAddress . ' Offline</status>'); //here we are sending a status-message too
    }

    echo "Connection {$conn->remoteAddress} has disconnected\n";
}

在您的js 代码中,修改下一个方法:

conn.onmessage = function(e) {
    //console.log(e.data);
    var match = e.data.match(/^<status>(.*?)<\/status>$/i);
    if (match) {
        if (/\d+\.\d+\.\d+\.\d+ online/i.test(match[1])) {
            messages.append('<li class="join_connect">' + match[1] + "</li>");
        } else if (/\d+\.\d+\.\d+\.\d+ offline/i.test(match[1])) {
            messages.append('<li class="join_disconnect">' + match[1] + "</li>");
        }
    } else {
        messages.append('<li class="thread">' + e.data + "</li>");
    }
};

【讨论】:

  • 是的,我在两分钟前看到你之前的回答就知道了。但问题是当新用户加入时,发送的加入消息是在 onmessage 下发送的。是否有可能在onopen下获得它?这样当加入发生在不同的类列表下时?我希望我说清楚了吗?
  • 你可以看到 onOpen 下的 Js 我有类似 127.0.0.1 的在线信息,我想在那里获取加入消息,以便每次用户加入或离开时,他们都会在该特定项下收到消息CSS 类。
  • 我把php部分onOpen下的一行改成了$client->send({$conn->remoteAddress}.' online');但为什么它不起作用?
  • @Ayan,因为您应该将其更改为 $client-&gt;send($conn-&gt;remoteAddress . ' online');。也就是说,没有括号。
  • 好的,它开始工作了。 Pheww.. 但是加入客户端的 css 部分呢?
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
相关资源
最近更新 更多