Ajuda trabalho Socket

6 respostas
sinkz
Entao galera to fazendo um trabalho pra realizar algumas operaçoes e esta dando um erro na logica, to quebrando a cabeça e nao estou achando, comecei a estudar sobre sockets faz pouco tempo entao o erro pode ser pequeno e esta passando despercebido Aqui está o que eu fiz Sevidor:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trabalhodelfino;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;

/**
 *
 * @author 1110108-3
 */
public class Servidor {
    
    public static void main (String [] args) throws Exception {
         
          //Passo 1 - Criar um servidor
        ServerSocket servidor = new ServerSocket(40000);
        
        // Estrutura de repetiçao infinita para o servidor
        while(true){
            //Passo 2 - Aguarda conexoes de Clientes
            
            //Codigo para aceitar conexoes
            Socket conexao = servidor.accept();
            
            // Passo 3 - Criar os Strings de entrada e saida
            DataInputStream entrada = new DataInputStream(conexao.getInputStream());
            DataOutputStream saida = new DataOutputStream(conexao.getOutputStream());
    
            //Passo 4 - Logica
            Double saldo1 = 0.0;
            Double saldo2 = 0.0;
            Double saldo3 = 0.0;
            
       
            
            
            int opcao = entrada.readInt();
            int cod = entrada.readInt();
            
            //Controle de Saldo
            if(opcao == 1 && cod==1){
               String resposta = "Saldo: "+saldo1;
               System.out.println("Saldo \n" + resposta + "\n");
               saida.writeUTF(resposta);
            }
            if(opcao == 1 && cod==2){
                String resposta = "Saldo: "+saldo2;
                saida.writeUTF(resposta);
                
            }
            if(opcao == 1 && cod==3){
                String resposta = "Saldo: "+saldo3;
                saida.writeUTF(resposta);
                
            }
            
            //Controle de Depósito
            
            if(opcao == 2 && cod ==1){
                Double dep = entrada.readDouble();
                saldo1=saldo1+dep;
                String resposta = "Depósito Realizado com Sucesso " +dep+ "\nSaldo Atual: "+saldo1;
                System.out.println("Saldo \n" + resposta + "\n");
                saida.writeUTF(resposta);
                
            }
            
            
            
            
            
             //Passo 5 - fechar os Streams de entrada e saida
            entrada.close();
            saida.close();
            
            //Passo 5 - fechar a conexao
            conexao.close();
            
            
            
}
    }
}
Cliente:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trabalhodelfino;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;

/**
 *
 * @author 1110108-3
 */
public class Cliente {

    public static void main(String[] args) throws Exception {


        // Passo 1 - abrir conexao
        Socket conexao = new Socket("127.0.0.1", 40000);

        // Passo 2 - Criar os Strings de entrada e saida
        DataInputStream entrada = new DataInputStream(conexao.getInputStream());
        DataOutputStream saida = new DataOutputStream(conexao.getOutputStream());

        //Passo 3 - Logica
        int cod = 0;
        Double dep = 0.0;
        Integer opcao = 0;

        while (opcao != 5) {
            opcao = Integer.parseInt(JOptionPane.showInputDialog(""
                    + "1 - Consulta Saldo.\n"
                    + "2 - Depositar.\n"
                    + "3- Sacar IRPF.\n"
                    + "4 - Tranferencias.\n"
                    + "5 - Sair. \n"));

         /*   switch (opcao) {
                case "C":
                    cod = Integer.parseInt(JOptionPane.showInputDialog("Digite o código da conta: "));
                    break;

                case "D":
                    cod = Integer.parseInt(JOptionPane.showInputDialog("Digite o código da conta: "));
                    dep = Double.parseDouble(JOptionPane.showInputDialog("Entre com a quantidade que deseja depositar: "));
                    break;
            }

*/





            if(opcao ==1){
             cod = Integer.parseInt(JOptionPane.showInputDialog("Digite o código da conta: "));
                 
             }
             if(opcao ==2){
             cod = Integer.parseInt(JOptionPane.showInputDialog("Digite o código da conta: "));
             dep = Double.parseDouble(JOptionPane.showInputDialog("Entre com a quantidade que deseja depositar: "));
                 
             }
             
             if(opcao ==3){
             cod = Integer.parseInt(JOptionPane.showInputDialog("Digite o código da conta: "));
                 
             }
             if(opcao ==4){
             cod = Integer.parseInt(JOptionPane.showInputDialog("Digite o código da conta: "));
                 
             }
             if(opcao ==5){
              JOptionPane.showMessageDialog(null, "Fim da execuçao!");  
              break;
                 
             }
             




            saida.writeInt(opcao);
            
            saida.writeInt(cod);
            saida.writeDouble(dep);

            String resposta = entrada.readUTF();
            JOptionPane.showMessageDialog(null, "Cliente " + cod + "\n" + resposta);
          
        }

        //Passo 4 - fechar os Streams de entrada e saida
        entrada.close();
        saida.close();

        //Passo 5 - fechar a conexao
        conexao.close();
    }
}

