Duvida com Socket

0 respostas
J
Primeiro meu código, o problema/dúvida tá logo abaixo.
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

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? [/b]

Aqui tá o restante do código:

Classe Pessoa:
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;
	}
}
Classe Funcionario:
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;
	}
}
Servidor:
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
		
		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;
			case 7:
				Ex07 ex7 = new Ex07();
				
				ex7.desmembraMensagemCliente(mensagemCliente);
				f = ex7.getFuncionario();

				System.out.println("Cliente: " + Ex07.cliente);
				System.out.println("Nome: " + f.getNome());
				System.out.println("Idade: " + f.getIdade());
				System.out.println("Tempo de Serviço: " + f.getTempoServico());
				
				// processamento
				ex7.processa();

				// Monta e envia mensagem ao cliente
				IndoParaCliente.writeBytes(ex7.montaMensagemServidor());
				break;

			default:
				break;
			}
	
		} // Fim while(true)
	} // Fim main
}

Ajudem aí, vai.

Criado 30 de abril de 2006
Respostas 0
Participantes 1