Como o cliente "(Socket)" sabe o ip do servidor "(ServerSocket)" que ele deve se conectar?

Eu estava estudando essa página sobre conexão TCP em servidores com java, mas surgiu uma
dúvida:
Quando o cliente faz:

      Socket cliente = new Socket("paulo",12345);
      ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream());

Como que ele sabe o IP do servidor que ele deve se conectar? Eu não sei o que deixei passar, talvez eu esteja confundido algum conceito.

Não sei se o tutorial explica, mas o primeiro parâmetro do new Socket() é o host, ao qual o cliente irá se conectar. No caso, foi usado “paulo”, então nesse tutorial, suponho que a máquina que está rodando o servidor tenha esse nome.

Você chegou a concluir o tutorial, e rodou o exemplo? Desconfio que não vai rodar de primeira. Você pode ter de ajustar aí o nome do host pra ser o nome do seu computador na rede.

Referência: Socket (Java Platform SE 7 ) , na parte de construtores.

Abraço.

É que essa parte é a do cliente. O servidor mesmo faz isso:

 ServerSocket servidor = new ServerSocket(12345);
      System.out.println("Servidor ouvindo a porta 12345");
      while(true) {
        // o método accept() bloqueia a execução até que
        // o servidor receba um pedido de conexão
        Socket cliente = servidor.accept();
        System.out.println("Cliente conectado: " + cliente.getInetAddress().getHostAddress());
        ObjectOutputStream saida = new ObjectOutputStream(cliente.getOutputStream());
        saida.flush();
        saida.writeObject(new Date());
        saida.close();
        cliente.close();
      }
    }

E o Cliente faz isso:

      Socket cliente = new Socket("paulo",12345);
      ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream());
      Date data_atual = (Date)entrada.readObject();
      JOptionPane.showMessageDialog(null,"Data recebida do servidor:" + data_atual.toString());
      entrada.close();
      System.out.println("Conexão encerrada");

Pelo que entendi, “paulo” era o nome do cliente. Em nenhuma parte o servidor recebeu esse nome. To mt confuso. Parece que ele só usou a porta.

É ao contrário: “paulo” é o nome do servidor (hostname) ao qual o cliente quer se conectar.

Por isso perguntei se você tinha rodado o exemplo. Se seu computador não se chama “paulo”, você vai conseguir rodar o servidor, mas quando rodar o cliente (que deve ser rodado após o servidor já estar rodando), vai obter um erro, pois o cliente não vai achar um servidor com o hostname informado.

No caso, “paulo” está fazendo o papel de endereço do servidor. Você pode entender como se “paulo” fosse o endereço ip, embora no detalhe não seja a mesma coisa. E, se quer rodar o código, precisa ajustá-lo para seu ambiente.

Abraço.

2 curtidas