当前位置: 首页 > 知识库问答 >
问题:

是否多次绑定到同一端口?

穆宾白
2023-03-14
import java.net.InetSocketAddress;
import java.net.ServerSocket;

public class Test
{
    public static void main(String[] args) throws Exception
    {
        try (ServerSocket socket1 = new ServerSocket();
             ServerSocket socket2 = new ServerSocket();
             ServerSocket socket3 = new ServerSocket())
        {
            int port = 10000;

            socket1.setReuseAddress(false);
            socket1.bind(new InetSocketAddress("0.0.0.0", port));

            socket2.setReuseAddress(false);
            socket2.bind(new InetSocketAddress("127.0.0.1", port));

            socket3.setReuseAddress(false);
            socket3.bind(new InetSocketAddress("127.0.0.2", port));

            Thread.sleep(Long.MAX_VALUE);
        }
    }
}
C:\Users\Administrator>netstat -a -n | findstr 10000
  TCP    0.0.0.0:10000          0.0.0.0:0              LISTENING
  TCP    127.0.0.1:10000        0.0.0.0:0              LISTENING
  TCP    127.0.0.2:10000        0.0.0.0:0              LISTENING
  TCP    [::]:10000             [::]:0                 LISTENING

我正在Windows Server 2008 R2(64位)上运行此操作,并且'ipconfig/all'只显示一个网络适配器/接口(其他网络适配器被禁用)。但是,在其他一些机器上,这个程序实际上会抛出预期的“java.net.bindexception:Address已经在使用:jvm_bind”!

会发生什么事?

共有1个答案

潘弘壮
2023-03-14

您可以绑定在不同IP地址上的相同端口号上。操作系统可以通过目标IP地址和TCP端口号来区分传入的数据包。

操作系统为127.0.0.1:1000127.0.0.2:1000保留单独的serverSocket没有问题。它知道每个数据包属于哪里--即使它打开了一个新的连接。

请注意,IP地址0.0.0.0只是一个IP地址(它不是一个有效的IP地址,因为IP数据包可以发送到那里,但我也不支持0.0.0.0==any)。如果您想侦听所有地址,请将null提供给InetSocketAddress。此时,您获得所需异常的几率更大(除非OS决定通配符侦听具有较低的优先级,并且不会真正与特定侦听重叠,因此它们可以将两者绑定)。

 类似资料:
  • 问题内容: 我遵循Presentation Model模式对一些屏幕进行编码。 我把一些豆子放在一个 我将在中显示此列表的内容,这要归功于 我还想同时在组合框(以表单的形式)中显示此列表中的 某些记录* , 并同时 在JList中显示 其他 记录。 *** 这三个屏幕(及其模型)彼此独立 如何管理在我的列表中添加{一个或多个} /删除{一个或多个}并在各处实时查看更改? 我将要编写自己的Obser

  • 问题内容: 使用Netty时,令我感到惊讶的是,如果使用复用地址选项,它允许ServerSocket绑定到相同的地址而不会引发“已经绑定异常” 我只是以为reuseAddress允许新套接字重用关闭等待套接字,但这是不同的。以下是netstat命令的结果 我想念什么吗?这是怎么回事? 问题答案: 由于历史原因,我认为Windows允许这样做。这是一个安全问题。有关所涉及的选项如何交互的一些信息,请

  • 我有一个预览页面,需要添加或编辑模型,并显示预览。 我需要从添加表单页和编辑表单页调用预览。我要通过的模型是相同的,但来自不同的形式。 (1) ModelAttribute是否有支持这种多属性名称映射的方法?(2) 我怎么能考虑重新设计这个?考虑(a)在表单提交之前重命名表单名称/属性以使用相同的属性名称。(b) 完全删除ModelAttribute——这不是我的选项,因为我使用的是SpringM

  • 问题内容: 我想知道是否可能有一个ng类,其中class一度绑定,并且每个摘要周期评估一次class。 我知道我可以一次绑定完整的ng-class, 但是我需要一次绑定一个特定的表达式 当然,这是行不通的: 有办法吗? 问题答案: 方法1: 方法2:

  • 问题内容: 上面的语句返回3行。但是下面的语句仅返回2行。 我知道为什么会这样,但是有一种方法可以强制item_id 1返回两次? 我要退货的示例: id-> 1筹码€2.50 id-> 1筹码€2.50 id-> 2可口可乐€1.60 -------------------- 总计€6.60 问题答案: 您可以加入另一个表,例如 或者只是在您的应用程序中复制它们。 您实际上不需要做您所要的。

  • 问题内容: 我正在尝试为我的数据库实现一个非常基本的搜索引擎,其中用户可能包含各种信息。搜索本身包含几个联合选择,其中结果总是合并为3列。 但是,返回的数据是从不同的表中获取的。 每个查询都使用$ term进行匹配,并将其绑定到“:term”作为预备参数。 现在,该手册说: 调用PDOStatement :: execute()时,对于要传递给语句的每个值,必须包含一个唯一的参数标记。您不能在准备