Receber e Enviar Objetos usando Socket

Fala Povo!
Aprendi como enviar do cliente para o servidor um objeto, e como fazer o servidor enviar para o cliente um objeto.
Só que o Cliente fica travado.
[EDITADO!] Consegui destravar o cliente, mas o servidor quando vai enviar de volta o teste modificado, dá um erro “socket write error”

Vou postar todo o código pra que possam me ajudar.
Segue!

[code]import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class Client {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Teste teste = new Teste();
teste.head = “Cabeçalho”;

	Socket client = new Socket("127.0.0.1", 7001); 
	ObjectOutputStream output = new ObjectOutputStream(client.getOutputStream());
	ObjectInputStream input = new ObjectInputStream(client.getInputStream());
	output.flush(); 

	output.writeObject(teste); 
	output.flush(); 
	output.close();
	
	Teste testeModificado = (Teste) input.readObject();
	System.out.println(testeModificado.head);
}

}
[/code]

[code]import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ServerSocket server = new ServerSocket(7001);

	Socket connection = server.accept(); 
	ObjectInputStream input = new ObjectInputStream(connection.getInputStream());
	ObjectOutputStream output = new ObjectOutputStream(connection.getOutputStream()); 
	output.flush(); 
	
	Teste teste = (Teste) input.readObject();
	System.out.println(teste.head);
	teste.head = "Cabeçalho Modificado";
	
	output.writeObject(teste);
	output.flush();
	output.close();
}

}
[/code]

[code]import java.io.Serializable;

@SuppressWarnings(“serial”)
public class Teste implements Serializable {
public String head;
}
[/code]

Bem, se entendi bem, vc na sua classe cliente cria somente o output, assim sendo não existe o imput para que possa receber o retorno do servidor.
Acredito que este deva ser o problema.
:smiley:
Vale lembrar que dar o close no final da execução em todos (out,in e socket) é sempre válido.

Valeu!!

tem o input também!
vou atualizar o código pra melhor visualização

  1. Aprenda a criar seu próprio protocolo;
    http://www.guj.com.br/java/136538-o-que-um-protocolo
  2. Não utilize ObjectInputStream e ObjectOutputStream;
  3. Aprenda a criar seu próprio protocolo;
  4. Códigos de socket devem rodar em loops, com threads. Dê uma olhada nesse exemplo simples:
    http://www.guj.com.br/java/74218-chat-em-java--usando-socket-e-thread/2#506163
  5. E seria bom você também aprender a criar seu próprio protocolo;

hehehe valeu Vini, sobre criar o própio protocolo eu entendi bem!
Sobre rodar em loops com threads eu tbm já conheço, só postei um exemplo mais simples pra entenderem a situação que está ocorrendo, porque o clientee o servidor mesmo é enorme.
E Não utilizar ObjectInputStream ou ObjectOutputStream eu não to ciente, vou dar uma olhada nos links que você indicou!

Mas como vou enviar um Objeto usando o protocolo que você menciona? o.Õ

Isso é o protocolo quem diz. Mas geralmente, você envia campo a campo, num formato definido por você no protocolo. O chat tem exemplo.

Descobri que se eu não enviar de volta para o cliente, o objeto Teste recebido, e sim um Novo Objeto Teste, não dá erro.

Isso é o protocolo quem diz. Mas geralmente, você envia campo a campo, num formato definido por você no protocolo. O chat tem exemplo.[/quote]

Campo a campo não dá, eu tive que descobrir essa semana como enviar Objeto por socket justamento pra fugir do campo a campo, afinal eu não sei quantos campos vou ter que enviar para o servidor por exemplo, e se eu souber, serão dezenas!

Se o protocolo diz que está chegando um Objeto, como eu passaria o objeto em seguida? o.Õ Não faço idéia
Só sei que serializando o objeto vira bytes (né?) e enviar bytes via rede é legal, só que chegando lá vou desserializar

E como o cliente saberá com qual objeto está lidando?

Se vc precisa de algo tão transparente assim, considere fortemente a possibilidade de usar RMI.

ObjectInputStream e OutputStream não são adequados para software. E não são tão economicos na rede quanto você pode pensar.

Considere também a possibilidade de usar REST para transferência de dados. Além de ter uma interoperabilidade bem maior do que RMI e causar menos dor de cabeça, ainda aproveita toda a infraestrutura ja pronta que existe na web. Existem vários frameworks que trabalham com REST em java, entre eles eu recomendaria vc utilizar o Resfulie ou o Restlet.