如何知道端口是什么?

问题描述 投票:-1回答:1

我正在用Java创建一个简单的学习项目(使用套接字聊天),今天我遇到了一个问题。对于某人来说,这点可能是显而易见的,但我对此感到困惑

目的

要了解(至少以下之一):

  1. PC上当前打开的可用/已用端口列表
  2. 我想要使​​用的端口是否被锁定

我尝试了什么

我创建了一个简单的原始项目,并在一个端口上运行两个ServerSocket。在这种情况下,我抓住了一个java.net.BindException,通知“......地址已经在使用:JVM_Bind ......”。但是通过这种方式,只有当我的JVM捕获它时,我才能检查端口的可用性。如果其他程序监听端口,我对它一无所知。我在下面添加一个代码。

public class Main {
    public static void main(String[] args) throws IOException {
        MyThread myThread = new MyThread();
        ServerSocket serverSocket = new ServerSocket(5940);
        myThread.start();
        serverSocket.accept();
    }
}

public class MyThread extends Thread {
    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(5940);// exception is thrown here
            serverSocket.accept();
        } catch (IOException e) {
            System.err.println("SECOND SERVER");
            e.printStackTrace();
            interrupt();
        }
    }
}

PS热烈欢迎任何建议

java sockets serversocket
1个回答
3
投票

我创建了一个简单的原始项目,并在一个端口上运行两个ServerSocket。在这种情况下,我抓住了一个java.net.BindException,通知“......地址已经在使用:JVM_Bind ......”。但是通过这种方式,只有当我的JVM捕获它时,我才能检查端口的可用性。如果其他程序监听端口,我对它一无所知。

我认为你错误地解释了你的结果。我完全有理由相信,如果您请求的端口已经受到任何进程的约束,那么您尝试绑定它将失败并使用BindException。这照顾

  1. 我想要使​​用的端口是否被锁定

。至于

  1. PC上当前打开的可用/已用端口列表

,有一些系统实用程序可以为您提供这些信息,但它对您来说毫无用处。无论哪个终端发起连接(即客户端)都需要事先知道尝试连接的端口。它不能从服务器获得,因为这会产生鸡和蛋的问题。

通常的方法是服务器侦听由其开发人员或其管理员选择的特定端口,并且该端口号是在带外提供给客户端的 - 通常只是它是一个标准的,众所周知的端口号。这就是大多数基本网络协议的工作方式;例如,HTTP服务器默认在端口80上运行。如果在服务器尝试绑定到它时,所需端口恰好不可用,则表示计算机配置错误,服务器无法启动。

另一方面,客户端根本不需要选择端口号。系统在尝试连接服务器时会自动选择一个。

© www.soinside.com 2019 - 2024. All rights reserved.