TransWikia.com

Socket entre 2 dispositivos

Stack Overflow em Português Asked by Beto on December 18, 2020

Gostaria de enviar dados entre maquinas diferentes, entre 2 computadores, entre um computador e um Android por exemplo.

Fiz o exemplo internamente, no mesmo computador, mas quando separo (o servidor fica em um computador e o cliente vai para outro. Não dá certo).

Servidor:

public static void main(String[] args) {
        try {
            // Instancia o ServerSocket ouvindo a porta 12345
            ServerSocket servidor = new ServerSocket(12345);
            System.out.println("Servidor ouvindo a porta 12345");
           // servidor.bind(new InetSocketAddress("192.168.5.1", 0));

            InetAddress inet = servidor.getInetAddress();
            System.out.println("HostAddress="+inet.getHostAddress());
            System.out.println("HostName="+inet.getHostName());
            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();
            }  
        }   
        catch(Exception e) {
            System.out.println("Erro: " + e.getMessage());
        }
    }

Cliente:

public static void main(String[] args) {
        try {
             Socket cliente = new Socket("0.0.0.0",12345);
            InetAddress inet = cliente.getInetAddress();
            System.out.println("HostAddress="+inet.getHostAddress());
            System.out.println("HostName="+inet.getHostName());
            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");
        }
        catch(Exception e) {
          System.out.println("Erro: " + e.getMessage());
        }
    }

O estranho é que a saída do servidor é:

Servidor ouvindo a porta 12345
HostAddress=0.0.0.0
HostName=0.0.0.0

Aí quando tento colocar o cliente em outro computador não dá certo, mesmo inserindo (no cliente) o IP em que o servidor está.

Obs.: As máquinas estão em redes diferentes.

Obs².: Fiz teste mesmo com o firewall do Windows desativado e não deu certo.

2 Answers

Sobre o output do servidor:

O output está correto, como você não especificou qual IP era pra dar bind, ele deu bind em todos da interface de rede.

Sobre o código:

Socket cliente = new Socket("0.0.0.0",12345);

Eu apenas alterei o "0.0.0.0" para o IP do meu servidor remoto e o código funcionou corretamente. Você deve estar com algum bloqueio de firewall.

Answered by Foreign on December 18, 2020

No cliente você precisa passar o endereço IP ou hostname do servidor.

Socket cliente = new Socket("0.0.0.0",12345);  // <<< errado

Não conheço Java, mas a linha acima deveria ser

Socket cliente = new Socket("127.0.0.1",12345);  // <<< mesma máquina

ou

Socket cliente = new Socket("10.172.36.130",12345);  // <<< outra máquina

onde "10.172.36.130" é só um exemplo, você precisa substituir pelo IP (ou nome) da máquina onde seu servidor está rodando.

Answered by zentrunix on December 18, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP