Создайте Java ServerSocket с моим общедоступным IP-адресом

Ну вот мой код:

import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class TcpServerEcho {

public static void main(String argv[]) {

    int port = Integer.parseInt(argv[0]);
    ServerSocket server_socket = null;


    try {

        InetAddress thisIp = InetAddress.getByName("kiravaio.homepc.it");
        System.out.println(thisIp.getHostAddress());

        //or
        //server_socket = new ServerSocket(port, 10, InetAddress.getByName("79.47.49.68"));
        server_socket = new ServerSocket(port, 10, thisIp);

    }
    catch (Exception e) {
        System.err.println("Impossible to create socket server!");
        System.out.flush();
        System.exit(1);
    }

    System.out.printf("Server active on port: %d and on address %s\n", port, server_socket.getInetAddress());


    Socket client_socket = null;
    boolean exec = true;

    while(exec) {


        try {

            client_socket = server_socket.accept();

            InputStream is = client_socket.getInputStream();

            OutputStream os = client_socket.getOutputStream();

            boolean stop = false;

            System.out.println("Received: ");

            while(!stop) {
                int b = is.read();
                System.out.print((char)b);
                if(b == -1) {stop = true;}
                else {os.write( (byte)b );}
            }


        }

        catch (IOException ioe) {
            System.err.println("Error I/O!");
        } finally {
            try {
                client_socket.close();
            }

            catch (IOException ioe) {}
            }

        System.out.println("");
    }


    try {
        /* Never executed */
        server_socket.close();
    } catch (IOException ioe) {}
}

}

У меня нет возможности создать сокет на моем общедоступном IP-адресе. У меня есть домен kiravaio.homepc.it, который всегда обновляется каждый раз, когда меняется мой общедоступный IP-адрес. Итак, сначала я получаю свой IP-адрес с помощью InetAddress thisIp = InetAddress.getByName("kiravaio.homepc.it"); затем я создаю сокет: server_socket = new ServerSocket(port, 10, thisIp); Но это всегда терпит неудачу, и я не знаю почему. Работает только создание сокета на 127.0.0.1! :(


person SagittariusA    schedule 08.02.2013    source источник
comment
Когда вы говорите общедоступный IP-адрес, вы имеете в виду IP-адрес вашего маршрутизатора? Поскольку ваш компьютер может открывать сокеты только на своих собственных сетевых устройствах, iirc.   -  person G. Bach    schedule 09.02.2013
comment
Я имею в виду, что если я зайду на whatsmyip.org, я получу свой общедоступный IP-адрес и хочу привязать его к сокет... чтобы я мог принимать запросы на подключение...   -  person SagittariusA    schedule 09.02.2013
comment
См. ответ Брайана Роуча; вам следует изучить основы работы в сети, прежде чем писать программы, требующие работы в сети.   -  person G. Bach    schedule 09.02.2013
comment
Я буду честен... я не понимаю! Если я привяжу программу к локальному IP-адресу, то... как я могу получить доступ к этой программе из внешнего источника? Я должен использовать общедоступный IP-адрес, верно?   -  person SagittariusA    schedule 09.02.2013
comment
Не поймите меня неправильно, я вас не отчитывал; просто необходимо знать работу с сетью, когда вы пытаетесь написать программы, которые ее используют. Чтобы ответить на ваш вопрос, прочитайте ответ Брайана Роуча.   -  person G. Bach    schedule 09.02.2013


Ответы (2)


Поиск homepc.it показывает, что это доменное имя службы dyndns. Это доменное имя преобразуется в IP-адрес вашего маршрутизатора, а не вашего ПК.

Ваш компьютер будет иметь IP-адрес частной сети (например, 192.168.1.x), назначенный ему вашим маршрутизатором (этот IP-адрес используется вашим компьютером для связи с вашим маршрутизатором, выполняющим NAT (преобразование сетевых адресов)).

Вы должны привязаться к этому адресу (или просто использовать конструктор для ServerSocket, который принимает только порт; он будет привязываться к 0.0.0.0 (INADDR_ANY) и прослушивать все интерфейсы) и настроить маршрутизатор для переадресации выбранного вами порта на этот IP-адрес. адрес.

(Если вы не знаете, как это сделать, обратитесь к руководству по вашему маршрутизатору или, возможно, задайте вопрос на странице https://superuser.com/)

person Brian Roach    schedule 08.02.2013
comment
Я не знал, что существует служба, которая сообщает вам, зарегистрирован ли домен для dyndns; это часть whois или для этого есть отдельные инструменты? - person G. Bach; 09.02.2013
comment
@ G.Bach - если вы просто введете homepc.it в свой браузер, он перенаправит вас на dyndns в Италии;) - person Brian Roach; 09.02.2013
comment
Ну кто же знал, что очевидные вещи иногда дают результаты :D - person G. Bach; 09.02.2013
comment
я такой тупой; всегда сначала пробуй очевидное. Удивительно, но это на самом деле работает много времени. :-D - person Brian Roach; 09.02.2013

Я твердо верю, что для ServerSocket вам не нужно указывать, какой IP-адрес будет использоваться, просто введите новый ServerSocket (порт), и клиент сможет подключаться через ваш динамический домен.

person Junfei Wang    schedule 08.02.2013
comment
Вы правы, если не указать IP-адрес, он будет привязан к 0.0.0.0 (INADDR_ANY) ... что приводит к тому, что вы ошибаетесь. На его компьютере это будет 127.0.0.1 и любой частный немаршрутизируемый IP-адрес, назначенный ему маршрутизатором. Вот почему он терпит неудачу, когда он пытается привязаться конкретно к своему имени хоста dyndns; он разрешает IP-адрес его маршрутизатора, а не его ПК. - person Brian Roach; 09.02.2013