Bom eu já pesquisei no Google já pesquisei nas API do java e até mesmo no GUJ mais não consigo descobrir porque o meu cliente não consegue enviar um objeto por socket para o servidor :!:
Classe Servidor
public class Servidor extends Thread {
private ServidorBd servidorBd;
private ArrayList clientes = new ArrayList();
private Socket conexao;
//Métodos Construtores
public Servidor(Socket conexao) {
this.conexao = conexao;
}
public Servidor() {
}
//Métodos de inicialização
public static void main() {
// main o acesso ao banco de dados do servidor
servidorBd = new ServidorBd();
// atualiza configuração do servidor
System.out.println("O endereço atual do servidor é " + getIp());
System.out.println("Iniciando configurações");
CriaConfiguracao();
System.out.println("Atualizando configurações");
EnviaCofiguracao();
System.out.println("Iniciando Servidor");
try {
// criando um socket que fica escutando a porta 2020.
ServerSocket socket = new ServerSocket(2020);
// Loop principal.
while (true) {
// aguarda algum cliente se conectar. A execução do
// servidor fica bloqueada na chamada do método accept da
// classe ServerSocket. Quando algum cliente se conectar
// ao servidor, o método desbloqueia e retorna com um
// objeto da classe Socket, que é porta da comunicação.
System.out.println("Esperando alguem se conectar...");
Socket conexao = socket.accept();
System.out.println(" Novo cliente conectado!");
// cria uma nova thread para tratar essa conexão
Thread t = new Servidor(conexao);
t.start();
// voltando ao loop, esperando mais alguém se conectar.
}
} catch (IOException ex) {
// caso ocorra alguma excessão de E/S, mostre qual foi.
System.out.println("ocorreu um erro ao iniciar o servidor");
}
}
//Execução da thread de recepção de mensagens
//É aqui que as mensagens recebidas são manipuladas
@Override
public void run() {
try {
// Fluxo de entrada de dados
ObjectInputStream entrada = new ObjectInputStream(conexao.getInputStream());
//Cria fluxo de envio de dados com o cliente e armazena em uma lista
ObjectOutputStream saida = new ObjectOutputStream(conexao.getOutputStream());
clientes.add(saida);
String tipo;
String destinatario;
while (true) {
// espera por uma nova linha.
tipo = (String)entrada.readObject();
destinatario = (String)entrada.readObject();
if(tipo.equals("cadastro")) {
Cadastro cadastro = (Cadastro)entrada.readObject();
System.out.println("" + cadastro.getLogin() + " solicitou um cadastro!");
servidorBd.addUsuario(cadastro.getLogin(), cadastro.getNome(), cadastro.getSenha());
} if(tipo.equals("listaDeUsuarios")) {
ListaDeUsuarios lista = (ListaDeUsuarios)entrada.readObject();
System.out.println("" + lista.getRementente() + " solicitou atualização da lista de usuarios!");
ListaDeUsuarios respondeLista = new ListaDeUsuarios("servidor",lista.getRementente(),servidorBd.getLoginUsuarios());
enviaparaTodos(respondeLista);
} if(tipo.equals("login")) {
Login login = (Login)entrada.readObject();
boolean autentica = servidorBd.autenticaUsuario(login.getLogin(), login.getSenha());
String nome = servidorBd.getNomeUsuario(login.getLogin());
Login respondeLogin = new Login("servidor",login.getLogin(),login.getLogin(),null,nome,autentica);
enviaparaTodos(respondeLogin);
} if(tipo.equals("texto")) {
Texto texto = (Texto)entrada.readObject();
enviaparaTodos(texto);
}else {
System.out.println("Uma mensagem de tipo desconhecido foi recebido pelo servidor!");
//objeto que vem junto é descartado
Object desconhecido = (Object)entrada.readObject();
System.out.println(desconhecido.toString());
}
}
} catch (IOException ex) {
System.out.println("IOException: " + ex);
Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
}
}
//Métodos de comunicação
private void enviaparaTodos(Mensagem mensagem) {
Iterator it = clientes.iterator();
String tipo = mensagem.getTipo();
String destinatario = mensagem.getDestinatario();
//percorre a ista que possui o fluxo de envio de dados dos clientes
while(it.hasNext()) {
try {
ObjectOutputStream saida = (ObjectOutputStream) it.next();
// envia para o servidor
saida.writeObject(tipo);
saida.writeObject(destinatario);
saida.writeObject(mensagem);
//saida.close();
System.out.println("uma mensagem enviada na boa...");
} catch(Exception ex) {
System.out.println("Erro ao enviar mensagem aos clientes");
}
}
}
}
Classe Cliente
public class Cliente extends Thread {
private String login;
private String nome;
private boolean autenticado;//indica se o usuario esta autenticado.
private Socket conexao;
private List<String> usuarios;
private String ipServidor;
//Métodos Construtores
public Cliente(Socket s) {
conexao = s;
}
//Métodos de inicialização
public static void main() {
try{
Socket novaConexao = new Socket("127.0.0.1", 2020);
// Uma vez que tudo está pronto, antes de iniciar o loop
// principal, executar a thread de recepção de mensagens.
Thread t = new Cliente(novaConexao);
t.start();
}catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Não foi possivel estabelecer uma conexão com o servidor!");
}
}
Cliente() {
}
//Execução da thread de recepção de mensagens
//É aqui que as mensagens recebidas são manipuladas
@Override
public void run() {
try {
ObjectInputStream entrada = new ObjectInputStream(conexao.getInputStream());
String tipo;
String destinatario;
while (true) {
// pega o que o servidor enviou
tipo = (String)entrada.readObject();
destinatario = (String)entrada.readObject();
if(destinatario.equals(login)) {
if (tipo.equals("listaDeUsuarios")) {
ListaDeUsuarios lista = (ListaDeUsuarios)entrada.readObject();
usuarios = lista.getUsuarios();
} if (tipo.equals("login")) {
Login rlogin = (Login)entrada.readObject();
recebeRespostaLogin(rlogin);
} if (tipo.equals("texto")) {
Texto texto = (Texto)entrada.readObject();
recebeMensagenDeTexto(texto);
} else {
System.out.println("Uma mensagem de tipo desconhecido foi recebido pelo servidor!");
//objeto que vem junto é descartado
Object desconhecido = (Object)entrada.readObject();
System.out.println(desconhecido.toString());
}
}
}
} catch (IOException ex) {
System.out.println("IOException: " + ex);
} catch (ClassNotFoundException ex) {
System.out.println("IOException: " + ex);
}
}
/**
* Envia uma mensagem para o servidor
* @param mensagem
*/
private void enviaMensagem(Mensagem mensagem) {
try{
String tipo = mensagem.getTipo();
String destinatario = mensagem.getDestinatario();
ObjectOutputStream saida = new ObjectOutputStream(conexao.getOutputStream());
// envia para o servidor
saida.writeObject(tipo);
saida.writeObject(destinatario);
saida.writeObject(mensagem);
//Encerra o fluxo de saida
saida.close();
} catch (IOException ex) {
// Caso ocorra alguma excessão de E/S, mostre qual foi.
JOptionPane.showMessageDialog(null, "falha ao enviar mensagem!");
}
}
public void solicitaLogin(String login, String senha) {
this.login = login;
Login mensagem = new Login(this.login,"servidor", this.login, senha,"",false);
//Destinatario,Rementente,Tipo,Login,Senha,getNome,Resposta;
enviaMensagem(mensagem);
}
public void solicitaCadastro(String login,String nome,String senha) {
this.login = login;
Cadastro mensagem = new Cadastro(login, "servidor", login, nome,senha);
enviaMensagem(mensagem);
}
public void solicitaListaDeUsuario() {
if(this.autenticado) {
ListaDeUsuarios mensagem = new ListaDeUsuarios(this.login,"servidor",null);
enviaMensagem(mensagem);
}
}
public void enviaMensagemDeTexto(String destinatario,String texto) {
if(this.autenticado) {
Texto mensagem = new Texto(this.login,destinatario,texto);
enviaMensagem(mensagem);
}
}
public void recebeMensagenDeTexto(Texto mensagem) {
JOptionPane.showMessageDialog(null, mensagem.getRementente() + "disse :" + mensagem.getTexto());
}
private void recebeRespostaLogin(Login loginResposta) {
boolean resposta = loginResposta.getResposta();
this.autenticado = resposta;
System.out.println("login atualisado para!");
System.out.println(resposta);
}
}
Observações...
As Classe Cadastro, ListaDeUsuarios, Login e Texto são todas classes estendidas da classe Mensagem e estão em um pacote .jar separado como uma biblioteca.
A Classe ServidorBd é a interface do servidor com o banco de dados.
