Node.js的websocket错误 "Error: listen EADDRNOTAVAIL Error: listen EADDRNOTAVAIL"

14

应用在本地主机上工作正常。但当连接到服务器时出现错误。
我通过22号端口连接服务器。

这是错误信息。

Error: listen EADDRNOTAVAIL Error: listen EADDRNOTAVAIL
at errnoException (net.js:904:11)
at Server._listen2 (net.js:1023:19)
at listen (net.js:1064:10)
at net.js:1146:9
at dns.js:72:18
at process._tickCallback (node.js:419:13)
at Function.Module.runMain (module.js:499:11)
at startup (node.js:119:16)
at node.js:906:3
任何帮助!!!
-更新-
我运行netstat -tulpn | grep 22
结果:
 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      683/sshd
 tcp6       0      0 :::22                   :::*                    LISTEN      683/sshd

但我运行了netstat -tulpn | grep 80

没有显示任何内容。

请问这是服务器的问题吗?有什么帮助吗?

再尝试运行netstat -nlt

     Active Internet connections (only servers)
     Proto Recv-Q Send-Q Local Address           Foreign Address         State
     tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN
     tcp        0      0 127.0.0.1:5901          0.0.0.0:*               LISTEN
     tcp        0      0 127.0.0.1:5902          0.0.0.0:*               LISTEN
     tcp        0      0 0.0.0.0:6001            0.0.0.0:*               LISTEN
     tcp        0      0 0.0.0.0:6002            0.0.0.0:*               LISTEN
     tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
     tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN
     tcp6       0      0 :::22                   :::*                    LISTEN
     tcp6       0      0 ::1:631                 :::*                    LISTEN

运行 netstat -anp | grep :80

     tcp        1      0 162.243.145.226:60728   91.189.94.25:80         CLOSE_WAIT  1726/ubuntu-geoip-p
     tcp        1      0 162.243.145.226:47842   74.125.239.148:80       CLOSE_WAIT  8104/epiphany-brows
     tcp        1      0 162.243.145.226:60727   91.189.94.25:80         CLOSE_WAIT  1417/ubuntu-geoip-p
     tcp        1      0 162.243.145.226:58818   198.41.30.199:80        CLOSE_WAIT  8104/epiphany-brows

1
你到底想做什么? - Ravi
@ravi - 我尝试将应用程序与服务器连接。在本地主机上,应用程序运行良好。但是当连接服务器时,它会出现这些错误。https://github.com/totaljs/examples/tree/master/angularjs-websocket 这是该项目。 - hash
如果您展示服务器文件代码,那会更容易些。而且,如果您直接使用 https://github.com/totaljs/examples/tree/master/angularjs-websocket 而没有做任何修改,则它们默认使用的端口是8000。请尝试连接服务器的公共IP,例如:http://<SERVER-IP>:8000。测试端口时请使用lsof -i :8000 - Ravi
5个回答

8
今天看到了这个问题。用户在他们的/etc/hosts文件中注释掉了127.0.0.1 localhost,另一个网络服务将localhost解析为与用户机器不相关的不同IP地址。
解决方法是将此行添加到/etc/hosts中:
127.0.0.1 localhost

7

您正在使用已被占用的端口。您必须更改端口或者关闭正在监听该端口的进程。打开终端并输入(例如):lsof -i:22lsof -i:80或者lsof -i:8000,并且kill PID进程。


如何在total.js中更改监听端口

  1. /app/config/app/config-release/app/config-debug中:
default-ip       : 127.0.0.1
default-port     : 8000

或者

// For e.g. Heroku
default-ip       : auto
default-port     : auto
  1. 如果存在文件:release.jsdebug.js
var fs = require("fs");
var options = {};

// options.ip = "127.0.0.1";
// options.port = parseInt(process.argv[2]);
options.port = 8000;

如果只存在 index.js 文件。
// for development:
require('total.js').http('debug', { port: 8000 });

// or for production:
require('total.js').http('release', { port: 8000 });

感谢和文档:http://docs.totaljs.com。涉及IT技术相关内容,请参考总体文档以获取更多信息。

4

我认为您正在使用基于Unix的操作系统,如果是这种情况,则不能在没有sudo权限的情况下使用1024以下的任何端口。

另外,在深入挖掘之前,请检查听取端口是否被其他进程使用。

一个快速解决方法(仅适用于开发):

  • sudo node file.js 或者
  • server.listen(3000); // 任何大于1024的数字

对于生产环境(永远不要使用root访问运行node。)

您需要使用ip表将监听端口(例如:3000)映射到80端口。

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

谢谢您的回答。但是我正在使用Windows操作系统,我的服务器只有Ubuntu。有关Windows的任何帮助吗? :) - hash
我在服务器上运行了您的IP表命令,但没有任何反应。我的服务器出了问题吗? - hash
@mahmoud-mahfouz - 你能提供解决方案吗? - hash
1
EADDRNOTAVAIL(地址不可用)是Linux错误。这意味着TCP连接无法完成。当端口正在使用或无法访问时(例如:端口<1024),就会发生这种情况。要检查端口是否正在使用,请使用“netstat -pn | grep:PORT_NUMBER”,要使用<1024的端口,请使用sudo或使用iptables将应用程序的端口转发(例如:将3000转发到80)。 - Mahmoud.Mahfouz
1
@Sameera 我想你正在询问如何上传文件到服务器。如果是这种情况,您可以使用FTP (https://filezilla-project.org/),或者您可以将代码添加到Git并在服务器上进行拉取。 - Mahmoud.Mahfouz

2
如果您在多次请求后仍然遇到此错误,您可能需要检查端口范围设置并进行调整。还有一些TCP超时设置,例如FIN_WAIT,可以使连接保持打开的时间比预期更长。
“sysctl -a | grep net”应该显示所有网络连接设置。
“sysctl -a | grep port”用于端口范围设置。
“sysctl -a | grep keep”用于TCP等待设置。
请参见这里这里(mac 这里)以获取有关设置的更多详细信息/建议。
如果要修改设置,建议您首先将“/etc/sysctl.conf”复制到类似“/etc/sysctl.conf.bak”的文件中,然后在该文件中修改设置。它们可以通过命令行进行调整,但是这是临时的,重置它们可能会很麻烦。
您可能不想在生产中执行此操作。
其他文档: https://ma.ttias.be/linux-increase-ip_local_port_range-tcp-port-range/ https://easyengine.io/tutorials/linux/sysctl-conf/

1

我怎样可以更改我的端口? Putty不允许我连接80端口。 - hash
使用Putty时,您连接的端口号为22,因为它是SSH端口,但是您的节点应用程序应该使用不同的端口。 - Michael
是的,我的 Node 应用程序使用 80 端口。但它一直出现这个错误。 - hash
请在 SSH 控制台中输入以下命令:"netstat -tulpn | grep :80",然后告诉我你得到了什么输出。 - Michael
请提供一些源代码以便我能够为您提供更进一步的帮助。 - Michael
我使用这个示例来连接我的服务器IP和端口。https://github.com/totaljs/examples/tree/master/angularjs-websocket - hash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接