ObjectOutputStream ou ObjectInputStream só pode haver uma instância por vez na máquina?

3 respostas
J

Boa tarde,

estou precisando muito de ajuda, pois ja quebrei a cabeça o dia todo para fazer funcionar o socket com ObjectOutputStream.
Porém agora tem um problema que realmente nao consegui descobrir a causa:

1) Inicio o serverSocket - tudo bem 2) Inicio um socket - tudo bem 3) Inicio um segundo socket, eu até obtenho um numero diferente localport=64138, mas só consigo instanciar o
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
depois que a primeira conexão foi encerrada.

Para testar, criei uma classe no cliente e 2 no server.
Essas classes nao trocam objetos, eu só estabeleci a conexão e coloquei um sleep, para não complicar.

Esta é a classe client:
public class TesteChamada {
    public static String hora() {return new SimpleDateFormat("hh:mm:ss").format(new Date()) + " ";}

    public static void main(String args[]) throws IOException, ClassNotFoundException {
        
		Socket socket = new Socket("localhost", 12000); 
		ObjectInputStream in = new ObjectInputStream(socket.getInputStream());  
		ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());  

                
		//sending an object  
                
                try {  
                    Thread.sleep(0000);  
                } catch (Exception e) {  
                    e.printStackTrace();  
                } 

                System.out.println(hora()+"fechou conexao");
                
		  
		//closing connection  
		in.close();  
		out.close();  
		socket.close(); 
	}
}
Este é o trecho do servidor:
public class TesteServer  {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		ServerSocket serverSocket = new ServerSocket(12000);
		System.out.println(new SimpleDateFormat("hh:mm:ss").format(new Date()) + " Server - Iniciado, serverSocket: " + serverSocket);
		
		Ouvidor ouvidor = new Ouvidor(serverSocket);
		Thread pilha = new Thread(ouvidor);
		pilha.start();		
	}

}

public class Ouvidor implements Runnable {
	private ServerSocket serverSocket;

	public Ouvidor(ServerSocket serverSocket) {
		this.serverSocket = serverSocket;
	}
	public void run() {
		while (true) {
			try {
				Socket socket = serverSocket.accept(); //recebe nova conexao
				
				System.out.println("recebeu conexao, socket: " + socket);
				
				ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
				ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
                try {  
                    Thread.sleep(50000);  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {}
		}
	}

}

Por favor, alguem sabe se só dá para instanciar um objeto ObjectOutputStream ou ObjectInputStream, de cada vez na máquina?

Olha, como já disse, passei o dia todo só para conseguir chegar até aqui, e já li o "http://docs.oracle.com/javase/1.4.2/docs/api/java/io/ObjectOutputStream.html".

3 Respostas

rmendes08

De maneira alguma, você pode abrir tantos streams de objetos quanto forem necessários. O que eu não recomendaria seria usar mais de um stream de entrada/saída por socket. Há algum tempo, eu fiz um post no meu blog que usa serialização de objetos com sockets, talvez te ajude:

ViniGodoy

Eu não recomendo usar o ObjectInputStream e o ObjectOutputStream.

Eles tem as seguintes desvantagens:

a) Você não tem controle de como a serialização de todos os objetos ocorrem;

b) São geralmente serializados muito mais dados do que o necessário;

c) É importante ter controle completo sobre seu <a href="http://www.guj.com.br/java/136538-duvida-simples#735860" data-bbcode="true">protocolo</a>. O DataInputStream e o DataOutputStream dão um pouco mais de trabalho, mas geralmente apresentam mais controle e eficiência.

De maneira geral, serialização foi uma idéia interessante, mas implementada de uma maneira desajeitada no Java.

J

Obrigado rmendes08.

o problema que estava me deixando sem cabelo é porque após o “server.accept();” eu estava realizando leituras, e o correto é iniciar uma nova thread a cada accept(), por isso o socket ficava ocupado com aquela conexão. Agora resolveu.

Li o seu post e me identifiquei muito com a parte do xingamento. Realmente passei o dia hoje travado só no protocolo, mas pelo que entendi do seu post, eu fiz de maneira similar: serializei duas classes, que são user e msg, estou trafegando somente essas duas classes via ObjectOutputStream e ObjectInputStream;

Quanto a não usar mais de um stream de entrada/saída por socket, pelo que entendo, não estou usando: tem um único socketserver no servidor e crio um novo socket a cada novo cliente.

Mais uma vez obrigado pela atenção

Criado 10 de junho de 2012
Ultima resposta 10 de jun. de 2012
Respostas 3
Participantes 3