Javascript socket.io未发送到客户端

Javascript socket.io未发送到客户端,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我正在尝试创建一个简单的脚本,以便在每次更新文件时将数据从文件发送到客户端。我已经测试并发现该文件已被读取,但客户端没有收到任何内容。控制台中没有错误。我对socket.io相当陌生 node.js代码 var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var fs = require("fs"); var port = proc

我正在尝试创建一个简单的脚本,以便在每次更新文件时将数据从文件发送到客户端。我已经测试并发现该文件已被读取,但客户端没有收到任何内容。控制台中没有错误。我对socket.io相当陌生

node.js代码

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require("fs");
var port = process.env.PORT || 3000;

app.get('/', function(req, res){
    res.sendFile(__dirname + '/popup.html');
});

fs.watchFile("assets/popup.json", {interval:100}, function(curr, prev)
{
    fs.readFile("assets/popup.json",{encoding:"utf8"}, function(err, data){
        io.emit("popup", data)
    })
});
http.listen(port, function(){
    console.log('listening on *:' + port);
});
var socket = io();
socket.on('popup', function(msg){
    alert("hello")
});
客户端代码

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require("fs");
var port = process.env.PORT || 3000;

app.get('/', function(req, res){
    res.sendFile(__dirname + '/popup.html');
});

fs.watchFile("assets/popup.json", {interval:100}, function(curr, prev)
{
    fs.readFile("assets/popup.json",{encoding:"utf8"}, function(err, data){
        io.emit("popup", data)
    })
});
http.listen(port, function(){
    console.log('listening on *:' + port);
});
var socket = io();
socket.on('popup', function(msg){
    alert("hello")
});
试试这个

    socket.on('popup', function(msg){
         socket.emit('message',"popup");
    });
试试这个

    socket.on('popup', function(msg){
         socket.emit('message',"popup");
    });

问题似乎是您实际上没有连接到本地socket.io服务器。通过使用下面的代码运行node server.js,您可以启动web服务器。然后在浏览器中导航到localhost,查看控制台中对popup.json所做的更改

server.js

var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(80);

function handler (req, res) {
    fs.readFile(__dirname + '/index.html',
        function (err, data) {
            if (err) {
                res.writeHead(500);
                return res.end('Error loading index.html');
            }

            res.writeHead(200);
            res.end(data);
        });
}

fs.watchFile("popup.json", {interval: 100}, function (curr, prev) {
    fs.readFile("popup.json", {encoding: "utf8"}, function (err, data) {
        io.emit("popup", JSON.parse(data));
    })
});
index.html

<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io('http://localhost');
    socket.on('popup', function (data) {
        console.log(data);
    });
</script>

变量套接字=io('http://localhost');
socket.on('popup',函数(数据){
控制台日志(数据);
});

问题似乎是您实际上没有连接到本地socket.io服务器。通过使用下面的代码运行node server.js,您可以启动web服务器。然后在浏览器中导航到localhost,查看控制台中对popup.json所做的更改

server.js

var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(80);

function handler (req, res) {
    fs.readFile(__dirname + '/index.html',
        function (err, data) {
            if (err) {
                res.writeHead(500);
                return res.end('Error loading index.html');
            }

            res.writeHead(200);
            res.end(data);
        });
}

fs.watchFile("popup.json", {interval: 100}, function (curr, prev) {
    fs.readFile("popup.json", {encoding: "utf8"}, function (err, data) {
        io.emit("popup", JSON.parse(data));
    })
});
index.html

<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io('http://localhost');
    socket.on('popup', function (data) {
        console.log(data);
    });
</script>

变量套接字=io('http://localhost');
socket.on('popup',函数(数据){
控制台日志(数据);
});

每当事情不能像这样正常工作时,您需要求助于“调试模式”。在这种模式下,您需要收集所有可能发生的事件,并查看您从中学到了什么。为此,请将以下代码添加到客户端:

var socket = io();
socket.on('popup', function(msg){
    console.log("hello: ", msg)
});
socket.on('connection', function() {
    console.log("client connected");
});

socket.on('connect_error', function(err) {
    console.log("client connect_error: ", err);
});

socket.on('connect_timeout', function(err) {
    console.log("client connect_timeout: ", err);
});
这些消息都记录在客户端文档中,您可以随时通过谷歌搜索“socket.io github”在其上找到

然后,查看加载页面时在浏览器控制台中看到的内容。如果你不知道如何在你使用的浏览器中打开浏览器控制台,用谷歌搜索一下。当页面加载时,您需要查看调试控制台

仅供参考,我们假设您已通过此代码之前的脚本标记将socket.io加载到页面中。否则,该错误也将显示在控制台中


OP然后会收到以下错误:

client connect_error: 
    Error: server error at Socket.onPacket (socket.io-1.2.0.js:1) 
      at XHR.<anonymous> (socket.io-1.2.0.js:1) 
      at XHR.Emitter.emit (socket.io-1.2.0.js:1) 
      at XHR.Transport.onPacket (socket.io-1.2.0.js:1) 
      at callback (socket.io-1.2.0.js:2) 
      at Object.exports.decodePayload (socket.io-1.2.0.js:2) 
      at XHR.Polling.onData (socket.io-1.2.0.js:2) 
      at Request.<anonymous> (socket.io-1.2.0.js:2) 
      at Request.Emitter.emit (socket.io-1.2.0.js:1) 
      at Request.onData (socket.io-1.2.0.js:2)
