nodejs socket.io GET http://domain/socket.io/?EIO = 3& transport = polling& t =导入socket.io时的LrTVonQ状态为404

时间:2017-07-20 01:24:58

标签: javascript node.js socket.io

我的问题很简单当我尝试在我的网页上导入socket.io时,我实际上收到了错误404。我正在使用

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>

导入socket.io。

如果我从头标签中删除此行,我很好,但是当它在那里时,我在开发工具中看到404错误,我的计数器甚至没有工作。

我正在尝试为我的某个网站制作一个实时查看器,但我从未真正使用过Node.js所以这就是我遇到麻烦的原因。如果我的剧本中有错误,请原谅我。

对于服务器端脚本,该文件名为:viewercounter.js,这是代码

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = 8001;

server.listen(port, function () {
  console.log('Server listening at port %d', port);
});

app.use(express.static(__dirname + '/public'));

var count = 0
io.on('connection', function(socket) {
    count++;
    socket.broadcast.emit('userupd', {
        numUsers: count
    });
    console.log(count);

    socket.on('disconnect', function(){
        count--;
        socket.broadcast.emit('userupd', {
            numUsers: count
        });
        console.log(count);
    });
});

然后我将客户端脚本直接放在我的页面中,而不是创建一个新文件,我没有真正看到它的重点。无论如何,该文件被称为:index.php 并且代码位于body标记结尾之前的文件末尾,而代码之前没有其他js。

<script type="text/javascript">
$(function() {
  var socket = io();

  socket.on('userupd', function (data) {
    $('.counter').html(data);
  });
});

修改

通过更深入地了解,我已经能够理解它是一个XMLHttpRequest问题。实际上,当我刚刚导入的socket.io代码尝试执行xhr.send(this.data)时,会出现错误。谁知道我怎么解决这个问题? https://gyazo.com/53f64081a92b449e157df76c6c570178

EDIT2

更改文件viewcounter.js中的端口后。它看起来像这样:

// Setup basic express server
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = 80;

server.listen(port, function () {
  console.log('Server listening at port %d', port);
});

// Routing
app.use(express.static(__dirname + '/public'));

var count = 0
io.on('connection', function(socket) {
    count++;
    socket.broadcast.emit('userupd', {
        numUsers: count
    });
    console.log('New user: ');

    socket.on('disconnect', function(){
        count--;
        socket.broadcast.emit('userupd', {
            numUsers: count
        });
        console.log('Neg user:');
    });
   });

1 个答案:

答案 0 :(得分:0)

如果您的网页来自端口80上的Apache Web服务器,并且您想在相同主机上的node.js中创建socket.io服务器,那么您需要选择一个新的该socket.io服务器的端口,当您连接到socket.io服务器时,您需要标识要连接的端口,因为默认端口为80,但这不是您的socket.io服务器的位置是

我建议您使用端口8001,就像您最初用于socket.io服务器一样。请将您的node.js代码更改回。

然后,您可以从以下位置更改页面中的socket.io代码:

<script type="text/javascript">
$(function() {
  var socket = io();

  socket.on('userupd', function (data) {
    $('.counter').html(data);
  });
});
</script>

到此:

<script type="text/javascript">
$(function() {
  var url = window.location.protocol + "//" + window.location.hostname + ":8001";
  var socket = io(url, {transports: ['websocket'], upgrade: false});

  socket.on('userupd', function (data) {
    $('.counter').html(data);
  });
});
</script>

这将socket.io连接到与您的网页相同的协议和主机,但是一个不同的端口,它将只使用webSocket,因此您不会遇到与socket.io相关的跨源问题。通常尝试启动与Ajax轮询的连接。

如果您的socket.io服务器实际上位于与Apache服务器不同的主机上,那么您需要将该主机放在URL而不是window.location.hostname