我的问题很简单当我尝试在我的网页上导入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:');
});
});
答案 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
。