Java 如何知道使用了哪些端口?

Java 如何知道使用了哪些端口?,java,sockets,serversocket,Java,Sockets,Serversocket,我正在用Java创建一个简单的学习项目(使用套接字聊天),今天我遇到了一个问题。也许这一点对某些人来说是显而易见的,但我对此感到困惑 目的 了解(至少以下一项): 电脑上当前打开的可用/占用端口列表 我要使用的端口是否已锁定 我试过的 我创建了一个简单的原始项目,并在一个端口上运行了两个ServerSocket。在本例中,我捕获到一个java.net.BindException,通知“…地址已在使用中:JVM_Bind…”。但通过这种方式,只有当JVM捕获了端口可用性时,我才能检查端口可用性。以

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

目的 了解(至少以下一项):

  • 电脑上当前打开的可用/占用端口列表
  • 我要使用的端口是否已锁定
  • 我试过的 我创建了一个简单的原始项目,并在一个端口上运行了两个
    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();
        }
    }
    

    PS:欢迎您提供任何建议

    我创建了一个简单的原始项目,并在一个上运行了两个
    ServerSocket
    港口城市在本例中,我捕获了一个带有 通知“…地址已在使用中:JVM_Bind…”。但是在 这样,只有在JVM具有可用性的情况下,我才能检查端口的可用性 抓住了它。如果其他程序监听端口,我不会 你知道吗

    我认为你误解了你的结果。我完全有理由相信,如果您请求的端口已经被任何进程绑定,那么您绑定它的尝试将失败,并出现
    BindException
    。那就够了

  • 我要使用的端口是否已锁定
  • 。至于

  • 电脑上当前打开的可用/占用端口列表
  • ,有一些系统实用程序可以获取这些信息,但对您来说毫无用处。无论哪一端启动连接(即客户端),都需要提前知道尝试连接到哪个端口。它无法从服务器上获取,因为这会带来鸡和蛋的问题

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


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

    您的问题是什么?为什么您认为需要一个可用端口列表?“端口被锁定”是什么意思?
    中断()的目的是什么呼叫?附带问题——不要扩展线程,而是根据需要实现可运行或可调用。对于标题中的问题:对于服务器,您无法真正检测和调整,因为客户端需要知道要连接到哪个端口,否则它将找不到服务器。但是,您可以对其进行配置或进行一些查找(在端口中添加1,直到您获得一些免费的内容,并在客户端中执行相同的操作,直到您获得连接)。后者很奇怪,但你偶尔会发现。另一方面,对于客户端,您只需绑定到端口0,机器将从临时范围(免费的内容)分配一个端口。“当前免费开放”在术语上是矛盾的。非常感谢您的回答。据我所知:…我有充分的理由相信,如果您请求的端口已经被任何进程绑定,那么您绑定它的尝试将失败,并出现BindException。。。可以通过不同的进程侦听两个或多个端口。我说的对吗?@MikeBiri,相同或不同的进程在任何给定时间都可能侦听不同的端口,但没有两个进程可以同时侦听同一端口。甚至一个进程也不能让多个套接字同时监听同一个端口,这就是我要说的问题。例如,我的Skype客户端侦听端口8080,同时我可以在JVM中创建一个
    ServerSocket
    ,并将其设置为侦听端口8080。并且不会抛出异常…@MikeBiri,那么Skype必须侦听UDP端口8080。您的Java服务器肯定正在侦听TCP端口。两者相互独立,互不冲突。
    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();
            }
        }
    }