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