我正在使用C9.io
这是我的服务器:
var io = require('socket.io');
var socket = io.listen(8080, { /* options */ });
socket.set('log level', 1);
socket.on('connection', function(socket) {
console.log("connected");
socket.on('message1', function(data) {
socket.emit("message1",JSON.stringify({type:'type1',message: 'messageContent'}));
});
socket.on('disconnect', function() {
console.log("diconnected");
});
});
当我运行它时会生成此网址:https://xxx-c9-smartytwiti.c9.io并告诉我我的代码正在此网址中运行。
注意:xxx是我的工作区
我在客户端做了什么: 连接到" https://xxx-c9-smartytwiti.c9.io:8080/" ....
然后我在控制台(firefox浏览器)上收到此错误:
cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://xxx-c9-smartytwiti.c9.io:8080/socket.io/1/?t=1406060495041. This can be fixed by moving the resource to the same domain or enabling CORS.
注意:当我在本地托管我的服务器时,它可以很好地工作。
似乎使用代理或防火墙的c9.io,但我如何远程测试我在c9.io中编写的代码?
更新
根据ruben的回复,我已经更改了我的服务器,当我的socket.io-client在C9中托管但仍无法在远程客户端上运行时,它可以正常工作(i&#39 ; ve还在我的FTP中托管客户端但结果相同):
// module dependencies
var http = require("http"),
sio = require("socket.io");
// create http server
var server = http.createServer().listen(process.env.PORT, process.env.IP),
// create socket server
io = sio.listen(server);
// set socket.io debugging
io.set('log level', 1);
io.set('origins', '*:*');
io.sockets.on('connection', function (socket) {
socket.emit('news', { message: 'Hello world!' });
socket.on('my other event', function (data) {
console.log(data.message);
});
});
看起来原始配置已被忽略,我也不确定C9.io ..
建议?
干杯。
答案 0 :(得分:2)
Same-origin policy要求您的客户端代码和WebSocket服务器托管在相同的URL和端口上。您可以找到将它们集成到Socket.IO docs中的方法的具体示例。以下是使用内置HTTP服务器进行操作的示例。而不是给Socket.IO一个主机名/端口,你给它你的webserver对象:
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);
});
}
io.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
答案 1 :(得分:2)
您使用的是端口8080.请尝试使用process.env.IP
和process.env.PORT
。此外,重要的是不要在域中指定工作区的端口。默认端口(端口80)在c9.io
上转发到容器的内部端口。如果您未通过指定连接到默认端口,则不会遇到跨域安全问题。
另见: https://c9.io/site/blog/2013/05/native-websockets-support/
Ruben - Cloud9支持