Olá, estou "encodando" imagens para B64 e enviando elas como String para o cliente (socket). Só que quando a imagem é remontado no cliente, ela fica tudo bugada. Alguém sabe o que pode ser?
Já estou ficando realmente puto com isso, nunca pedi ajuda em fóruns e esse problema tá me dando dor de cabeça hein! Já tive que mudar a estrutura base do programa algumas vezes, e mesmo assim ainda não consegui resolver o erro.
também tô achando que pode ser erro de sincronia com socket, já que estou usando um timer para fazer o filtro...
Tipo:
privatevoidm(){Timert=newTimer();t.schedule(newTimerTask(){inttInicial=0;publicvoidrun(){if(tInicial!=texBuscar.getText().length()){//enviar pacote de busca pro servidor//obter resposta do servidor//popular panel com as imagens das buscas (limite 0, 30)tInicial=texBuscar.getText().length();}}},1,1);}
ViniGodoy
Se está usando sockets direto, porque está transmitindo a imagem numa forma tão ineficiente quanto String? Não era mais fácil usar um protocolo binário?
Parece ser mesmo um problema da sua comunicação. Teria que ver como você está fazendo a leitura e a escrita do socket.
Já tentou usar esse método de codificar e decodificar num programa local, sem o socket no meio? Assim pelo menos você descobre se os dois métodos estão implementados corretamente, ou se é problema da transmissão.
jubapunx
Eu andei modificando o cliente, então pode não estar exatamente do jeito que estava antes, mas é assim:
Classe "Comunicacao" do Cliente:
packagecom.zmeck_c.tcp;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.net.Socket;importjava.net.SocketException;importcom.zmeck_c.Principal;importcom.zmeck_c.util.Ig;publicclassComunicacao{publicstaticStringpegarPacote(Socketsock){Stringpac="";try{BufferedReaderleitorBuffer=newBufferedReader(newInputStreamReader(sock.getInputStream()));while(true){char[]next=newchar[10000];inttamanho=leitorBuffer.read(next);Stringproximo="";for(inti=0;i<tamanho;i++){proximo+=next[i];}pac+=proximo;if(proximo.charAt(proximo.length()-1)==(char)2){pac=pac.substring(0,pac.length()-1);break;}}}catch(SocketExceptione){Ig.mensagemAlerta("Você foi desconectado. Tente se conectar novamente.");System.exit(0);}catch(IOExceptione){e.printStackTrace();}returnpac;}publicstaticvoidenviarPacote(Stringpacote){try{//BufferedWriter escritorBuffer = new BufferedWriter(new OutputStreamWriter(Principal.S.getOutputStream()));intt=0;intpaclen=pacote.length();booleanquebra=false;for(inti=0;i<paclen;i++){for(intm=0;m<10000;m++){if(pacote.length()<10000){BufferedWriterescritorBuffer=newBufferedWriter(newOutputStreamWriter(Principal.S.getOutputStream()));escritorBuffer.write(pacote+(char)2);escritorBuffer.flush();t=t+10000;quebra=true;System.out.println("FLUSH");break;}else{Stringproximo=pacote.substring(0,10000);pacote=pacote.substring(10000,pacote.length());BufferedWriterescritorBuffer=newBufferedWriter(newOutputStreamWriter(Principal.S.getOutputStream()));escritorBuffer.write(proximo);escritorBuffer.flush();t=t+10000;//System.out.println(t + " " + paclen + " " + pacote.length());}}if(quebra==true){break;}}}catch(IOExceptione){}System.out.println("FUCK");}}
Classe "Comunicação" do Servidor:
packagecom.zmeck_s.tcp;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.OutputStreamWriter;publicclassComunicacao{publicstaticvoidenviarPacote(intidConexao,Stringpacote){//System.out.println("[SERVIDOR] enviou para [" + idConexao + "]: " + pacote);if(FabricaConexoes.conexoesArmazenadas.get(idConexao).pegarConectado()){try{//BufferedWriter escritorBuffer = new BufferedWriter(new OutputStreamWriter(Principal.S.getOutputStream()));intt=0;intpaclen=pacote.length();booleanquebra=false;for(inti=0;i<paclen;i++){for(intm=0;m<10000;m++){if(pacote.length()<10000){BufferedWriterescritorBuffers=newBufferedWriter(newOutputStreamWriter(FabricaConexoes.conexoesArmazenadas.get(idConexao).pegarFluxoDados().getOutputStream()));escritorBuffers.write(pacote+(char)2);escritorBuffers.flush();System.out.println("SERVIDOR >> "+pacote+(char)2);t=t+10000;quebra=true;//System.out.println("enviado");break;}else{Stringproximo=pacote.substring(0,10000);pacote=pacote.substring(10000,pacote.length());BufferedWriterescritorBuffers=newBufferedWriter(newOutputStreamWriter(FabricaConexoes.conexoesArmazenadas.get(idConexao).pegarFluxoDados().getOutputStream()));escritorBuffers.write(proximo);escritorBuffers.flush();System.out.println("SERVIDOR >> "+proximo);//System.out.println("enviado");t=t+10000;}}if(quebra==true){break;}}}catch(IOExceptione){}}}publicstaticvoidenviarPacoteTodos(Stringpacote){intnConexoes=FabricaConexoes.conexoesArmazenadas.size();for(inti=0;i<nConexoes;i++){try{System.out.println("[SERVIDOR] enviou para ["+FabricaConexoes.conexoesArmazenadas.get(i).pegarIdConexao()+"]: "+pacote);if(FabricaConexoes.conexoesArmazenadas.get(i).pegarConectado()){BufferedWriterescritorBuffers=newBufferedWriter(newOutputStreamWriter(FabricaConexoes.conexoesArmazenadas.get(i).pegarFluxoDados().getOutputStream()));escritorBuffers.write(pacote);escritorBuffers.flush();}}catch(IOExceptione){e.printStackTrace();}}}}
O método Base64 codifica a String usando UTF-8 como encoding. Você se certificou que as demais Strings do seu programa usam o mesmo encoding?
jubapunx
Não… Na realidade nunca tinha verificado ou usado algum tipo de “encoding”.
Eu suspeito que o erro é na transmissão da informação, porque Na primeira parte dá certo, aparece a imagem do perfil, porém quando eu tento fazer pelo filtro é que dá erro (que é quando eu uso o Timer, que é assíncrono).
jubapunx
Eu já usei os métodos em um programa local, tudo ok.
Vou tentar resolver o erro mais tarde, aí posto qual a solução que eu usei. Mas com certeza é problema na transmissão de dados. Realmente deve ser a assincronia do Timer e do Socket, usando os dois juntos ainda, aí que deve ter dado problema. xD
jubapunx
Finalmente arranjei tempo para trabalhar em cima do projeto e consegui resolver o erro!
Ao invés de enviar de 10 mil em 10 mil caracteres para o servidor e identificar o final do pacote por um (char)2, eu voltei a fazer como antigamente, enviar tudo de uma vez só.
sock.write(pacote)
sock.flush();
O resto é só lógica de programação, como redimensionar as imagens antes de envia-las ao servidor e usar JPG ao invés do pesado PNG. xD
Obrigadão aê ViniGodoy. Você é professor na PUC daqui de Curitiba né? Já invadi uma sala lá pra ajudar aluno em prova de programação, mas não na sua matéria kkkkk’.