Как я могу определить свободный порт на сервере по коду со стороны клиента? - PullRequest
2 голосов
/ 21 февраля 2009

Есть ли способ узнать свободный порт на сервере, выполнив код с клиентского компьютера.

Пример открытия порта на моей локальной машине:

ServerSocket localmachine = new ServerSocket(0);
int port = localmachine.getLocalPort();

Таким образом, я могу получить свободный порт на моей локальной машине.

Теперь предположим, что у меня есть собственный сервер: http://xyz.com

Как получить свободный порт для сервера, запустив программу с клиента?

Обычно я хочу установить сокетное соединение между клиентом и сервером. Который будет в дальнейшем использоваться для связи.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2009

Информация о порте доступна только для самого сервера, поэтому вам нужно будет запустить программу на сервере, чтобы найти свободный порт и отправить ее клиенту.

Если вы поможете нам понять, почему вы хотите это сделать, мы могли бы дать лучший ответ.

2 голосов
/ 21 февраля 2009

Свободный порт подразумевает, что это порт, который вы можете использовать. Единственные порты, которые клиент может использовать на сервере, - это порты, которые открыты на сервере.

Однако я предполагаю, что вы хотите найти неиспользуемый порт. Звучит так, будто вы пытаетесь сделать что-то, что не нужно делать, если вы делаете то, что пытаетесь делать стандартным образом.

Однако, чтобы ответить на ваш вопрос буквально.

public static int unusedPort(String hostname) throws IOException {
    while (true) {
        int port = (int) (65536 * Math.random());
        try {
            Socket s = new Socket(hostname, port);
            s.close();
        } catch (ConnectException e) {
            return port;
        } catch (IOException e) {
            if (e.getMessage().contains("refused"))
                return port;
            throw e;
        }
    }
}
1 голос
/ 21 февраля 2009

Хотя я не уверен, что / почему вы достигнете этого, вы можете просто попытаться подключиться к серверу с помощью обычных клиентских сокетов. Если вы делаете это в цикле, вы можете проверить все порты. Это может / не может сказать вам, занят ли порт, так как могут быть межсетевые экраны, блокирующие определенные порты. По крайней мере, вы можете увидеть, если вы видите порт.

Такие инструменты, как nmap, конечно, дадут вам более сложный анализ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...