Duvida com socket [resolvido]

5 respostas
J
Primeiro meu código... minha dúvida está 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?

[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]

5 Respostas

peczenyj

E o que faz ‘ex3.getMensagemCliente()’ ?

esta retornando o esperado ? faça um println desse cara antes de mandar pro servidor…

J

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

Acho que é como se o servidor não tivesse respondendo.
Aí vai o restante do código:

O 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
		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
}
A classe Ex03
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!");

	}

}
J

Faltaram algumas classes... aí vai

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;
	}
}
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;
	}
}
Criado 30 de abril de 2006
Ultima resposta 1 de mai. de 2006
Respostas 5
Participantes 2