Как узнать, какие порты заняты? - PullRequest
0 голосов
/ 16 февраля 2019

Я создаю простой обучающий проект (чат с использованием сокетов) на Java, и сегодня я столкнулся с проблемой.Возможно, для кого-то этот вопрос очевиден, но я смущен этим

Цель

Чтобы узнать (хотя бы одно из следующего):

  1. Список открытых на данный момент свободных / занятых портов на ПК
  2. Заблокирован ли порт, который я хочу использовать

Что я пробовал

I 'Мы создали простой raw-проект и запустили два 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 голосов
/ 16 февраля 2019

Я создал простой raw-проект и запустил два ServerSocket на одном порту.В этом случае я получил java.net.BindException с уведомлением, что «... Адрес уже используется: JVM_Bind ...».Но таким образом я могу проверить доступность порта, только если моя JVM захватила его.В случае, если другая программа слушает порт, я ничего об этом не знаю.

Я думаю, что вы неправильно интерпретируете свой результат.У меня есть все основания полагать, что если запрашиваемый вами порт уже связан с любым процессом, то ваша попытка связать его не удастся с BindException.Это заботится о

Заблокирован ли порт, который я хочу использовать

.Что касается

  1. Список открытых на данный момент свободных / занятых портов на ПК

, существуют системные утилиты, которые могут получить эту информацию, но это бесполезно для вас.Какой бы конец ни инициировал соединение (т. Е. Клиент), необходимо заранее знать, к какому порту пытаться подключиться.Он не может получить это от сервера, потому что это представляет собой проблему курицы и яйца.

Обычный подход состоит в том, что сервер прослушивает определенный порт, выбранный его разработчиком или его администратором, и этот номер порта предоставляетсяклиенты вне диапазона - часто просто потому, что это стандартный, хорошо известный номер порта.Вот как работает большинство основных сетевых протоколов;например, HTTP-серверы по умолчанию работают на порту 80.Если требуемый порт оказывается недоступным, когда сервер пытается подключиться к нему, это указывает на неверную конфигурацию компьютера, и сервер просто не запускается.

Клиент, с другой стороны, не нуждаетсявыбрать номер порта вообще.Система выберет один для него автоматически при попытке подключения к серверу.

...