【问题标题】:node.js,socket.io only working on local , can't access from intranet systemsnode.js,socket.io 只能在本地工作,不能从内网系统访问
【发布时间】:2015-03-12 06:07:16
【问题描述】:

我正在使用 node.js 和 socket.io 作为实时通知系统,所以我用简单的聊天代码测试了 node.js 和 socket.io,它在 localhost 上非常好,但无法从另一个与同一网络本地连接的系统,我的服务器和客户端代码如下所示

server.js

var express = require('express')
 , app = express()
 , http = require('http')
 , server = http.createServer(app)
 , io = require('socket.io').listen(server);

 server.listen(8888);

和客户端htmlindex.html

<script src="http://localhost:8888/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script>
    var socket = io.connect('http://localhost:8888');
</script>

它在我的浏览器上使用这个 url http://localhost/schat/index.html 工作,但当我尝试使用我的 ip 192.171.56.23/schat/index.html 从另一个系统连接时无法工作,但所有其他 html 文件工作正常,下面是我的 netstat 输出

[root@localhost schat]# netstat -pan | grep 8888
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN        8068/node           
tcp        0      0 127.0.0.1:8888          127.0.0.1:38273         ESTABLISHED 8068/node           
tcp        0      0 127.0.0.1:38273         127.0.0.1:8888          ESTABLISHED 7990/firefox        

【问题讨论】:

  • 尝试更改 url 以包含 socket.io.js 为 &lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt;
  • 但它在 firebug 上抛出错误`“NetworkError: 404 Not Found - localhost/socket.io/socket.io.js”`

标签: node.js socket.io centos7


【解决方案1】:

这是来自socket.io docs 的工作示例(稍作修改)。

使用&lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt;

而不是&lt;script src="http://localhost:8888/socket.io/socket.io.js"&gt;&lt;/script&gt;

并使用var socket = io.connect(window.location.origin);

而不是var socket = io.connect('http://localhost:8888');

(socket.io v1.3.5, express v4.12.2)

index.html

<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect(window.location.origin);

    socket.on('news', function (data) {
        console.log(data);
        socket.emit('my other event', { my: 'data' });
    });
</script>

server.js

var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app);
var io = require('socket.io').listen(server);

server.listen(8888);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

【讨论】:

    【解决方案2】:

    将您的客户端代码更改为

      <script>
           var url = window.location.host;
           var socket = io.connect(url);
      </script>
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我已经解决了:

      【讨论】:

        【解决方案4】:

        感谢 Karim,您的解决方案对我有用,在“server.js”配置中,我设置了“端口”值和“服务器”,但没有设置 IP,我只使用没有“https://”的名称,像这样:

        // External route.
        var express     = require("express");
        var router      = express.Router();
        // In cloud 9 use port 8081
        const port      = 8081;
        const webLnk    = 'mywebdevaddress.io';
        // In dev local ambient 'localhost' work without the 'port' and the server, in prod internet // you need to specify the port and the link name.
        
        const server    = require('http').Server(router).listen(port, webLnk);
        
        const io        = require('socket.io')(server);
        

        是官方的 socket.io 文档吗?我没有看到任何这些!

        【讨论】:

          猜你喜欢
          • 2012-04-26
          • 1970-01-01
          • 1970-01-01
          • 2012-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-18
          • 2012-08-13
          相关资源
          最近更新 更多