Problemas com envio/recebimento de objetos via socket

1 resposta
B

Boa noite pessoal,

Estou enfrentando um probleminha e gostaria da ajuda de vocês. Estou criando um chat usando sockets. Primeiramente, usando Strings, consegui com sucesso enviar e distribuir para todos os clientes conectados.
Porém, quando fui trabalhar com Objetos, tive problema.

Na minha classe de enviar o Objeto, aparentemente, está tudo ok, porém, na hora de ler o objeto no servidor, ele não está lendo. Já vi vários e vários tópicos relacionados a isso, e todos estão praticamente iguais.
Vou postar um esboços das classes:

Classe de enviar mensagens para o servidor:

public void writeMessage() throws IOException{
        obj = new ObjectOutputStream(output);
        
        while (executa){
            String msg = JOptionPane.showInputDialog(null, "Digite sua mensagem: ", "Atenção", JOptionPane.QUESTION_MESSAGE);
            user.setMsg(msg);
            user.setHora(new SimpleDateFormat("HH:mm:ss").format(new Date()));
            
            obj.writeObject(user);
            obj.flush();
        }
        obj.close();
        saida.close();
}

O objeto ObjectOutPutStream recebe uma variavel output, que nada mais é que o getOutPutStream do cliente.
Agora, no servidor, onde recebo e distribuo as mensagens, tenho o seguinte código (Implementa Runnable):

public void run() {
            obj = new ObjectInputStream(user.getCliente().getInputStream());
            while (true) {
                User user = (User) obj.readObject();
                System.out.println(user.getHora());
                System.out.println(user.getHost());
                System.out.println(user.getMsg());
            }
}

E nada de mostrar na console. Não dá erro, mas também não mostra nada.
Já tentei dessa maneira também:

public void run() {
             obj = new ObjectInputStream(user.getCliente().getInputStream());
            Scanner s = new Scanner(obj);
 
           while (s.hasNextLine()) {
                User user = (User) obj.readObject();
                System.out.println(user.getHora());
                System.out.println(user.getHost());
                System.out.println(user.getMsg());
            }
}

A classe User no cliente e no servidor são idênticas, segue:

public class User implements Serializable{
    
    private transient Socket cliente;
    private String ip;
    private String nomeComputer;
    private String nomeCliente;
    private String hora;
    private String msg;
}

Alguém ai para dar um auxilio?

1 Resposta

B

bomba544:
Boa noite pessoal,

Estou enfrentando um probleminha e gostaria da ajuda de vocês. Estou criando um chat usando sockets. Primeiramente, usando Strings, consegui com sucesso enviar e distribuir para todos os clientes conectados.
Porém, quando fui trabalhar com Objetos, tive problema.

Na minha classe de enviar o Objeto, aparentemente, está tudo ok, porém, na hora de ler o objeto no servidor, ele não está lendo. Já vi vários e vários tópicos relacionados a isso, e todos estão praticamente iguais.
Vou postar um esboços das classes:

Classe de enviar mensagens para o servidor:

public void writeMessage() throws IOException{
        obj = new ObjectOutputStream(output);
        
        while (executa){
            String msg = JOptionPane.showInputDialog(null, "Digite sua mensagem: ", "Atenção", JOptionPane.QUESTION_MESSAGE);
            user.setMsg(msg);
            user.setHora(new SimpleDateFormat("HH:mm:ss").format(new Date()));
            
            obj.writeObject(user);
            obj.flush();
        }
        obj.close();
        saida.close();
}

O objeto ObjectOutPutStream recebe uma variavel output, que nada mais é que o getOutPutStream do cliente.
Agora, no servidor, onde recebo e distribuo as mensagens, tenho o seguinte código (Implementa Runnable):

public void run() {
            obj = new ObjectInputStream(user.getCliente().getInputStream());
            while (true) {
                User user = (User) obj.readObject();
                System.out.println(user.getHora());
                System.out.println(user.getHost());
                System.out.println(user.getMsg());
            }
}

E nada de mostrar na console. Não dá erro, mas também não mostra nada.
Já tentei dessa maneira também:

public void run() {
             obj = new ObjectInputStream(user.getCliente().getInputStream());
            Scanner s = new Scanner(obj);
 
           while (s.hasNextLine()) {
                User user = (User) obj.readObject();
                System.out.println(user.getHora());
                System.out.println(user.getHost());
                System.out.println(user.getMsg());
            }
}

A classe User no cliente e no servidor são idênticas, segue:

public class User implements Serializable{
    
    private transient Socket cliente;
    private String ip;
    private String nomeComputer;
    private String nomeCliente;
    private String hora;
    private String msg;
}

EDITADO*
Consegui disparar uma stack trace:

java.lang.ClassNotFoundException: customer.User
	at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:340)
	at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
	at server.WriteMessage.run(WriteMessage.java:32)
	at java.lang.Thread.run(Thread.java:745)

Ele tá esperando uma classe User do projeto “customer” e não do servidor.
As classes do servidor e do cliente estão em projetos separados. Como faço pra resolver nesse caso?
Alguém ai para dar um auxilio?

Criado 8 de julho de 2014
Ultima resposta 9 de jul. de 2014
Respostas 1
Participantes 1