0

我正在使用服务器端的 node.js + express.js 编写一个基于实时聊天室的应用程序,backbone.js 用于客户端,socket.io 用于处理通信。

我在这里面临几个问题:

1)跨域请求问题:

var ChatRoom = Backbone.Model.extend( {
    defaults : {
        socket : "",
        scoreBoard : {},
        qMaster : "",
        questionSrc : "",
    },

    initialize : function( scoreServer ) {                      
        this.socket = io.connect( scoreServer );
        var newScores = {};

        this.socket.on('connect', function() {
            console.log( "Connected!" );
        });

        this.socket.on('updateScores', function( scoreUpdates ) { 
        _.each( scoreUpdates, function( update ) {
            newScores[ update['name'] ] = update['score'];
        });
    });
});
var chatRoom = new ChatRoom( "http://localhost:8080/" );

当我创建这样的对象时,在调用io.connect. Chrome 上的输出:

XMLHttpRequest cannot load http://[object%20object]:8080/socket.io/1/?t=1339342280788. Cross origin requests are only supported for HTTP.

究竟是什么将 socket.io 调用中的主机更改为[object%20object]

http://localhost:8080是创建页面的服务器。但是,当我将套接字作为 ChatRoom 的成员删除时,并按如下方式执行处理程序绑定:

var ChatRoom = Backbone.Model.extend( {
    defaults : {
        scoreBoard : {},
        qMaster : "",
        questionSrc : "",
    },

    initialize : function( ) {                      
        var newScores = {};

        socket.on('connect', function() {
            console.log( "Connected!" );
        });

        socket.on('updateScores', function( scoreUpdates ) { 
        _.each( scoreUpdates, function( update ) {
            newScores[ update['name'] ] = update['score'];
        });
    });
});

var socket = io.connect( "http://localhost:8080" );
var chatRoom = new ChatRoom();

在这种情况下,事情顺利进行。这怎么可能?

2)客户端成功连接到我的socket.io服务器后,我有以下套接字广播命令:

io.sockets.on( 'connection', function( socket ) {
    console.log("Got here");
    socket.broadcast.emit( 'updateScores', scoreUpdate );

(注意:'scoreUpdate' 在别处初始化)。套接字服务器上的调试消息表明广播已执行,但未显示在客户端上为“updateScores”事件处理程序插入“警报”命令。事实上,甚至没有任何东西写入套接字。但是,只有当第二个客户端连接到同一服务器时,才会调用相应的事件处理程序。

广播命令中是否缺少一些微妙之处?当只有一个客户端时没有广播吗?

4

2 回答 2

0

好的,我已经解决了问题(1)。

本质上,模型实例化应该是:

var chatRoom = new ChatRoom( {"server" : "http://localhost:8080"} );

哦!

问题 2 仍然存在。

于 2012-06-10T18:15:42.243 回答
0

2) 来自官方网站的报价:

广播消息。

要广播,只需在方法调用中添加一个 标志broadcast广播意味着向除了启动它的套接字之外的其他所有人发送消息 。emitsend

于 2012-06-11T06:36:24.877 回答