Socket não atualiza objeto mensagem

Pessoal estou com um problema na troca de mensagem da minha aplicação cliente/servidor. A Aplicação é feita em java com socket’s.

Após o cliente enviar o primeiro Objeto mensagem para o servidor, ele não consigo mais Atualizar os dados deste objeto mensagem. Em outras palavras parece que o cliente sempre envia os mesmos dados dentro do objeto mensagem.

Fazendo debug na aplicação comprovei que o cliente envia dados diferentes e o servidor que acaba recebendo os mesmos dados. Como se estivesse ficando um cache entre os dois.

O código de envio de mensagem por parte do cliente.

	public boolean enviarPacote(Mensagem mensagem){
		try {
			out.writeObject(mensagem);
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

O servidor possui um listener (extends Thread) que fica esperando as mensagens do cliente chegarem.

	public void run(){
		Mensagem mensagem = null; 
		try {
			while(continuaServico){
				try{
					mensagem = (Mensagem) receber.readObject();
					
					trataMensagem(mensagem);
					
				}catch(SocketException e1){
					terminarServico();
					personagemConectado.desconectaCliente();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

O atributo receber do servidor é um ObjectInputStream criado em outra classe;
O atributo out do cliente é um ObjectOutputStream criado na mesma classe;

Alguém já passou por este problema? Vocês saberiam alguma solução?

Qualquer dica ou ajuda é bem vinda.

Alguem tem alguma dica?

Conseguiram entender o problema? Qualquer ajuda é bem vinda

Pelo código que você postou, não tem problema nenhum!!É preciso saber omo você está tratando a mensagem!!

Olá,

O problema que você está enfrentando tem a ver com o jeito que a serialização de objetos funciona no Java.

Vou citar um artigo em inglês aqui e depois explico em português:
http://java.sun.com/developer/technicalArticles/Programming/serialization/

[quote]Gotchas

There are a few things about the serialization protocol that can seem very strange to developers who are not aware. Of course, that is the purpose of the article – to get you aware! So let’s discuss a few of those gotchas and see if we can understand why they exist and how to handle them.

Caching Objects in the Stream

First, consider the situation in which an object is written to a stream and then written again later. By default, an ObjectOutputStream will maintain a reference to an object written to it. That means that if the state of the written object is written and then written again, the new state will not be saved! Here is a code snippet that shows that problem in action:

10 ObjectOutputStream out = new ObjectOutputStream(…);
20 MyObject obj = new MyObject(); // must be Serializable
30 obj.setState(100);
40 out.writeObject(obj); // saves object with state = 100
50 obj.setState(200);
60 out.writeObject(obj); // does not save new object state

There are two ways to control that situation. First, you could make sure to always close the stream after a write call, ensuring the new object is written out each time. Second, you could call the ObjectOutputStream.reset() method, which would tell the stream to release the cache of references it is holding so all new write calls will actually be written. Be careful, though – the reset flushes the entire object cache, so all objects that have been written could be rewritten. [/quote]

O aviso é o mesmo exato do seu caso. Quando você escreve o mesmo objeto várias vezes num ObjectOutputStream, o estado dele fica escrito só na primeira vez. O restante de vezes fica escrita só uma referência naquela primeira instância. Isso é legal quando você tem, por exemplo, um array de dez posições e tem o mesmo objeto nas posições 1, 3 e 7. Quando esse array é serializado e deserializado, as posições 1, 3 e 7 continuam apontando para o mesmo objeto (array[1] == array[3], array[3]==array[7], etc).

Para resolver no seu caso, eu vejo duas saídas. Ou use a dica do artigo: dá um .reset() no seu ObjectOutputStream depois de cada escrita, ou cria uma nova instândia da Mensagem sempre que você grava ele no stream.

[]s,
Sami

Sami Koivu obrigado pela ajuda e pelo artigo.

Realmente reset no ObjectOutputStream resolveu o problema.

valeu.