Eu estava fazendo com case mas decidi mudar pra if, o erro está que está sendo apontado é esse, se alguém puder ajudar agradeço
Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:132)
at java.io.DataOutputStream.writeInt(DataOutputStream.java:198)
at trabalhodelfino.Cliente.main(Cliente.java:86)
Java Result: 1

6 Respostas

gomesrod

Em uma análise rápida vi um problema:
O servidor fica em loop, a cada passagem ele recebe uma conexão do cliente, processa os dados, desconecta e volta ao início.
Já o client conecta e depois entra em loop, fazendo as operaçoes solicitadas pelo usuário reutilizando sempre a mesma conexão.

Repare que eles não estão de acordo: enquanto o client espera que a conexão fica sempre aberta, o servidor fecha a conexão e espera uma nova a cada operação. Isso poderia levar o cliente a tomar um erro quando tentasse enviar um dado por um socket que ele pensa que está aberto, mas na verdade já foi fechado pelo servidor.

Pode ser isso…
Se quiser ter uma visão melhor do que está acontecendo coloque mensagens no System.out cada vez que uma conexão é aberta, fechada, quando o servidor for para accept, etc.

sinkz

Obrigado consegui que as operações sejam feitas, mas ainda tem um erro ele nao está somando o saldo corretamente na hora q eu faço o deposito, vou analisar isso.

sinkz
Agora eu tentei arrumar e volto pro mesmo erro, eu tentei colocar outro while só que agora no servidor pra enquanto a opçao for diferente de 5 ficar no laço dos if ficou assim Servidor:
//Passo 4 - Logica
            Double saldo1 = 0.0;
            Double saldo2 = 0.0;
            Double saldo3 = 0.0;
            
       
            
            
            int opcao = entrada.readInt();
            int cod = entrada.readInt();
            
            //Controle de Saldo
            while(opcao !=5){
            if(opcao == 1 && cod==1){
               String resposta = "Saldo: "+saldo1;
               System.out.println("Saldo \n" + resposta + "\n");
               saida.writeUTF(resposta);
               break;
            }
            if(opcao == 1 && cod==2){
                String resposta = "Saldo: "+saldo2;
                saida.writeUTF(resposta);
                break;
                
            }
            if(opcao == 1 && cod==3){
                String resposta = "Saldo: "+saldo3;
                saida.writeUTF(resposta);
                break;
                
            }
            
            //Controle de Depósito
            Double dep = entrada.readDouble();
            if(opcao == 2 && cod ==1){
                
                saldo1=saldo1+dep;
                String resposta = "Depósito Realizado com Sucesso " +dep+ "\nSaldo Atual: "+saldo1;
                System.out.println("Saldo \n" + resposta + "\n");
                saida.writeUTF(resposta);
                break;
                
            }
            
            }
Eu tirei o while(true) do começo e continuou dando o mesmo erro.
gomesrod

Se deu aquele erro no write então as duas partes estão sem o devido sincronismo, alguém está tentando mandar um dado quando o outro lado já desconectou.

Tem uma coisa que você deveria fazer para entender bem o que está acontecendo. Coloque mensagens de debug nos seus programas.

Pode começar criando um método assim (estou fazendo no cliente para mostrar, mas você faz nos dois).

imprimirLogCliente(String mensagem) { System.out.println(" __________ CLIENT: " + mensagem); }
E chame esse método em todos os pontos importantes (onde ocorre algum evento de rede, conexão, desconexão, envio, recebimento).

// Passo 1 - abrir conexao  
        imprimirLogCliente("Abrindo a conexao");
        Socket conexao = new Socket("127.0.0.1", 40000);  

...
...

imprimirLogCliente("Enviando OPCAO");
saida.writeInt(opcao);  

...
...
            imprimirLogCliente("Enviando COD");                  
            saida.writeInt(cod);  
            imprimirLogCliente("Enviando DEP");                  
            saida.writeDouble(dep);  
  
            imprimirLogCliente("Lendo RESPOSTA");                  
            String resposta = entrada.readUTF();  

...
...

//Passo 5 - fechar a conexao  
       imprimirLogCliente("Fechando conexao");                  
        conexao.close();

Desse jeito você pode colocar cada programa em uma janela e ir acompanhando o que cada um está fazendo… vai identificar facilmente quando eles não estiverem fazendo a mesma coisa.


OBS:
Se fosse em um programa para uso real, seria necessário criar um protocolo de comunicação para evitar esse tipo de falha. Nesse caso é um exercício, não precisa de tanta sofisticação, mas é só para que você fique ciente.

sinkz

Me desculpe a ignorancia, mas estou tentando criar esse metodo e nao está dando certo, bem criei o metodo mas quando vou usar ele aparece uma mensagem de erro:
non-static method imprimirLogCliente(String) cannot be referenced from a static context.

sinkz

Ja consegui aqui, esqueci de dar um new kkk desculpe e obrigado pelas dicas

Criado 19 de abril de 2013
Ultima resposta 19 de abr. de 2013
Respostas 6
Participantes 2