Sockets, quero enviar uma msg para vários ips

10 respostas
cintiarsbr

Olá Pessoal

estou fazendo um trabalho com sockets em Java, onde eu preciso enviar a mesma msg para várias máquinas, mas não estou conseguindo, por favor alguém pode dar uma olhada no meu código, e me dar um help. Eu fiz o seguinte criei um Client e um Server, o Client envia a msg e os servers ficam aguardando, por enquanto estou testando só na minha máquina. Entõa no client existe um vetor de ips, onde existem 5 ips cadastrados, e o client inicia enviando a msg para o primeiro ip do vetor, daí ele fica em um while, até terminar de enviar para tds os ips. E o server tb fica em um while que só termina qdo zerar o contador dele. Segue os código do Client e do Server:
obs: tirei algumas partes do client que no momento não são necessárias, como a criação da var “envia” que esta funcionando direitinho.

Client*********

int k = 0;
            String x = null;
            int d=0;
                        
            //enviar a msg enquanto o contador de ips for diferente de zero
            while(contIps!=0){
                        
            //conecta na primeira máquina, porta 80
            Socket client = new Socket(ips[d], 80);
            d++;
                        //cria canal de comunicacao para receber dados
            DataInputStream in = new DataInputStream(client.getInputStream());
            
            //cria canal para enviar dados
            DataOutputStream out = new DataOutputStream(client.getOutputStream());
            
            //envia o inteiro 3
            out.writeInt(3);
            //envia string
            out.writeUTF(envia);
            
            //agurada o recebimento de um inteiro
            k = in.readInt();
            //aguarda o recebimento de uma String
            x = in.readUTF();
            
            //System.out.println("Recebeu inteiro:" + k);
            //System.out.println("Recebeu string:" + s);
            
            //fecha os canais de entrada e saída
            in.close();
            out.close();
            
            //fecha socket
            client.close();
            contIps--;
           
            }
            
        }catch (Exception e) {
            e.printStackTrace();
        }
        
        
    }

Fim do client*****
erro que ocorre no client qdo executo, sendo que ele envia a msg na primeira vez e na segunda ele dá o erro:

java.io.EOFException

at java.io.DataInputStream.readInt(DataInputStream.java:358)

at Client.main(Client.java:234)

Server**********

try{
            
            int cont=0;
            
            while(cont!=5){
            
            ServerSocket serverSocket = new ServerSocket(80);
            
            Socket socket = serverSocket.accept();
            
            DataInputStream in = new DataInputStream(socket.getInputStream());
            
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            
            int k = in.readInt();
            
            String x = in.readUTF();
            
            out.writeInt(3);
            
            out.writeUTF("Server");
            
            System.out.println("Rcebeu " + x);
            
            in.close();
            
            out.close();
            
            socket.close();
            
            cont++;
            
            }
            
            
        }catch (UnknownHostException e) {
            System.err.println("Nao conseguiu achar o server ");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Nao conseguiu abrir a conexao com o server ");
            System.exit(1);
            
            
        }
        
        
        
    }

******Fim do server

Se alguém conseguir me ajudar, desde já agradeço!!! :slight_smile: :slight_smile:

10 Respostas

ViniGodoy

Por favor, você pode editar o seu post seguindo estas dicas? Sem identação fica realmente dar uma olhada no seu código…

cintiarsbr

Oi, valeu pela tua dica, acho que agora ficou melhor, talvez não 100%, mas bem melhor que antes… será que agora alguém me ´da uma ajudinha…

ViniGodoy

O correto não seria o server ter a lista de ips?

Na verdade, guarde o socket de cada cliente que se conecta no servidor numa lista. Depois, quando um cliente enviar uma mensagem, o server pode recebe-la e distribuir novamente para todos os clientes na lista.

Isto é, se a idéia é fazer um chat.

cintiarsbr

É que na verdade o meu programa é para funcionar assim:
cada máquina vai ter que enviar e receber mensagens, a idéia não é fazer um chat, mas por exemplo, existe a máquina 1, máquina 2, máquina 3 e máquina 4. A máquina 1 tem que enviar a mesma msg para todas as máquinas, tem como fazer isso?? Uma máquina enviar a mesma msg ao mesmo tempo para todas as máquinas??? :slight_smile: :?:

ViniGodoy

Então, se elas se conectam a um server, o ideal é ela enviar para o server e o server propagar para todas as máquinas. Daí é só fazer como eu descrevi.

Você cria uma lista de todos os clientes no server e, quando um cliente mandar qualquer mensagem, você faz o server redistribuir para todos os outros clientes (um for each percorrendo a lista de sockets e uma chamada a um método de escrita em cada um deles deve resolver).

Outra possibilidade é você usar um DatagramSocket e mandar mensagens num endereço de broadcast/multicast. Todas as máquinas com um socket desses também escutando no endereço de broadcast vão ouvir a mensagem.

cintiarsbr

Te entendi, pelo menos eu acho… Não seria mais ou menos assim:
Deixo o server rodando em uma áquina esperando as msg de por exemplo + 5 máquinas que estarão rodando o meu client. Então o client1 inicia mandando msg para todas as outras 4 máquinas, daí o server recebe a msg do client1 e passa para as outras 4 máquinas, sendo que essas outras 4 máquinas iniciam no estado de esperando msg do Server, e o client1 inicia enviando msg. Daí eu entendo que não seria necessário ter uma listagem de ips, e sim cada máquina conecta no ip do server automaticamente?

Vc entendeu??? eu não sou mt boa para explicações, rsrsrsrs, :wink:

ViniGodoy

Isso.

Você deixa um server rodando. Cada cliente que rodar, se conecta no server.

Esse server, faz uma lista de cada cliente conectado.

Quando um cliente manda uma msg pro server, o server reproduz a mensagem e redistribui para todos os clientes.

cintiarsbr

OI Vini

Quero te agradecer a tua idéia, agora o meu trabalho tá saindo, e tô muito feliz que tá funcionando. O único sofrimento que tive foi que no código que eu postei aqui não posso conectar vários clients no mesmo server, então dei uma pesquisada e descobri que teria que utilizar threads. E agora tá funcionando!!!

Valeu!!! :slight_smile: :smiley: :wink:

ViniGodoy

Isso mesmo, uma thread para cada cliente.
Parabéns, viu! Muito bom que esteja funcionando!

Qualquer dúvida, pode perguntar! :wink:

L

Certo… mas isso seria unicast, tem como faze multicast ou broadcast?
que nem o cintiarsbr falo… um servidor manda uma msg pra todos os clientes…

como se tivesse numa rede, e mandasse uma msg pro ip x.x.x.255 pra faze broadcast…

vlww

Criado 1 de junho de 2007
Ultima resposta 18 de jun. de 2007
Respostas 10
Participantes 3