Duvida com socket [resolvido]

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]