在Yii2中从一个页面连接套接字io

时间:2016-03-17 11:37:50

标签: socket.io namespaces yii2

我正在使用带有socket io和nodejs的Yii高级项目。 我的server.js位于yii2advanced / nodejs。

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');
var connectedUsers = {};

server.listen(8890);

io.of('frontend/views/project/index').on('connection', function (socket) {

    socket.on('usersocket', function(data) {
        connectedUsers[data] = socket;
        console.log("new client with Id: " + data + " added to CLIENTS list");
    });
});

我的client.js位于yii2advanced / frontend / web / js。

$( document ).ready(function() { 
    var socket = io.connect('http://localhost:8890/frontend/views/project/index');

    socket.on('connect', function () {
        socket.emit('usersocket', user_id);
});

我需要允许socket只从frontend / views / project / index.php页面连接。 现在socket甚至连接frontend / web / index.php 我在套接字文档('限制自己到命名空间')中跟随了一个示例,但我不确定是否正确指定了命名空间。

1 个答案:

答案 0 :(得分:1)

我已解决了以下问题。

我为project_layout创建了新的布局project/index action(在action编写$this->layout = 'project_layout';之前的所有代码之前。 我创建了新的AssetBundle(ProjectAsset)。在这个Asset里面我写道:

public $js = ['js/client.js'];

在新layout内,我注册了新的ProjectAsset

use frontend\assets\ProjectAsset;
ProjectAsset::register($this);

所以一个想法是只在你需要的页面上使用client.js。在此更改之前,我对所有main layout只有一个actions。因此,在每个页面上,我都附加了AppAsset client.js。现在它仅附加在project/index页面上。