Nodejs socketio 报错(server info - unhandled socket.io url 跟client端 XMLHttpRequest cannot load)
Nodejs socketio 报错(server info - unhandled socket.io url 跟client端 XMLHttpRequest cannot load)
server端
var http = require('http');
var io = require('socket.io');
//创建server
var server = http.createServer();
//端口8080
var io = io.listen(server);
server.listen(8089);
io.on("connection", function (client) {
setInterval(function () {
client.send(os.freemem() / os.totalmem());
}, 500);
});
client端
<!doctype html>
<html>
<head>
<title> 服务器内存使用情况 </title>
<script src="http://cdn.socket.io/stable/socket.io.js"></script>
<style>
#usage {border : 1px dashed green;}
</style>
<script>
var canvas, width = 200, height = 200, buffer = [], max = 200;
function updateChart(data) {
if (buffer.length >= max) {
buffer.unshift();
}
buffer.push(data);
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, width, height);
for (var i = 1, n = buffer.length; i < n; i++) {
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(i - 1 , buffer[i - 1] * height);
ctx.lineTo(i, buffer[i] * height);
ctx.closePath();
ctx.stroke();
}
}
function onLoad() {
canvas = document.getElementById("usage");
var socket = new io.Socket('192.168.1.3', {port: 8089});
socket.connect(); // 连接到服务器
socket.on("message", function(obj){ // 接收到消息时的处理方法
updateChart(obj);
});
}
</script>
</head>
<body onload="onLoad();">
<h1> 内存使用情况 </h1>
<canvas id="usage" width="200" height="200"></canvas>
</body>
</html>
然后 这两个东西,都放到了我的服务器上,我的服务器地址是192.188.1.3 是php的服务器。
我首先访问了 192.168.1.3:8080/client.html 进入页面端,之后在后台 node 开启了server端。 结果 页面端报错: XMLHttpRequest cannot load http://192.168.1.3:8089/socket.io/xhr-polling//1348727089478. Origin http://192.168.1.3:8080 is not allowed by Access-Control-Allow-Origin. server端报错 info - unhandled socket.io url warn - unknown transport: “undefined” info - unhandled socket.io url warn - unknown transport: "undefined
查了不少资料,发现要改origin 改了也没有用啊。。
问题分析
在你的场景中,客户端与服务端之间的Socket.IO连接失败。主要问题在于跨域资源共享(CORS)以及Socket.IO URL处理错误。
解决方案
服务端代码修改
确保你的服务端正确配置了Socket.IO,并且允许跨域请求。以下是修改后的服务端代码:
var http = require('http');
var io = require('socket.io');
// 创建server
var server = http.createServer();
// 端口8089
var ioServer = io.listen(server);
server.listen(8089);
ioServer.on("connection", function (client) {
setInterval(function () {
client.send(os.freemem() / os.totalmem());
}, 500);
});
// 配置CORS
ioServer.origins('*:*'); // 允许所有来源的所有端口
客户端代码修改
确保你的客户端代码正确引用了Socket.IO库,并且URL设置正确。以下是修改后的客户端代码:
<!doctype html>
<html>
<head>
<title>服务器内存使用情况</title>
<script src="https://cdn.socket.io/stable/socket.io.min.js"></script>
<style>
#usage {border : 1px dashed green;}
</style>
<script>
var canvas, width = 200, height = 200, buffer = [], max = 200;
function updateChart(data) {
if (buffer.length >= max) {
buffer.shift();
}
buffer.push(data);
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, width, height);
for (var i = 1, n = buffer.length; i < n; i++) {
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(i - 1, buffer[i - 1] * height);
ctx.lineTo(i, buffer[i] * height);
ctx.closePath();
ctx.stroke();
}
}
function onLoad() {
canvas = document.getElementById("usage");
var socket = io('http://192.168.1.3:8089'); // 使用正确的URL
socket.on("data", function (obj) { // 修改事件名称以匹配服务端发送的数据
updateChart(obj);
});
}
</script>
</head>
<body onload="onLoad();">
<h1>内存使用情况</h1>
<canvas id="usage" width="200" height="200"></canvas>
</body>
</html>
关键点解释
-
服务端配置CORS:
ioServer.origins('*:*')
允许所有来源的所有端口。这有助于解决跨域问题。
-
客户端URL设置:
- 确保客户端使用正确的URL来连接到服务器。这里使用了
http://192.168.1.3:8089
。
- 确保客户端使用正确的URL来连接到服务器。这里使用了
-
事件名称匹配:
- 在服务端发送数据时,客户端应该监听与之匹配的事件名称。这里将客户端的事件名称从
"message"
改为"data"
。
- 在服务端发送数据时,客户端应该监听与之匹配的事件名称。这里将客户端的事件名称从
通过以上修改,你应该能够解决跨域问题并成功建立Socket.IO连接。
改的socketio配置文件manager.js
if (origin) {
// https://developer.mozilla.org/En/HTTP_Access_Control
headers['Access-Control-Allow-Origin'] = origin;
headers['Access-Control-Allow-Credentials'] = 'true';
} headers[‘Access-Control-Allow-Origin’] = “*”
这个问题通常发生在浏览器中存在跨域请求问题。你可以通过设置 Access-Control-Allow-Origin
来解决这个问题。
修改Server端代码
var http = require('http');
var io = require('socket.io');
var server = http.createServer();
var io = io.listen(server);
// 允许所有来源的请求
io.set('origins', '*:*');
server.listen(8089);
io.on("connection", function (client) {
setInterval(function () {
client.send(os.freemem() / os.totalmem());
}, 500);
});
修改Client端代码
确保你的HTML文件中的Socket.IO脚本引用正确,并且连接逻辑没有错误:
<!DOCTYPE html>
<html>
<head>
<title>服务器内存使用情况</title>
<script src="http://cdn.socket.io/stable/socket.io.js"></script>
<style>
#usage { border: 1px dashed green; }
</style>
<script>
var canvas, width = 200, height = 200, buffer = [], max = 200;
function updateChart(data) {
if (buffer.length >= max) {
buffer.shift();
}
buffer.push(data);
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, width, height);
for (var i = 1, n = buffer.length; i < n; i++) {
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(i - 1, buffer[i - 1] * height);
ctx.lineTo(i, buffer[i] * height);
ctx.closePath();
ctx.stroke();
}
}
function onLoad() {
canvas = document.getElementById("usage");
var socket = io.connect('http://192.168.1.3:8089'); // 确保使用正确的端口号
socket.on("connect", function () {
console.log("Connected to server");
});
socket.on("message", function (data) {
updateChart(data);
});
}
</script>
</head>
<body onload="onLoad();">
<h1>内存使用情况</h1>
<canvas id="usage" width="200" height="200"></canvas>
</body>
</html>
注意事项
- 确保客户端与服务器在同一网络中,或配置正确的防火墙规则。
- 检查是否使用了正确的端口号。
- 使用
io.connect
而不是new io.Socket
方法,因为后者已被弃用。
这样应该可以解决你的跨域问题。如果仍然存在问题,请检查网络配置或防火墙设置。