Socket - Posso criar mais de um tipo de fluxo de dados?

1 resposta
E

Olá…

Gostaria de saber se não há problema em criar e usar mais de um tipo de fluxo de dados a partir de um socket. Algo do tipo:

public class ConexaoServidor extends Thread
{
        private ObjectInputStream entradaObjeto;
	private ObjectOutputStream saidaObjeto;
	private DataInputStream entradaDado;
        private DataOutputStream saidaDado;

        public ConexaoServidor(Socket cliente)
       {
            this.cliente = cliente;

            this.entradaObjeto = new ObjectInputStream(this.cliente.getInputStream());
            this.saidaObjeto = new ObjectOutputStream(this.cliente.getOutputStream());
            this.saidaDado = new DataOutputStream(this.cliente.getOutputStream());
            this.entradaDado = new DataInputStream(this.cliente.getInputStream());

            this.start();
       }
}

A idéia é, dentro do run ficar ouvindo o fluxo de objetos (ObjectOutputStream / ObjectInputStream), esperando objetos do tipo do tipo Mensagem que encapsulam requisições diversas. Uma das requisições possíveis é a de enviar um arquivo de vídeo, por exemplo, e quando o servidor recebe esta requisição, ele chama o seguinte método “enviaDadosDoVideo”.

public void run()
        {
            System.out.println("Está conectado "+cliente.isConnected()+"");
            TipoDeMensagem tipo;
            while(continua)
            {
                
                try
                {
                    Mensagem<String> mensagem = (Mensagem<String>)entradaObjeto.readObject();
                    tipo = mensagem.getTipoDeMensagem();
                    
                    if(tipo==TipoDeMensagem.REQUISICAO_ENVIO_DE_ARQUIVO_DE_VIDEO)
                    {
                        //Cliente pede que servidor envie arquivo
                        enviaDadosDoVideo((String)mensagem.getDados());
                    }
                    else if(tipo==TipoDeMensagem.REQUISICAO_RECEBIMENTO_DE_ARQUIVO_DE_VIDEO)
                    {
                        //implementar recebimento
                    }
                    
                    Thread.sleep(100);
                }
                catch(Exception)
                {
                    \\Implementar tratamento para cada uma das exceptions
                }
            }


            try
            {
                entradaObjeto.close();
                saidaObjeto.close();
                cliente.close();
            }
            catch(IOException IOE)
            {
                System.out.println("Ocorreu um erro de I/O inesperado ");
            }
	}
public void enviaDadosDoVideo(String nomeDoArquivo)throws Exception
        {
            File arquivoAEnviar = (servidor.getControlador()).getArquivoDeVideo(nomeDoArquivo);
            System.out.println("Enviando arquivo "+arquivoAEnviar.getPath()+"");
            Mensagem mensagem = new Mensagem(TipoDeMensagem.TRANSPORTE_INFORMACAO_DE_TAMANHO_DE_ARQUIVO,new Integer((int)arquivoAEnviar.length()));
            System.out.println(mensagem);
            saidaObjeto.writeObject(mensagem);
            saidaObjeto.flush();
            DataInputStream entradaArquivo = new DataInputStream(new FileInputStream(arquivoAEnviar));
            int bytesParaEnviar = entradaArquivo.available();
            int tamanhoDoFragmento = 1024;
            byte[] dados = new byte[tamanhoDoFragmento];
            int bytesEscritos;
            while(bytesParaEnviar>0)
            {
                    bytesEscritos = (bytesParaEnviar >= tamanhoDoFragmento ? tamanhoDoFragmento : bytesParaEnviar);
                    System.out.println("Falta enviar "+bytesParaEnviar+" bytes");

                    entradaArquivo.read(dados,0,bytesEscritos);
                    saidaDado.write(dados,0,bytesEscritos);

                    bytesParaEnviar = bytesParaEnviar - bytesEscritos;
                    try
                    {
                            Thread.sleep(0,5);	
                    }
                    catch(InterruptedException IE)
                    {
                            continue;
                    }
            }
            entradaArquivo.close();
        }

E neste método eu uso um DataOutputStream

1 Resposta

E

Minha aplicação está gerando uma “java.net.SocketException: Connection reset” na linha 10 do método run…ainda não consegui descobrir porque.

Rodando cliente e servidor e fazendo uma requisição de envio, eu consigo receber o vídeo, mas em seguida, entra no while denovo e pára na linha citada…

Ontem postei uma dúvida semelhante, mas esta é direcionada à questão dos fluxos mesmo…

Criado 3 de julho de 2008
Ultima resposta 3 de jul. de 2008
Respostas 1
Participantes 1