[英]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.