Primeiro meu código… minha dúvida está logo abaixo.
[code]package trabalho1.cliente;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import trabalho1.modelo.*;
public class Cliente03 {
public static void main(String[] args) throws IOException {
/* ---declaracao dos objetos utilizados--- */
final int portaDefault = 8000; // Definicao da porta default
final String hostDefault = "127.0.0.3"; // Definicao do host default
String nomeHost = hostDefault; // Nome do host para conexao
int porta = portaDefault; // Porta para conexao
Socket SocketCliente = null; // Declaracao de objeto da classe Socket
DataOutputStream IndoParaServidor = null;
BufferedReader VindoDoServidor = null;
BufferedReader teclado = null;
String respostaServidor = null;
Ex03 ex3 = new Ex03();
Aluno a = new Aluno();
/* ---tratamento dos argumentos--- */
if ((args.length == 0) || (args.length == 1) || (args.length == 2)) {
if (args.length == 0) { // Sem parametros usa os defaults
nomeHost = hostDefault;
porta = portaDefault;
}
if (args.length == 1) { // Se fornecido apena 1 parametro, considera
// Host
nomeHost = args[0]; // Host e' 1o. parametro
porta = portaDefault; // Usa porta default
}
if (args.length == 2) { // Se fornecido dois parametros, considera
nomeHost = args[0]; // Host e' 1o. parametro
porta = Integer.parseInt(args[1]); // Porta e o 2o. paramentro
}
} else { // Fornecimento erroneo dos argumentos
System.out
.println("\n\nUso Correto: Cliente01 [NomeDoHost] [porta]\n\n");
}
try {
SocketCliente = new Socket(nomeHost, porta);
VindoDoServidor = new BufferedReader(new InputStreamReader(
SocketCliente.getInputStream()));
IndoParaServidor = new DataOutputStream(SocketCliente
.getOutputStream());
} // Fim try
catch (UnknownHostException e) {
System.err.println("\n\nHost nao encontrado!\n");
System.out
.println("\nUso: Cliente01 NomeDoHost mensagem [porta]\n\n");
System.exit(1);
} catch (java.io.IOException e) {
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 = new BufferedReader(new InputStreamReader(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 enviada
System.out.println("Mensagem: " + ex3.montaMensagemCliente(a));
// Envia a mensagema para o servidor
IndoParaServidor.writeBytes(ex3.getMensagemCliente());
// Recebe resposta do servidor
respostaServidor = 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 aqui
respostaServidor = 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[/code]
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]
E o que faz ‘ex3.getMensagemCliente()’ ?
esta retornando o esperado ? faça um println desse cara antes de mandar pro servidor…
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.
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…
Acho que é como se o servidor não tivesse respondendo.
Aí vai o restante do código:
O Servidor:
[code]package trabalho1.servidor;
//Documentacao da API em http://java.sun.com/j2se/1.4.2/docs/api/
import trabalho1.modelo.;
import java.io.;
import java.net.*;
//import java.util.*;
class TCPServer {
public static void main(String argv[]) throws Exception {
final int portaDefault = 8000; // Definicao da porta default
final String separador = “&”; // Token que ira separa os campos
// da mensagem enviada ao servidor
int porta = portaDefault; // Porta para conexao
BufferedReader VindoDoCliente = null;
DataOutputStream IndoParaCliente = null;
String mensagemCliente = null; // Mensagem recebida do cliente
String respostaCliente = null; // Mensagem enviada ao cliente
String Nome = null;
int opcao;
ServerSocket SocketServidor = new ServerSocket(porta);
while (true) {
System.out.println("Aguardando Solicitações na porta " + porta);
Socket SocketConexao = SocketServidor.accept();
System.out.println("Conectou pela maquina "
+ SocketConexao.getInetAddress().getHostAddress());
VindoDoCliente = new BufferedReader(new InputStreamReader(
SocketConexao.getInputStream()));
IndoParaCliente = new DataOutputStream(SocketConexao
.getOutputStream());
// Recebe mensagem do cliente
System.out.println("entrou ");
mensagemCliente = VindoDoCliente.readLine();
System.out.println("mensagemCliente: " + mensagemCliente);
// Separa campos da mensagem do cliente
String[] arrayMensagemCliente = mensagemCliente.split(separador);
opcao = Integer.parseInt(arrayMensagemCliente[0]);
switch (opcao) {
case 1:
Ex01 ex1 = new Ex01();
Funcionario f = new Funcionario();
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());
// processamento
ex1.processa();
System.out.println("Novo salario: "
+ ex1.getSalarioReajustado());
// Monta e envia mensagem ao cliente
IndoParaCliente.writeBytes(ex1.montaMensagemServidor());
break;
case 2:
Ex02 ex2 = new Ex02();
Pessoa p = new Pessoa();
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());
// processamento
ex2.processa();
// Monta e envia mensagem ao cliente
IndoParaCliente.writeBytes(ex2.montaMensagemServidor());
break;
case 3:
Aluno a = new Aluno();
Ex03 ex3 = new Ex03();
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());
// processamento
ex3.processa();
// Monta e envia mensagem ao cliente
IndoParaCliente.writeBytes(ex3.montaMensagemServidor());
break;
case 4:
Ex04 ex4 = new Ex04();
//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());
// processamento
ex4.processa();
// Monta e envia mensagem ao cliente
IndoParaCliente.writeBytes(ex4.montaMensagemServidor());
break;
case 5:
Ex05 ex5 = new Ex05();
Nadador n = new Nadador();
ex5.desmembraMensagemCliente(mensagemCliente);
n = ex5.getNadador();
System.out.println("Cliente: " + Ex05.cliente);
System.out.println("Nome: " + n.getNome());
System.out.println("Idade: " + n.getIdade());
// processamento
ex5.processa();
// Monta e envia mensagem ao cliente
IndoParaCliente.writeBytes(ex5.montaMensagemServidor());
break;
case 6:
Ex06 ex6 = new Ex06();
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());
// processamento
ex6.processa();
// Monta e envia mensagem ao cliente
IndoParaCliente.writeBytes(ex6.montaMensagemServidor());
break;
default:
break;
}
// Fecha Conexao
// SocketConexao.close(); // Fecha o socket
} // Fim while(true)
} // Fim main
}
[/code]
A classe Ex03
[code]package trabalho1.modelo;
public class Ex03 {
private Aluno aluno;
private String mensagemCliente, mensagemServidor, resposta;
private int cliente;
public Ex03() {
this.aluno = new Aluno();
// TODO Auto-generated constructor stub
}
public Aluno getAluno() {
return aluno;
}
public void setAluno(Aluno aluno) {
this.aluno = aluno;
}
public int getCliente() {
return cliente;
}
public void setCliente(int cliente) {
this.cliente = cliente;
}
public String getMensagemCliente() {
return mensagemCliente;
}
public void setMensagemCliente(String mensagemCliente) {
this.mensagemCliente = mensagemCliente;
}
public String getMensagemServidor() {
return mensagemServidor;
}
public void setMensagemServidor(String mensagemServidor) {
this.mensagemServidor = mensagemServidor;
}
public String getResposta() {
return resposta;
}
public void setResposta(String resposta) {
this.resposta = resposta;
}
public String montaMensagemCliente(Aluno a) {
setAluno(a);
StringBuffer strb = new StringBuffer();
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());
return this.mensagemCliente;
}
public void desmembraMensagemCliente(String str) {
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]));
}
public String montaMensagemServidor() {
StringBuffer strb = new StringBuffer();
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());
return this.mensagemServidor;
}
public void desmembraMensagemServidor(String str) {
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]);
}
public void processa() {
aluno.setMediaInicial(aluno.calculaMedia(aluno.getNota1(), aluno
.getNota2()));
aluno.setMediaFinal(aluno.calculaMedia(aluno.getMediaInicial(), aluno
.getNota3()));
if (aluno.fazerN3())
setResposta("ALUNO PRECISA DA NOTA3!");
else if (aluno.aprovado())
setResposta("ALUNO APROVADO!");
else
setResposta("ALUNO REPROVADO!");
}
}
[/code]
Faltaram algumas classes… aí vai
Classe Funcionario:
[code]package trabalho1.modelo;
import java.io.Serializable;
public class Funcionario extends Pessoa {
private String cargo, nivel;
private double salarioBruto, salarioLiquido;
private int dependentes, tempoServico;
//private static final double[] taxasDesconto= {0.03, 0.05, 0.08, 0.1, 0.15, 0.17};
public Funcionario() {
// TODO Auto-generated constructor stub
}
public int getDependentes() {
return dependentes;
}
public void setDependentes(int dependentes) {
this.dependentes = dependentes;
}
public String getNivel() {
return nivel;
}
public void setNivel(String nivel) {
this.nivel = nivel;
}
public double getSalarioLiquido() {
return salarioLiquido;
}
public void setSalarioLiquido(double salarioLiquido) {
this.salarioLiquido = salarioLiquido;
}
public String getCargo() {
return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
public double getSalarioBruto() {
return salarioBruto;
}
public void setSalarioBruto(double salario) {
this.salarioBruto = salario;
}
public double reajuste(double salario){
double reajuste = 0.0;
if(this.cargo.equalsIgnoreCase("operador"))
reajuste = this.salarioBruto * 0.20;
if(cargo.equalsIgnoreCase("programador"))
reajuste = this.salarioBruto * 0.18;
return reajuste;
}
public void calculaSalLiquido(String nivel, int dependentes){
if(nivel.equalsIgnoreCase("a"))
if(dependentes > 0)
setSalarioLiquido(this.salarioBruto * (1 - 0.08));
else
setSalarioLiquido(this.salarioBruto * (1 - 0.03));
if(nivel.equalsIgnoreCase("b"))
if(dependentes > 0)
setSalarioLiquido(this.salarioBruto * (1 - 0.1));
else
setSalarioLiquido(this.salarioBruto * (1 - 0.05));
if(nivel.equalsIgnoreCase("c"))
if(dependentes > 0)
setSalarioLiquido(this.salarioBruto * (1 - 0.15));
else
setSalarioLiquido(this.salarioBruto * (1 - 0.08));
if(nivel.equalsIgnoreCase("d"))
if(dependentes > 0)
setSalarioLiquido(this.salarioBruto * (1 - 0.17));
else
setSalarioLiquido(this.salarioBruto * (1 - 0.1));
}
public int getTempoServico() {
return tempoServico;
}
public void setTempoServico(int tempoServico) {
this.tempoServico = tempoServico;
}
public boolean podeAposentar(int idade, int tempoServico){
if(idade >= 65 && tempoServico >= 30)
return true;
else if(idade >= 60 && tempoServico >= 25)
return true;
return false;
}
}
[/code]
Classe Pessoa:
[code]package trabalho1.modelo;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class Pessoa implements Serializable {
protected String nome, sexo;
private int idade;
private double altura, peso;
private static final long serialVersionUID = 7226571155622776137L;
public Pessoa() {
super();
// TODO Auto-generated constructor stub
}
public Pessoa(String nome) {
super();
// TODO Auto-generated constructor stub
this.nome = nome;
}
public Pessoa(String nome, String sexo, int idade, double altura, double peso) {
super();
// TODO Auto-generated constructor stub
this.nome = nome;
this.sexo = sexo;
this.idade = idade;
this.altura = altura;
this.peso = peso;
}
public double getAltura() {
return altura;
}
public void setAltura(double altura) {
this.altura = altura;
}
public int getIdade() {
return idade;
}
public void setIdade(int idade) {
this.idade = idade;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public double getPeso() {
return peso;
}
public void setPeso(double peso) {
this.peso = peso;
}
public String getSexo() {
return sexo;
}
public void setSexo(String sexo) {
this.sexo = sexo;
}
public boolean maioridade(String sexo, int idade){
if(sexo.equalsIgnoreCase("masculino") || sexo.equalsIgnoreCase("m"))
if(idade > 17)
return true;
if(sexo.equalsIgnoreCase("feminino") || sexo.equalsIgnoreCase("f"))
if(idade > 20)
return true;
return false;
}
public double pesoIdeal(double altura, String sexo){
double pesoIdeal = 0.0;
NumberFormat nf = 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));
return pesoIdeal;
}
}[/code]