【问题标题】:why Netty doesn't bind with public IP address & it binds with 127.0.0.1?为什么 Netty 不绑定公共 IP 地址,而是绑定 127.0.0.1?
【发布时间】:2014-12-03 04:01:40
【问题描述】:

我遇到了这种奇怪的情况,我可以将 ServerBootstrap 与本地 IP 地址绑定,但是当我尝试使用我的公共 IP 地址时,它会引发异常:Exception in thread "main" org.jboss.netty.channel.ChannelException: Failed to bind to: /57.88.173.132:5055

谁能给我解释一下怎么回事???顺便说一句,我正在使用 netty 3.6.1

我更改了地址,它不是真实的,它们是随机数,但是 端口是真实的

这里是代码

私有静态最终字符串 BIND_ADDRESS = "57.88.173.132"; 私有静态最终 int PORT = 5055;

public Server()
{
    try
    {
        startup();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}
private void startup() throws IOException
{
    ServerBootstrap serBootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool())); 
    serBootstrap.setPipelineFactory(new PipelineFactory());
    serBootstrap.bind(new InetSocketAddress(BIND_ADDRESS,PORT));

这是抛出的异常

Exception in thread "main" org.jboss.netty.channel.ChannelException: Failed to bind to: /57.88.173.132:5055
    at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:301)
    at com.game.server.Server.startup(Server.java:33)
    at com.game.server.Server.<init>(Server.java:22)
    at com.game.server.Server.main(Server.java:44)
Caused by: java.net.BindException: Cannot assign requested address: bind
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Unknown Source)
    at sun.nio.ch.Net.bind(Unknown Source)
    at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
    at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)
    at org.jboss.netty.channel.socket.nio.NioServerBoss$RegisterTask.run(NioServerBoss.java:193)
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:367)
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:291)
    at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42)
    at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
    at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 你能发布堆栈跟踪吗?
  • 我知道地址不是真实的吗?
  • Frederic 别担心我改变了它,因为我不想让人们知道我的公共 IP
  • @Nicholas 我添加了堆栈跟踪
  • 我的意思是:在您的真实环境中,您指定的地址是真实的吗?正如 Maksym 的回答中所指出的那样,似乎不是,所以错误(不是 Netty 的错)。

标签: bind netty nullreferenceexception public server


【解决方案1】:

这实际上不是网络问题。

很明显 java.net.BindException。在大多数情况下,这意味着该端口已经被其他进程监听,您可以使用 netstat 命令来检测它。

但也有少数特殊情况:

来自here的注1:

这可能与您的 /etc/hosts 中的错误配置有关。在我的 情况是这样的:192.168.1.11 localhost 而不是 127.0.0.1 本地主机

来自here的注2:

错误提示无法分配请求的地址。这意味着你 需要为您的网络接口之一使用正确的地址或 0.0.0.0 接受来自所有接口的连接。

已编辑。

【讨论】:

  • 我检查了主机文件本地主机是 127.0.0.1,你的意思是:我需要为我的一个网络接口使用正确的地址我的公共 IP 不正确?我很困惑,我必须将我的公共 IP 添加到主机文件并命名它?还是什么?
  • 我已经编辑了我的答案,127.0.0.1 应该没问题,看起来你的问题很简单 -> 端口 5055 已经被服务器上的其他进程使用。
  • 我已经检查过我的端口是唯一的。服务器与 0.0.0.0 绑定,但我不明白这怎么可能:/ 有人可以像我五岁一样向我解释 :) ??跨度>
  • 0.0.0.0 指示 Netty 绑定到所有可用的接口。内核将自动检测所有可用的网络接口,并在可能的情况下将它们全部绑定到所选端口上。您将能够通过任何可用的 IP 地址连接到 Netty。正如其他人已经提到的'netstat -l | grep 5055' 将显示是否有任何东西已经在监听端口。我还会使用“ifconfig”或“ip addr”仔细检查可用的 IP 地址
猜你喜欢
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多