我想启动一个监听端口的服务器.我可以显式地指定端口,它可以工作.但我想用自动方式找到一个端口.在这方面,我有两个问题.

  1. 我应该在哪个范围内搜索端口号?(我使用了端口12345、12346和12347,一切正常).

  2. 如何确定给定端口是否未被其他软件占用?

推荐答案

如果您不介意使用的端口,请指定一个0到ServerSocket constructor的端口,它将侦听任何空闲端口.

ServerSocket s = new ServerSocket(0);
System.out.println("listening on port: " + s.getLocalPort());

如果您想使用一组特定的端口,那么最简单的方法可能是遍历它们,直到其中一个工作.比如:

public ServerSocket create(int[] ports) throws IOException {
    for (int port : ports) {
        try {
            return new ServerSocket(port);
        } catch (IOException ex) {
            continue; // try next port
        }
    }

    // if the program gets here, no port in the range was found
    throw new IOException("no free port found");
}

可以这样用法:

try {
    ServerSocket s = create(new int[] { 3843, 4584, 4843 });
    System.out.println("listening on port: " + s.getLocalPort());
} catch (IOException ex) {
    System.err.println("no available ports");
}

Java相关问答推荐

Java同步小服务器

将@ManyToOne JPA Composite Key用作Id保存实体添加额外参数

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

在FML中删除关键帧动画

无法在Java中将hhmmss格式的时间解析为LocalTime

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

@ EnableRouting注释在Kotlin项目中不工作

ApachePOI:不带换行的新行

通过合并Akka Streams中的多个慢源保持订购

如何调整工作时间日历中的时间

CompleteableFuture是否运行在不同的内核上?

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

有没有办法知道在合并中执行了什么操作?

何时调用密封层次 struct 的switch 中的默认情况

为了安全起见,有必要复制一份 list 吗?

在权限列表中找不到我的应用程序

如何使用带有可选参数的类生成器?

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

Java返回生成器的实现