解决nodejs socket.io is not allowed by Access-Control-Allow-Origin 跨域问题

解决nodejs socket.io is not allowed by Access-Control-Allow-Origin 跨域问题

blog:http://www.cnblogs.com/solq/

demo:http://unitysgui.sinaapp.com/websocket/socketio.html

 

更改 :\node_modules\socket.io\lib\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-Headers'] = 'Referer';

  }

    headers['Access-Control-Allow-Origin'] = "*";

在后面添加

headers['Access-Control-Allow-Origin'] = "*";

server.js
var http = require('http'),  

io = require('socket.io'),

sys = require('sys');







server = http.createServer(function(req, res){

    res.writeHead(200, {'Content-Type': 'text/html'}); 

    res.end("hello");

});

server.listen(8082);



var socket = io.listen(server,{origins: '*:*'}); 



/*

socket.set("origins","*");

socket.set('transports', [

    'websocket'

    , 'flashsocket'

    , 'htmlfile'

    , 'xhr-polling'

    , 'jsonp-polling'

]);*/





socket.on('connection', function(client){ 



    sys.puts("New client is here!");

    client.send("hello world");



    client.on('message', function(msg){ sys.puts("client has sent:"+msg); }) ;

    client.on('disconnect', function(){ sys.puts("Client has disconnected"); }) ;

    

    //发送自定义事件

    client.emit('news', { hello: 'news world' });



    //临听自定义事件

    client.on('my other event', function (data) {

        //console.log(data);

    });

}); 

client.js

<script src="http://localhost:8082/socket.io/socket.io.js"></script>

<script>

window.onload=function(){

    

    var url='127.0.0.1:8082';

    var socket = io.connect('localhost',{port:8082,rememberTransport:true,timeout:1500});

    //var socket = new io.Socket(null,{port:8082,rememberTransport:true,timeout:1500});

    

    /*

        if (/Firefox\/\s/.test(navigator.userAgent)){

        var socket = io.connect(url,{transports:['xhr-polling']}); 

    } 

    else if (/MSIE (\d+.\d+);/.test(navigator.userAgent)){

        var socket = io.connect(url,{transports:['jsonp-polling']}); 

    } 

    else { 

        var socket = io.connect(url,{transports:['websocket']}); 

    }

    */



    //socket.connect();

    socket.on('connect', function(){ 

        console.log('connected to server++++++++++++++++'); 

        socket.send('Hi Server...'); 

    }) ;

    socket.on('message', function(r){ console.log('msg:+++++++++++'+r); }) ;

    socket.on('disconnect', function(){ console.log('disconnected from server'); }) ;



    socket.on('news', function (data) {

        console.log("++++++++++++++++++++++++++");

        console.log(data);

        

        //发送自定义事件

        socket.emit('my other event', { my: 'data' });

    });

    

    /*XMLHttpRequest cannot load http://localhost:8082/socket.io/1/?t=1336306289263. Origin null is not allowed by Access-Control-Allow-Origin.

    var ws = new WebSocket("ws://127.0.0.1:8082");

    ws.onopen = function(){console.log('connected to server');}

    ws.onmessage = function(m){console.log('onmessage');}

    ws.onclose = function(){}*/

}

</script>

https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO

注意:经过测试

io.connect('localhost')
localhost:8082 加上端会连不上

经过测试。。
  if (origin!='null') {

    // https://developer.mozilla.org/En/HTTP_Access_Control

    headers['Access-Control-Allow-Origin'] = origin;

    headers['Access-Control-Allow-Credentials'] = 'true';

    //headers['Access-Control-Allow-Headers'] = 'Referer';

  }

    console.log("console.log(origin)+++++++++++++++++++++++++++++++++++++++")

    console.log(origin)

    console.log(req.headers)

 

origin==null...难怪连不上。。。为什么为是null不太懂原理。。。就不管了,,手动改为全部可以访问就行了


解决IE不能接收服务端信息问题:
sever 要打开这几个协议吧。。。。
然后 clinet html 要放在服务里面,因为IE用的是 jsonp 方式 的话。。。。。。。。。。。只要是 js 请求都要放在服务器..
但是放在服务器里, node server 接收 ie 客户端 连接类型为 flashsocket 方式,,反正是不太了解。。。能工作就行了。。哈哈
socket.set('transports', [

    'websocket'

    , 'flashsocket'

    , 'htmlfile'

    , 'xhr-polling'

    , 'jsonp-polling'

]);

最后,经过反复测试,,以上打开的协议是 遍历检测有就使用的。。。。

如果把 flashsocket 放在最后,那么 server 跟 ie 就用 jsonp 方式来连接...但是 ie 接收不了数据。。。。有人知道是什么原因,麻烦你告诉我。。好了谢谢...

你可能感兴趣的:(socket)