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.

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
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.