Problema com DataStream

3 respostas
R

Olá, estou tentando usar o DataStream para passar informação entre as aplicações servidor e cliente de um chat

dentro do evento de um popupmenu do cliente esta o seguinte codigo

public void actionPerformed(ActionEvent e)
        {
            if ( e.getSource() ==  anItem)  { 
            	
            	try{saida.writeInt(5); System.out.println("teste");}
        		catch (EOFException ex) {
                    
                }catch (IOException ex) {
    	            ex.printStackTrace();
    	        }
               }
            if ( e.getSource() ==  anItem2)  { 
            	
            	try{saida.writeInt(6); System.out.println("teste");}
        		catch (EOFException ex) {
                    
                }catch (IOException ex) {
    	            ex.printStackTrace();
    	        }
               }
        }

sendo a saida - DataOutputStream saida = new DataOutputStream((cliente.getOutputStream()));

e o servidor esta recebendo desse jeito

try{ while(true) {
			if(ois.readInt()==5)
			{System.out.println("testando5");}
			if(ois.readInt()==6)
				{System.out.println("testando6");}
		
	    } } 
		catch (EOFException ex) {
            
        }
		 catch (IOException ex) {
	            ex.printStackTrace();
Sendo o ois - DataInputStream ois = new DataInputStream(cliente.getInputStream());

O problema é o seguinte, quando eu clicko no primeiro item do popupmenu aparece na tela do servidor "testando5" e se eu clicko no segundo item aparece o "testando6" até ai tudo bem, o problema é que se eu clicko duas vezes consecutivas em um item só o println referente a ele não aparece, e pior, se eu tento clickar no outro item a mensagem respectiva a ele também não aparece, e isso acontece até que eu click duas vezes consecutivas em um dos itens novamente

Obrigado pela atenção

3 Respostas

pmlm

O readInt lê o valor e retira-o da stream. Assim, na comparação estás a retirar o valor da stream, não o deixando disponível para o if seguinte.
O que tu queres fazer é: int value = ois.readInt(); if(value==5) { System.out.println("testando5"); } if(value==6) { System.out.println("testando6"); }

R

Muito obrigado, esse era o problema. Além de arrumar o código me forneceu um ótimo conceito sobre o read

Comecei a pesquisar socket agora que me deu vontade de fazer esse programa, então estou meio que apanhando para entender todo conceito assim de uma vez, muito obrigado pela sua ajuda =)

R

Surgiu mais uma duvida: Criei uma ArrayList para armazenar todos dataoutputstream que o servidor recebe dos cliente, gostaria de saber se existe um modo de retirar uma dataoutputstream quando o cliente fecha a conexão sem ter que declarar a arraylist como static

código do servidor sendo o clientes - public static List clientes;
while(true)
		{
			Socket cliente = servidor.accept();
			System.out.println("Nova conexão com o cliente " +   
			         cliente.getInetAddress().getHostAddress()
				       );
			
			DataOutputStream dout = new DataOutputStream(cliente.getOutputStream());
			this.clientes.add(dout);
			
		    TrataCliente tc = new TrataCliente(cliente.getInputStream(), this,dout);
		    new Thread(tc).start();
		}
TrataCliente
public TrataCliente(InputStream cliente,Servidor servidor, DataOutputStream dout)
	{
		this.cliente=cliente;
		this.servidor=servidor;
		this.dout=dout;
	}
	
	public void run()
	{
		DataInputStream ois = new DataInputStream(cliente); 

		try{ while(Servidor.clientes.contains(dout)) {
		    int value = ois.readInt();  
		    if(value==5) {   
		        System.out.println("testando5"); 
		        servidor.distribuiMensagem(value);
		    }    
		    if(value==6) {  
		        System.out.println("testando6");
		        servidor.distribuiMensagem(value);
		    }		
	    	} 
		} 
		catch (EOFException ex) {            
        }
        catch (SocketException ex) {
            ex.printStackTrace();        
        }
		 catch (IOException ex) {
	            ex.printStackTrace();
	    }

			System.out.println("testando2");
			Servidor.clientes.remove(dout);
	       
	    }
Criado 7 de janeiro de 2014
Ultima resposta 8 de jan. de 2014
Respostas 3
Participantes 2