Primeiro meu código... minha dúvida está logo abaixo.
packagetrabalho1.cliente;importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.Socket;importjava.net.UnknownHostException;importtrabalho1.modelo.*;publicclassCliente03{publicstaticvoidmain(String[]args)throwsIOException{/* ---declaracao dos objetos utilizados--- */finalintportaDefault=8000;// Definicao da porta defaultfinalStringhostDefault="127.0.0.3";// Definicao do host defaultStringnomeHost=hostDefault;// Nome do host para conexaointporta=portaDefault;// Porta para conexaoSocketSocketCliente=null;// Declaracao de objeto da classe SocketDataOutputStreamIndoParaServidor=null;BufferedReaderVindoDoServidor=null;BufferedReaderteclado=null;StringrespostaServidor=null;Ex03ex3=newEx03();Alunoa=newAluno();/* ---tratamento dos argumentos--- */if((args.length==0)||(args.length==1)||(args.length==2)){if(args.length==0){// Sem parametros usa os defaultsnomeHost=hostDefault;porta=portaDefault;}if(args.length==1){// Se fornecido apena 1 parametro, considera// HostnomeHost=args[0];// Host e' 1o. parametroporta=portaDefault;// Usa porta default}if(args.length==2){// Se fornecido dois parametros, consideranomeHost=args[0];// Host e' 1o. parametroporta=Integer.parseInt(args[1]);// Porta e o 2o. paramentro}}else{// Fornecimento erroneo dos argumentosSystem.out.println("\n\nUso Correto: Cliente01 [NomeDoHost] [porta]\n\n");}try{SocketCliente=newSocket(nomeHost,porta);VindoDoServidor=newBufferedReader(newInputStreamReader(SocketCliente.getInputStream()));IndoParaServidor=newDataOutputStream(SocketCliente.getOutputStream());}// Fim trycatch(UnknownHostExceptione){System.err.println("\n\nHost nao encontrado!\n");System.out.println("\nUso: Cliente01 NomeDoHost mensagem [porta]\n\n");System.exit(1);}catch(java.io.IOExceptione){System.err.println("\n\nConexao com Host nao pode ser estabelecida.\n");System.out.println("\nUso: Cliente01 NomeDoHost mensagem [porta]\n\n");System.exit(1);}teclado=newBufferedReader(newInputStreamReader(System.in));ex3.setCliente(3);System.out.println("Digite o nome do Aluno: ");a.setNome(teclado.readLine());System.out.println("Digite a nota1: ");a.setNota1(Double.parseDouble(teclado.readLine()));System.out.println("Digite a nota2: ");a.setNota2(Double.parseDouble(teclado.readLine()));// Prepara mensagem para ser enviadaSystem.out.println("Mensagem: "+ex3.montaMensagemCliente(a));// Envia a mensagema para o servidorIndoParaServidor.writeBytes(ex3.getMensagemCliente());// Recebe resposta do servidorrespostaServidor=VindoDoServidor.readLine();ex3.desmembraMensagemServidor(respostaServidor);System.out.println("respostaServidor: "+ex3.getMensagemServidor());if(ex3.getResposta().equalsIgnoreCase("aluno precisa da nota3!")){System.out.println("Nome: "+a.getNome());System.out.println("Nota1: "+a.getNota1());System.out.println("Nota2: "+a.getNota2());System.out.println("Média Inicial: "+a.getMediaInicial());System.out.println("Resposta: "+ex3.getResposta());System.out.println("Informe a nota3: ");a.setNota3(Double.parseDouble(teclado.readLine()));System.out.println("Mensagem: "+ex3.montaMensagemCliente(a));IndoParaServidor.flush();IndoParaServidor.writeBytes(ex3.getMensagemCliente());// ele para aquirespostaServidor=VindoDoServidor.readLine();ex3.desmembraMensagemServidor(respostaServidor);System.out.println("respostaServidor: "+ex3.getMensagemServidor());}else{System.out.println("Nome: "+a.getNome());System.out.println("Nota1: "+a.getNota1());System.out.println("Nota2: "+a.getNota2());System.out.println("Nota3: "+a.getNota3());System.out.println("Média Inicial: "+a.getMediaInicial());System.out.println("Média Final: "+a.getMediaFinal());System.out.println("Resposta: "+ex3.getResposta());SocketCliente.close();}}// Fim public static void main}// Fim public class Cliente
O problema é o seguinte: na primeira etapa (nota1 e nota2) funciona normalmente. Mas quando necessita informar a nota3, ele para (não dispára nehuma exception) nesta linha IndoParaServidor.writeBytes(ex3.getMensagemCliente()); // ele para aqui do bloco if.
A mensagem do comando acima não chega até o servidor(eu verifiquei).
O que tá faltando?
[color=blue]A solução foi instanciar um novo Socket e estabelecer novos fluxos de entrada e saída antes do novo envio de dados ao servidor.[/color]
esta retornando o esperado ? faça um println desse cara antes de mandar pro servidor…
J
javabegin
Esse método tá redundante, porque simplesmente retorna a mensagem montada pelo ex3.montaMensagemCliente().
Eu fiz o teste que sugerido… tá imprimindo o esperado.
Acho que o problema tem relação com o fato de ser o segundo envio de mensagem ao servidor, pois no primeiro envio sai tudo certo.
peczenyj
ele para exatamente nessa linha ? não para depois, como se o servidor não estivesse respondendo ?
sem ver os outros códigos fica dificil ajudar…
J
javabegin
Acho que é como se o servidor não tivesse respondendo.
Aí vai o restante do código:
O Servidor:
packagetrabalho1.servidor;//Documentacao da API em http://java.sun.com/j2se/1.4.2/docs/api/importtrabalho1.modelo.*;importjava.io.*;importjava.net.*;//import java.util.*;classTCPServer{publicstaticvoidmain(Stringargv[])throwsException{finalintportaDefault=8000;// Definicao da porta defaultfinalStringseparador="&";// Token que ira separa os campos// da mensagem enviada ao servidorintporta=portaDefault;// Porta para conexaoBufferedReaderVindoDoCliente=null;DataOutputStreamIndoParaCliente=null;StringmensagemCliente=null;// Mensagem recebida do clienteStringrespostaCliente=null;// Mensagem enviada ao clienteStringNome=null;intopcao;ServerSocketSocketServidor=newServerSocket(porta);while(true){System.out.println("Aguardando Solicitações na porta "+porta);SocketSocketConexao=SocketServidor.accept();System.out.println("Conectou pela maquina "+SocketConexao.getInetAddress().getHostAddress());VindoDoCliente=newBufferedReader(newInputStreamReader(SocketConexao.getInputStream()));IndoParaCliente=newDataOutputStream(SocketConexao.getOutputStream());// Recebe mensagem do clienteSystem.out.println("entrou ");mensagemCliente=VindoDoCliente.readLine();System.out.println("mensagemCliente: "+mensagemCliente);// Separa campos da mensagem do clienteString[]arrayMensagemCliente=mensagemCliente.split(separador);opcao=Integer.parseInt(arrayMensagemCliente[0]);switch(opcao){case1:Ex01ex1=newEx01();Funcionariof=newFuncionario();ex1.desmembraMensagemCliente(mensagemCliente);f=ex1.getFuncionario();System.out.println("Cliente: "+ex1.getCliente());System.out.println("Nome: "+f.getNome());System.out.println("Cargo: "+f.getCargo());System.out.println("Salario: "+f.getSalarioBruto());// processamentoex1.processa();System.out.println("Novo salario: "+ex1.getSalarioReajustado());// Monta e envia mensagem ao clienteIndoParaCliente.writeBytes(ex1.montaMensagemServidor());break;case2:Ex02ex2=newEx02();Pessoap=newPessoa();ex2.desmembraMensagemCliente(mensagemCliente);p=ex2.getPessoa();System.out.println("Cliente: "+ex2.getCliente());System.out.println("Nome: "+p.getNome());System.out.println("sexo: "+p.getSexo());System.out.println("Idade: "+p.getIdade());// processamentoex2.processa();// Monta e envia mensagem ao clienteIndoParaCliente.writeBytes(ex2.montaMensagemServidor());break;case3:Alunoa=newAluno();Ex03ex3=newEx03();ex3.desmembraMensagemCliente(mensagemCliente);a=ex3.getAluno();System.out.println("Cliente: "+ex3.getCliente());System.out.println("Nome: "+a.getNome());System.out.println("Nota1: "+a.getNota1());System.out.println("Nota2: "+a.getNota2());System.out.println("Nota3: "+a.getNota3());// processamentoex3.processa();// Monta e envia mensagem ao clienteIndoParaCliente.writeBytes(ex3.montaMensagemServidor());break;case4:Ex04ex4=newEx04();//Pessoa p = new Pessoa();ex4.desmembraMensagemCliente(mensagemCliente);p=ex4.getPessoa();System.out.println("Cliente: "+ex4.getCliente());System.out.println("Nome: "+p.getNome());System.out.println("sexo: "+p.getSexo());System.out.println("Altura: "+p.getAltura());// processamentoex4.processa();// Monta e envia mensagem ao clienteIndoParaCliente.writeBytes(ex4.montaMensagemServidor());break;case5:Ex05ex5=newEx05();Nadadorn=newNadador();ex5.desmembraMensagemCliente(mensagemCliente);n=ex5.getNadador();System.out.println("Cliente: "+Ex05.cliente);System.out.println("Nome: "+n.getNome());System.out.println("Idade: "+n.getIdade());// processamentoex5.processa();// Monta e envia mensagem ao clienteIndoParaCliente.writeBytes(ex5.montaMensagemServidor());break;case6:Ex06ex6=newEx06();ex6.desmembraMensagemCliente(mensagemCliente);f=ex6.getFuncionario();System.out.println("Cliente: "+Ex06.cliente);System.out.println("Nome: "+f.getNome());System.out.println("Nível: "+f.getNivel());System.out.println("Salário Bruto: "+f.getSalarioBruto());System.out.println("Qtd. Dependentes: "+f.getDependentes());// processamentoex6.processa();// Monta e envia mensagem ao clienteIndoParaCliente.writeBytes(ex6.montaMensagemServidor());break;default:break;}// Fecha Conexao// SocketConexao.close(); // Fecha o socket}// Fim while(true)}// Fim main}
A classe Ex03
packagetrabalho1.modelo;publicclassEx03{privateAlunoaluno;privateStringmensagemCliente,mensagemServidor,resposta;privateintcliente;publicEx03(){this.aluno=newAluno();// TODO Auto-generated constructor stub}publicAlunogetAluno(){returnaluno;}publicvoidsetAluno(Alunoaluno){this.aluno=aluno;}publicintgetCliente(){returncliente;}publicvoidsetCliente(intcliente){this.cliente=cliente;}publicStringgetMensagemCliente(){returnmensagemCliente;}publicvoidsetMensagemCliente(StringmensagemCliente){this.mensagemCliente=mensagemCliente;}publicStringgetMensagemServidor(){returnmensagemServidor;}publicvoidsetMensagemServidor(StringmensagemServidor){this.mensagemServidor=mensagemServidor;}publicStringgetResposta(){returnresposta;}publicvoidsetResposta(Stringresposta){this.resposta=resposta;}publicStringmontaMensagemCliente(Alunoa){setAluno(a);StringBufferstrb=newStringBuffer();strb.append(this.cliente).append("&").append(a.getNome()).append("&").append(a.getNota1()).append("&").append(a.getNota2()).append("&").append(a.getNota3()).append("\n");setMensagemCliente(strb.toString());returnthis.mensagemCliente;}publicvoiddesmembraMensagemCliente(Stringstr){String[]arraystr=str.split("&");setCliente(Integer.parseInt(arraystr[0]));aluno.setNome(arraystr[1]);aluno.setNota1(Double.parseDouble(arraystr[2]));aluno.setNota2(Double.parseDouble(arraystr[3]));aluno.setNota3(Double.parseDouble(arraystr[4]));}publicStringmontaMensagemServidor(){StringBufferstrb=newStringBuffer();strb.append(aluno.getNome()).append("&").append(aluno.getNota1()).append("&").append(aluno.getNota2()).append("&").append(aluno.getNota3()).append("&").append(aluno.getMediaInicial()).append("&").append(aluno.getMediaFinal()).append("&").append(resposta).append("\n");setMensagemServidor(strb.toString());returnthis.mensagemServidor;}publicvoiddesmembraMensagemServidor(Stringstr){setMensagemServidor(str);String[]arraystr=str.split("&");aluno.setNome(arraystr[0]);aluno.setNota1(Double.parseDouble(arraystr[1]));aluno.setNota2(Double.parseDouble(arraystr[2]));aluno.setNota3(Double.parseDouble(arraystr[3]));aluno.setMediaInicial(Double.parseDouble(arraystr[4]));aluno.setMediaFinal(Double.parseDouble(arraystr[5]));setResposta(arraystr[6]);}publicvoidprocessa(){aluno.setMediaInicial(aluno.calculaMedia(aluno.getNota1(),aluno.getNota2()));aluno.setMediaFinal(aluno.calculaMedia(aluno.getMediaInicial(),aluno.getNota3()));if(aluno.fazerN3())setResposta("ALUNO PRECISA DA NOTA3!");elseif(aluno.aprovado())setResposta("ALUNO APROVADO!");elsesetResposta("ALUNO REPROVADO!");}}
J
javabegin
Faltaram algumas classes... aí vai
Classe Funcionario:
packagetrabalho1.modelo;importjava.io.Serializable;publicclassFuncionarioextendsPessoa{privateStringcargo,nivel;privatedoublesalarioBruto,salarioLiquido;privateintdependentes,tempoServico;//private static final double[] taxasDesconto= {0.03, 0.05, 0.08, 0.1, 0.15, 0.17}; publicFuncionario(){// TODO Auto-generated constructor stub}publicintgetDependentes(){returndependentes;}publicvoidsetDependentes(intdependentes){this.dependentes=dependentes;}publicStringgetNivel(){returnnivel;}publicvoidsetNivel(Stringnivel){this.nivel=nivel;}publicdoublegetSalarioLiquido(){returnsalarioLiquido;}publicvoidsetSalarioLiquido(doublesalarioLiquido){this.salarioLiquido=salarioLiquido;}publicStringgetCargo(){returncargo;}publicvoidsetCargo(Stringcargo){this.cargo=cargo;}publicdoublegetSalarioBruto(){returnsalarioBruto;}publicvoidsetSalarioBruto(doublesalario){this.salarioBruto=salario;}publicdoublereajuste(doublesalario){doublereajuste=0.0;if(this.cargo.equalsIgnoreCase("operador"))reajuste=this.salarioBruto*0.20;if(cargo.equalsIgnoreCase("programador"))reajuste=this.salarioBruto*0.18;returnreajuste;}publicvoidcalculaSalLiquido(Stringnivel,intdependentes){if(nivel.equalsIgnoreCase("a"))if(dependentes>0)setSalarioLiquido(this.salarioBruto*(1-0.08));elsesetSalarioLiquido(this.salarioBruto*(1-0.03));if(nivel.equalsIgnoreCase("b"))if(dependentes>0)setSalarioLiquido(this.salarioBruto*(1-0.1));elsesetSalarioLiquido(this.salarioBruto*(1-0.05));if(nivel.equalsIgnoreCase("c"))if(dependentes>0)setSalarioLiquido(this.salarioBruto*(1-0.15));elsesetSalarioLiquido(this.salarioBruto*(1-0.08));if(nivel.equalsIgnoreCase("d"))if(dependentes>0)setSalarioLiquido(this.salarioBruto*(1-0.17));elsesetSalarioLiquido(this.salarioBruto*(1-0.1));}publicintgetTempoServico(){returntempoServico;}publicvoidsetTempoServico(inttempoServico){this.tempoServico=tempoServico;}publicbooleanpodeAposentar(intidade,inttempoServico){if(idade>=65&&tempoServico>=30)returntrue;elseif(idade>=60&&tempoServico>=25)returntrue;returnfalse;}}
Classe Pessoa:
packagetrabalho1.modelo;importjava.io.Serializable;importjava.text.DecimalFormat;importjava.text.NumberFormat;importjava.util.Locale;publicclassPessoaimplementsSerializable{protectedStringnome,sexo;privateintidade;privatedoublealtura,peso;privatestaticfinallongserialVersionUID=7226571155622776137L;publicPessoa(){super();// TODO Auto-generated constructor stub}publicPessoa(Stringnome){super();// TODO Auto-generated constructor stubthis.nome=nome;}publicPessoa(Stringnome,Stringsexo,intidade,doublealtura,doublepeso){super();// TODO Auto-generated constructor stubthis.nome=nome;this.sexo=sexo;this.idade=idade;this.altura=altura;this.peso=peso;}publicdoublegetAltura(){returnaltura;}publicvoidsetAltura(doublealtura){this.altura=altura;}publicintgetIdade(){returnidade;}publicvoidsetIdade(intidade){this.idade=idade;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicdoublegetPeso(){returnpeso;}publicvoidsetPeso(doublepeso){this.peso=peso;}publicStringgetSexo(){returnsexo;}publicvoidsetSexo(Stringsexo){this.sexo=sexo;}publicbooleanmaioridade(Stringsexo,intidade){if(sexo.equalsIgnoreCase("masculino")||sexo.equalsIgnoreCase("m"))if(idade>17)returntrue;if(sexo.equalsIgnoreCase("feminino")||sexo.equalsIgnoreCase("f"))if(idade>20)returntrue;returnfalse;}publicdoublepesoIdeal(doublealtura,Stringsexo){doublepesoIdeal=0.0;NumberFormatnf=NumberFormat.getInstance(Locale.ENGLISH);nf.setMaximumFractionDigits(2);if(sexo.equalsIgnoreCase("masculino"))pesoIdeal=Double.parseDouble(nf.format((72.7*altura)-58));if(sexo.equalsIgnoreCase("feminino"))pesoIdeal=Double.parseDouble(nf.format((62.1*altura)-44.7));returnpesoIdeal;}}