gpt4 book ai didi

websocket - 在打开连接时将用户 ID 从浏览器发送到 websocket 服务器

转载 作者:行者123 更新时间:2023-12-03 22:20:45 24 4
gpt4 key购买 nike

Before asking this question, I did my best by reading severel questions on SO (tagged Ratchet and dealing with similar issues but to no avail. I even asked a question which received no attention and I therefore deleted it to write another one (that hopefully is more clear).



我的最终目标是使用 Ratchet 构建一个一对一的私有(private)聊天应用程序。一切正常,除了我无法向特定用户发送消息。

每个登录的用户在访问网站的安全区域时都会连接到 websocket 服务器:
$(document).ready(function() { 

var conn = new WebSocket('ws://localhost:8080');
conn.onopen = function(e) {
console.log("Connection established!");

// Here I need to send the logged in user_id to websocket server
// and get it in onOpen method so that I can index my array
// of connections with user_id instead of
//$connection->ResourceId, I explain more below

};

conn.onmessage = function(e) {
console.log(e.data);
};

});

当用户在聊天框中写入消息时,消息通过 AJAX 发送到 Web 服务器,然后使用 ZeroMQ 推送到 Websocket。在 Controller 中:
// Persistence of Message(message_id, sender_id, receiver_id, message_text)
.....

$context = new \ZMQContext();
$socket = $context->getSocket(\ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");

$pushData = array(
'receiver_id' => $receiver_id,
'sender_id' => $user->getId(),
'message' => $message->getMessageText(),
);
$socket->send(json_encode($pushData));

所以最后,我的 websocket 服务器能够知道哪个是使用 JSON 的接收器的 id。但是他怎么知道那个用户的连接是什么?换句话说,我需要将 websocket 连接存储在一个由用户 ID 索引的数组中。
<?php
namespace RealTime;

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Wamp\WampServerInterface;

class Pusher implements WampServerInterface, MessageComponentInterface{

private $clients;

public function onOpen(ConnectionInterface $conn) {

$this->clients[$conn->resourceId] = $conn;
// I need here to get the user_id received from browser while opening connection
}

public function onMessageEntry($entry) {
$entryData = json_decode($entry, true);

//This is not what I need (It sends to all users in array)
foreach ($this->clients as $key => $client) {

$client->send($entryData['message']);
}
}
public function onMessage(ConnectionInterface $from, $msg) {
echo $msg;
}
}

和 websocket 服务器:
  <?php
require dirname(__DIR__) . '/vendor/autoload.php';
use RealTime\Pusher;

$loop = React\EventLoop\Factory::create();
$pusher = new Pusher;

$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5555');
$pull->on('message', array($pusher, 'onMessageEntry'));


$webSock = new React\Socket\Server($loop);
$webSock->listen(8080, '0.0.0.0');
$webServer = new Ratchet\Server\IoServer(
new Ratchet\Http\HttpServer(
new Ratchet\WebSocket\WsServer(
new Ratchet\Wamp\WampServer(
$pusher
)
)
),
$webSock
);
$loop->run();

?>

问题:
  • 如何发送登录user_id从客户端打开连接时。我需要在 websocket 服务器中有值,以便我可以用它索引我的客户端数组( $client[user_id]=$conn 而不是 $client[recourceId]=$conn )。我试过javascript函数send但我不知道从哪里接收发送的数据(甚至 onMessage 没有打印任何内容)。
  • 为什么 onMessage方法甚至没有执行 MessageComponentInterface已实现(是因为我有 onMessageEntry 方法 + $pull->on('message', array($pusher, 'onMessageEntry')); 代码行吗?

  • 谢谢你。

    最佳答案

    作为在 clientConnection 之间建立关联的另一种方法和他的ID您需要在打开与您的 websocket 服务器的连接后使用 websockets 发送一条消息,此消息将包含您的用户 ID,您将使用它通过他的 ID 来索引他的连接对象在你的阵列中。

    对于第二个问题,我知道默认的 websocket 实现不能正常工作,特别是 pubsub协议(protocol)你需要使用一个 websocket 库,我建议使用 AutobahnJS 这是一个很好的 websocket 库,有很多很棒的功能。

    关于websocket - 在打开连接时将用户 ID 从浏览器发送到 websocket 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29576033/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com