Nodejs - 简单的 socket.io 示例不会将数据推送到所有浏览器

Posted

技术标签:

【中文标题】Nodejs - 简单的 socket.io 示例不会将数据推送到所有浏览器【英文标题】:Nodejs - Simple socket.io example doesn't push data to all browers 【发布时间】:2013-09-05 02:06:30 【问题描述】:

一定是我的一些错误我无法弄清楚:

[客户]

$(document).ready(function() 
    var socket = io.connect("http://localhost:8080");
    socket.on("message", function(data) 
        $("#theInput").val(data.data);
    );

    $(document).keyup(function() 
        socket.emit("message", data: $("#theInput").val());
    );
);

[服务器]

var express = require("express"),
    app = express(),
    server = require("http").createServer(app);
    io = require("socket.io").listen(server),
    site = require("./site");

server.listen(8080);

app.set("view engine", "jade");
app.set("views", __dirname + "/views");

app.use(express.logger("dev"));
app.use(express.bodyParser());
app.use(express.methodOverride());

//Handling sockets
txt = "";
io.sockets.on("connection", function(socket) 
    socket.on("message", function(data) 
        txt = data.data;
        socket.emit("message", data: txt);
    );
);

我试图做的是在$.keyup() 事件上向服务器发送新数据,然后服务器应将新输入值重新分配给全局变量txt,并将该信息推送回客户端。客户端在接收到从服务器推送的任何新数据时,应更改#theInput 的值。这有点像打开 2 个浏览器,然后输入 1,它应该也会出现在另一个浏览器上。如果我只打开 1 个浏览器,它工作得很好,这意味着它接收数据并重新分配给 #theInput,但是当我打开 2 个不同的选项卡/浏览器以测试其同步时,每当 keyup 事件触发时,它都会替换全局 txt 在服务器中,我在这些浏览器中没有看到任何同步或实时。

我是新手,如果有任何解决问题的帮助或提示,我将不胜感激。

其他问题:在 index.jade 中(想象一下我有一个),就像在这个结构中:

root
|____ views
|    |_____ index.jade
|
|____ libs
|    |_____ jQuery.js
|
|server.js

从玉,我尝试:

script(src="./libs/jQuery.js")

但结果为 404,未找到。我突然想起我需要路由每个请求,所以也许我应该对外部库做同样的事情,所以我去:

[server.js]

site = require("./site");
app.get("/jQuery", site.jQuery);

并定义路线:

[site.js]

exports.jQuery = function(req, res) 
    res.sendfile("./libs/js/jQuery.js");
;

然后找到文件,但出现错误:

GET http://localhost:8080/jquery-1.10.2.min.map 404 (Not Found) 

jQuery.min.map 到底是什么?我从来没有遇到过这样的事情。我在网上搜索了所有 express 示例,但不幸的是,它们都使用快捷方式http://code.jquery.com/jquery-2.0.3.min.js 来嵌入 jQuery。这有效,是我的临时解决方案。那么有没有像传统服务器那样嵌入jQuery呢?

【问题讨论】:

如果您向所有客户端发送数据,那么您应该使用广播。例如在这里查看 - socket.io/#how-to-use 我已经读过,我的脚本完全遵循这个例子。比如,使用socket.onsocket.emit...都是从示例中提取的。我不知道我哪里做错了。你能帮我看看吗? 在您的服务器中,而不是 socket.emit("message", data: txt); 尝试 io.sockets.emit("message", data: txt); 如果我将socket.emit编辑为io.socket.emit会出现以下错误:Cannot call method emit of undefined。 它是io.sockets.emit 【参考方案1】:

在您的服务器程序中将socket.emit 更改为io.sockets.emit

socket.emit 将向已连接的特定套接字(客户端)发送消息。 io.sockets.emit 将向所有连接的套接字(客户端)发送消息

【讨论】:

以上是关于Nodejs - 简单的 socket.io 示例不会将数据推送到所有浏览器的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs Socket.io Rooms

NodeJs Socket.io 房间

Nodejs & Socket.io 可以支持多少用户?

NodeJS - Socket.io 只允许经过 JWT 验证的连接

socket.io实践(一.实现简单的图表推送)

带有 Socket.IO 1.0 的 NodeJS - 堆外的内存泄漏