客户端连接\u错误:
错误:Socket.onPacket(Socket.io-1.2.0.js:1)处的服务器错误
在XHR。(socket.io-1.2.0.js:1)
在XHR.Emitter.emit(socket.io-1.2.0.js:1)
在XHR.Transport.onPacket(socket.io-1.2.0.js:1)
回调时(socket.io-1.2.0.js:2)
在Object.exports.decodePayload(socket.io-1.2.0.js:2)
在XHR.Polling.onData(socket.io-1.2.0.js:2)
应要求。(socket.io-1.2.0.js:2)
在Request.Emitter.emit(socket.io-1.2.0.js:1)
在Request.onData(socket.io-1.2.0.js:2)

好,进展。如何在客户端页面中加载socket.io?这似乎是因为客户端和服务器中的socket.io版本不匹配。你应该做:

<script src="/socket.io/socket.io.js"></script>


然后,服务器将向客户端页面提供与socket.io完全相同的版本。此外,由于此错误报告客户端socket.io 1.2.0,服务器上安装了什么版本的socket.io?

每当事情不能像这样正常工作时,您需要求助于“调试模式”。在这种模式下,您需要收集所有可能发生的事件,并查看您从中学到了什么。为此,请将以下代码添加到客户端:

var socket = io();
socket.on('popup', function(msg){
    console.log("hello: ", msg)
});
socket.on('connection', function() {
    console.log("client connected");
});

socket.on('connect_error', function(err) {
    console.log("client connect_error: ", err);
});

socket.on('connect_timeout', function(err) {
    console.log("client connect_timeout: ", err);
});
这些消息都记录在客户端文档中,您可以随时通过谷歌搜索“socket.io github”在其上找到

然后,查看加载页面时在浏览器控制台中看到的内容。如果你不知道如何在你使用的浏览器中打开浏览器控制台,用谷歌搜索一下。当页面加载时,您需要查看调试控制台

仅供参考,我们假设您已通过此代码之前的脚本标记将socket.io加载到页面中。否则,该错误也将显示在控制台中


OP然后会收到以下错误:

client connect_error: 
    Error: server error at Socket.onPacket (socket.io-1.2.0.js:1) 
      at XHR.<anonymous> (socket.io-1.2.0.js:1) 
      at XHR.Emitter.emit (socket.io-1.2.0.js:1) 
      at XHR.Transport.onPacket (socket.io-1.2.0.js:1) 
      at callback (socket.io-1.2.0.js:2) 
      at Object.exports.decodePayload (socket.io-1.2.0.js:2) 
      at XHR.Polling.onData (socket.io-1.2.0.js:2) 
      at Request.<anonymous> (socket.io-1.2.0.js:2) 
      at Request.Emitter.emit (socket.io-1.2.0.js:1) 
      at Request.onData (socket.io-1.2.0.js:2)
客户端连接\u错误:
错误:Socket.onPacket(Socket.io-1.2.0.js:1)处的服务器错误
在XHR。(socket.io-1.2.0.js:1)
在XHR.Emitter.emit(socket.io-1.2.0.js:1)
在XHR.Transport.onPacket(socket.io-1.2.0.js:1)
回调时(socket.io-1.2.0.js:2)
在Object.exports.decodePayload(socket.io-1.2.0.js:2)
在XHR.Polling.onData(socket.io-1.2.0.js:2)
应要求。(socket.io-1.2.0.js:2)
在Request.Emitter.emit(socket.io-1.2.0.js:1)
在Request.onData(socket.io-1.2.0.js:2)

好,进展。如何在客户端页面中加载socket.io?这似乎是因为客户端和服务器中的socket.io版本不匹配。你应该做:

<script src="/socket.io/socket.io.js"></script>


然后,服务器将向客户端页面提供与socket.io完全相同的版本。此外,由于此错误报告客户端socket.io 1.2.0,服务器上安装了什么版本的socket.io?

我不希望该页返回通信,我只想将数据提供给该页我不希望该页返回通信,我只想将数据提供给该页您是否100%确定正在访问
io.emit()
。如果您将
console.log()
语句放在那里,您在控制台中看到该语句了吗?是的,我有console.log(数据),它打印了数据,但在页面上没有收到任何内容。请向我们显示初始化socket.io服务器的所有相关代码。此外,您还可以使用回调中的
console.log()
io.on('connect',…)
放在客户机中,以查看客户机是否认为它正在连接。并且,您可以在客户机中注册连接错误的各种侦听器,以查看是否有任何侦听器受到攻击。如果对事件驱动编程有疑问,请注册所有可能的错误处理程序,以查看是否触发了任何错误处理程序。使用我的所有nodejs代码进行更新,其中许多是socket.io网站中的示例代码客户端代码加载到浏览器栏中的URL是什么,因为这是
io()的主机和端口
将尝试连接到。我仍然很瘦