如何让socket.io在互联网上用静态IP监听

时间:2018-03-20 06:22:56

标签: node.js express socket.io

我有以下代码在本地网络上运行时运行没有问题,我在同一网络上连接的朋友可以连接到我的系统的ip(192.168.0.107),但是如何制作这个socket.io服务器代码监听我从isp提供者那里得到的静态ip,所以任何地方的任何人都可以通过互联网连接到这个socket.io服务器。

服务器代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

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

  users = [];
 io.on('connection', function(socket) {
 console.log('A user connected');
 socket.on('setUsername', function(data) {
  console.log(data);

  if(users.indexOf(data) > -1) {
     socket.emit('userExists', data + ' username is taken! Try some              
  } else {
     users.push(data);
     socket.emit('userSet', {username: data});
  }
 });

  socket.on('msg', function(data) {
  //Send message to everyone
  io.sockets.emit('newmsg', data);
  })
 });

http.listen(3000, function() {
console.log('listening on localhost:3000');
});

1 个答案:

答案 0 :(得分:1)

您可以根据documentation更新对http.listen的来电,以明确收听对指定地址的请求:

http.listen(3000, 192.168.0.107, function() {
    console.log('listening on localhost:3000');
});

但是默认是允许的(接受对任何主机的请求),因此如果由于防火墙/ NAT问题而无法连接它。来自文档:

  

如果省略host,服务器将在IPv6可用时接受未指定的IPv6地址(::)上的连接,否则接受未指定的IPv4地址(0.0.0.0)。

您需要将路由器配置为将您要提供的任何端口(通常是端口80)上的请求转发到本地IP。对于SuperUser或ServerFault站点来说,这将是一个更大的问题。