Открыть ServerSocket на удаленной машине с Java? - PullRequest
0 голосов
/ 03 октября 2011

Я создал простой метод, пытаясь определить, открыт ли сокет на удаленной машине.Вот мой код:

public static Boolean isPortAvailable( int port, String bindAddr  ) {
    try { 
        System.out.println("IP: " + InetAddress.getByName(bindAddr ));
        ServerSocket srv = new ServerSocket(port, 0, InetAddress.getByName(bindAddr ) );  

        srv.close();  
        srv = null;  
        return true;  

    } catch (IOException e) {  
        return false;  
    }
}  

Передавая эти два аргумента:

String bindAddr  = "remotemachinename";
int port = 1719;

Он продолжает сообщать мне, что порт недоступен, но если я попробую netstat -a на машине, явидите, это явно не используется.Я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 03 октября 2011

Если вы хотите связаться с прослушивающим (серверным) сокетом, вы должны использовать Socket, а не ServerSocket. См. ServerSocket javadoc , третий параметр конструктора ServerSocket - локальный адрес для привязка к, а не удаленный адрес для подключить к.

Попробуйте это:

try {
    InetAddress addr = InetAddress.getByName(bindAddr);
    Socket sock = new Socket();
    SocketAddress sockaddr = new InetSocketAddress(addr, port);
    int timeout = 1000;   // wait for 1 second = 1000ms (adapt to your use case)
    sock.connect(sockaddr, timeout);
} catch (UnknownHostException e) {
} catch (SocketTimeoutException e) {
    // nobody's listening or willing to accept our connection...
} catch (IOException e) {
}
0 голосов
/ 03 октября 2011

То, что вам не хватает, это игнорирование вашего IOException, которое, вероятно, говорит вам, что вы не можете претендовать на то, чтобы быть другим сервером.Я предлагаю вам игнорировать только выбранные ожидаемые исключения

Используйте сокет, как подсказывает @fvu, и возвращайте boolean, а не Boolean

...