簡體   English   中英

socket.io沒有發送給客戶端

[英]socket.io not sending to client

我正在嘗試創建一個簡單的腳本,以便每次文件更新時都將文件中的數據發送到客戶端。 我已經測試過,發現該文件已被讀取,但是客戶端什么也沒收到。 控制台中沒有錯誤。 我對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 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 github”來找到它們。

然后,查看頁面加載后在瀏覽器控制台中看到的內容。 如果您不知道如何在使用的瀏覽器中打開瀏覽器控制台,請在Google上進行查找。 頁面加載時,您需要查看調試控制台。

僅供參考,我們假設您已在此代碼之前通過腳本標記將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?

嘗試這個

    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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM