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

时间:2019-02-15 22:36:23

标签: java sockets serversocket

我正在用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任何建议均受到热烈欢迎

1 个答案:

答案 0 :(得分:3)

  

我创建了一个简单的原始项目,并在一个项目上运行了两个ServerSocket   港口。在这种情况下,我遇到了一个java.net.BindException   通知“ ...地址已在使用中:JVM_Bind ...”。但在   这样,仅当我的JVM具备以下功能时,我才能检查端口的可用性   抓住了它。如果其他程序监听该端口,我不会   一无所知。

我认为您在误解您的结果。我完全有理由相信,如果您请求的端口已被 any 进程绑定,则您尝试绑定的端口将失败,并显示BindException。可以照顾

  
      
  1. 我要使用的端口是否已锁定
  2.   

。至于

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

,有些系统实用程序可以为您提供这些信息,但对您而言毫无用处。发起连接的一端(即客户端)都需要事先知道要尝试连接到哪个端口。它无法从服务器上获取该消息,因为这会带来鸡肉和鸡蛋问题。

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

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