Receber e Enviar Objetos usando Socket

9 respostas
V

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!

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);
	}
}
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();
	}
}
import java.io.Serializable;


@SuppressWarnings("serial")
public class Teste implements Serializable {
	public String head; 
}

9 Respostas

I

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

V

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

V
  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;
V

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

V

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

V

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.

V

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

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

V

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.

O

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.

Criado 8 de abril de 2011
Ultima resposta 8 de abr. de 2011
Respostas 9
Participantes 4