socket.io没有发送到客户端

时间:2017-08-22 01:08:20

标签: 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 = 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")
});

3 个答案:

答案 0 :(得分:1)

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

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 site上的客户端文档中,您可以随时通过Google搜索“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)

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

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

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

答案 1 :(得分:0)

试试这个

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

答案 2 :(得分:-1)

问题似乎是您实际上没有连接到本地socket.io服务器。通过使用以下代码运行节点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>