微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Socket.io的Node.js在本地运行,但不能远程运行请求IP更改为远程

如何解决Socket.io的Node.js在本地运行,但不能远程运行请求IP更改为远程

我觉得我已经用尽了所有相关的帖子和​​解决方案,没有解决方案,也没有解决我所看到的确切问题(尽管很多非常相似)。

简而言之,我有一个非常简单的NodeJS socket.io发射器和客户端示例。 当客户端网页与nodeJS socket.io发射器应用程序托管在同一主机上时,它将按预期运行。从任何其他主机执行的同一客户端网页也会出现相同的问题。

基本上,我会收到如下连续消息;

myfile

我将在下面解释详细信息,但是我相信吸烟者是该请求的IP地址/主机已更改为承载客户端网页的主机。

在同一主机(192.168.0.35)上运行时,我获得以下成功;

404 [XHR]       http://192.168.0.41/socket.io/?EIO=3&transport=polling&t=NGc5_Pg    

远程运行时,该IP地址现在是网页服务器的主机! (我确定有一些简单的原因导致我不明白) 为什么请求IP现在是.41而不是.35?

这是两个测试的更完整比较;

工作:客户端页面与节点发射器充当同一主机

200 [XHR]       http://192.168.0.35:3000/socket.io/?EIO=3&transport=polling&t=NGc1BqD
101 [WebSocket] ws://192.168.0.35:3000/socket.io/?EIO=3&transport=websocket&sid=jIxHFTv6eoIXXGiRAAAH    
200 [XHR]       http://192.168.0.35:3000/socket.io/?EIO=3&transport=polling&t=NGc1Bqi&sid=jIxHFTv6eoIXXGiRAAAH

失败:客户端页面为其他任何主机提供服务

200 [XHR]       http://192.168.0.35:3000/socket.io/socket.io.js                                                     Content-Type: application/javascript
200 [XHR]       http://192.168.0.35:3000/socket.io/?EIO=3&transport=polling&t=NGc1BqD                               Content-Type: text/plain; charset=UTF-8
101 [WebSocket] ws://192.168.0.35:3000/socket.io/?EIO=3&transport=websocket&sid=jIxHFTv6eoIXXGiRAAAH                Content-Type: text/plain; charset=UTF-8
200 [XHR]       http://192.168.0.35:3000/socket.io/?EIO=3&transport=polling&t=NGc1Bqi&sid=jIxHFTv6eoIXXGiRAAAH      Content-Type: text/plain; charset=UTF-8

请注意,端口3000已打开,并且已成功为socket.io.js提供服务。 同样,托管客户端网页(Nginx,节点等)的托管似乎也没有关系

当远程运行时,我没有看到任何CORS或XSS错误-我认为这是有道理的-因为请求已更改为本地IP /域?

如果能帮助我了解无法理解的地方或缺少的东西,我将不胜感激!

这是代码

节点testsockets.js

200 [script]    http://192.168.0.35:3000/socket.io/socket.io.js                                                     Content-Type: application/javascript
404 [XHR]       http://192.168.0.41/socket.io/?EIO=3&transport=polling&t=NGc5_Pg                                
404 [XHR]       http://192.168.0.41/socket.io/?EIO=3&transport=polling&t=NGc61sS
404 [XHR]       http://192.168.0.41/socket.io/?EIO=3&transport=polling&t=NGc5_l5
...
...
... infinity        

客户端HTML页面

app.use(function(req,res,next) {
    res.setHeader("Access-Control-Allow-Origin","*");
    res.setHeader("Access-Control-Allow-Headers","X-Requested-With");
    res.setHeader("Access-Control-Allow-Headers","Content-Type");
    res.setHeader("Access-Control-Allow-Methods","PUT,GET,POST,PATCH,DELETE,OPTIONS");  
    res.setHeader('Access-Control-Allow-Credentials',false);  
    res.setHeader("Content-Security-Policy","script-src 'self'");
    next();
  });

var options = {
  allowUpgrades: true,transports: ['websocket','file','htmlfile','xhr-polling','jsonp-polling','polling'],pingTimeout: 9000,pingInterval: 3000,httpCompression: true,origins: '*:*' 
};

var http = require('http').createServer(app);
var io = require('socket.io')(http,options);

app.use(bodyParser.json());
app.use(express.static('public'));

sub_client.subscribe('datahub.tsv.environment');

sub_client.on("message",function(channel,message){
   io.emit('event message',message);
   console.log("redis subscription message: " + JSON.stringify(message));
});

http.listen(3000,'192.168.0.35',() => {
  console.log('dataHUB NodeJS Redis Subscriber listening on *:3000');
});

解决方法

客户端代码似乎存在问题。它无法连接到您传递的URL。 尝试让socket = io('http://192.168.0.35:3000');或其他类似io.connect(URL)的方式。

默认情况下,如果未提供URL,则客户端中的socket.io尝试连接到服务器/主机。它无法获取.35 IP URL,因此它试图连接到.41,因为它是在此处托管和提供的。

幸运的是,当服务器和客户端都在一起时,它可以正常工作,因为默认情况下,客户端尝试连接到为客户端提供服务的服务器,即0.35 IP。即使在此处也没有使用您传递的正确URL,但是默认URL与套接字服务器匹配!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。