| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 08:56:55
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Olá pessoal.
Estou ferrado hehe, não faço a minima idéia de como fazer isso, acho que nem vou conseguir explicar. Mas vou tentar. A minha aplicação faz o ponto eletrônico da pessoa. E pra fazer a validação, é preciso que a digital do cara que acabou de colocar, seja comparada com todas que estão cadastradas no banco de dados, até que ache uma que combine. Quando ele encontrar, para o laço e faz o restante do processo. Isso funciona perfeitamente, mas se torna lento por 2 fatores. Primeiro que a conexão do cliente tem que ser boa para resultar numa consulta rápida e o servidor precisa ser especialmente para esse tipo de aplicação. E nenhuma dessas condições estão a meu favor hehe. Então estavamos discutindo sobre o assunto e vimos que a melhor solução seria, enviar esse objeto para o servidor e com um JSP lá no servidor, fazer a mesma coisa que faz localmente.
A pergunta é, como eu faço pra enviar um objeto para o servidor?
Agradeço a ajuda.
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 09:37:16
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Depende; como você disse, várias coisas estão contra você.
No seu caso, mandar um objeto serializado para o servidor parece uma boa idéia, mas não é adequada na prática porque as versões das classes no software do cliente e do servidor têm de ser mantidas sempre sincronizadas, o que pode ser complicado por exemplo se as versões do Java no cliente e no servidor são diferentes por algum motivo.
Você pode fazer o objeto implementar Externalizable e criar o seu próprio formato de serialização para evitar alguns problemas relativos ao uso de classes que têm versões e representações diferentes de uma versão para outra do Java. Isso parece um pouco melhor.
Ou então você pode separar os dados importantes do seu objeto, e usar um formato padrão (como XML e Web Services usando REST, como o pessoal costuma fazer). É que não sei qual é o tamanho do seu objeto; dá a impressão que você precisa mandar cerca de 10 KBytes de dados, o que não é nenhum problema hoje em dia.
No seu caso (em que você tem de ficar checando uma digital contra várias digitais diferentes no banco de dados) isso realmente deve ser deixado a cargo do servidor, porque acesso remoto a banco de dados simplesmente não funciona bem.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 09:43:38
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Olá thingol, opbrigado pela rsposta. Então, esse objeto é um template que é gerado pelo leitor biométrico, o tamanho dele fica entre 90Kb e 110Kb. Chegamos a conclusão que se existem 500 funcionários, isso ia gerar uma banda relativamente alta.
Bom, o jeito então é enviar o objeto serializado? Por enquanto as versões do Java são iguais. Vou pesquisar sobre isso.
Obrigado.
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 10:49:48
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Só uma pequena dúvida que me surgiu. Eu teria que usar RMI para essa situação?
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 10:54:16
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Quanto a banda, nada que um bom java.util.zip não faça por você.
Esses dados podem ser comprimidos antes de serem mandados?
Não recomendaria RMI, mas o que o pessoal lhe sugeriu (um servlet). É que é mais fácil você fazer um servlet funcionar em ambiente Extranet e Internet (você sabe, aplicações costumam ser vítimas de seu próprio sucesso, então não pense que só vai funcionar dentro da sua empresa... seu chefe vai querer usar e demonstrar isso com o servidor na empresa e um notebook na Internet, fora da empresa) que RMI (que mal e mal funciona em ambiente Intranet devido à necessidade de abrir um monte de portas no firewall).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 10:58:00
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Também não recomendo objetos serializados. Digamos que você queira usar a JRE que normalmente vêm nos computadores hoje em dia (JRE 6.0). Ela é atualizada automaticamente, e duvido que o servidor fique atualizando automaticamente na mesma velocidade que os clientes (que podem estar atualizados automaticamente ou não). A menos que você customize a serialização, talvez seja melhor usar algo com Web Services com REST ou coisa parecida, e para mandar os dados você precisa provavelmente ver se os templates podem ser bem comprimidos pelo algoritmo do java.util.zip. (Pegue um template, copie-o para um arquivo, e monte um arquivo .zip com o seu software de compressão preferido, como o zip.exe, jar.exe, PKZIP ou WinZip (formato Zip é claro). Veja se a compressão é boa para você.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 11:23:04
|
Grinvon
GUJ Master
![[Avatar]](/images/avatar/aff0a6a4521232970b2c1cf539ad0a19.png)
Membro desde: 18/08/2003 22:10:49
Mensagens: 1899
Localização: Em qualquer lugar
Offline
|
Sendo a imagem média de 110kb, daria por volta de uns 55 megas diários, tendo na média de 500 funcionários como você abordou.
Acredito que o que thigol falou é mais sensato, com compactação esses dados devem diminuir consideravelmente, provavelmente você irá ocupagar a média de 30%-40% menos de banda do que o previsto.
Serializar ocorre o problema que thigol mostrou, você precisar enviar via UDP ou outro protocolo?
|
>> Inocêncio. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 11:23:35
|
Grinvon
GUJ Master
![[Avatar]](/images/avatar/aff0a6a4521232970b2c1cf539ad0a19.png)
Membro desde: 18/08/2003 22:10:49
Mensagens: 1899
Localização: Em qualquer lugar
Offline
|
thigol, nesse caso UDP não daria "consistência" certa nos dados, não?
|
>> Inocêncio. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 11:53:45
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Eu preciso enviar por UDP mesmo!!!!
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 11:59:53
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
UDP só é legal se você tiver dados que não ultrapassem muito 1 KB (como seus dados têm cerca de 100 KB...)
Mais que isso você precisa montar um protocolo (incluindo retransmissão de dados e outras coisas complexas) que não valem a pena implementar você mesmo.
Fora isso normalmente firewalls costumam bloquear a maior parte das portas UDP.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 16:56:02
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Hum, a reunião acabou e decidi que vou usar um servlet e receber o objeto, e depois retornar uma classe com os resultados!!!! Bem mais pratico hehe, só falta saber como fazer hehe.
Obrigado pela ajuda.
Abraços.
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 17:14:04
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Dica para serializar corretamente seu objeto:
a) Se você acha que pode ter problemas de versão de objetos, então implemente a interface Externalizable.
b) Em vez de pegar o OutputStream do objeto URLConnection (que você obtém se fizer um POST) e já encapsular com um ObjectOutputStream, é melhor fazer o seguinte: crie um ByteArrayOutputStream, encapsule-o em um ObjectOutputStream, e então escreva o objeto e feche o stream. Então você terá um array de bytes, que poderá escrever sem problemas no OutputStream do URLConnection (é adequado, para evitar problemas, encapsular o OutputStream do URLConnection em um DataOutputStream, e mandar o tamanho do array de bytes, usando writeInt, antes do próprio array de bytes.)
c) No lado do servidor, faça o processo inverso. (DataInputStream, ByteArrayInputStream, ObjectInputStream).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/10/2007 19:54:04
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
thingol wrote:Dica para serializar corretamente seu objeto:
a) Se você acha que pode ter problemas de versão de objetos, então implemente a interface Externalizable.
b) Em vez de pegar o OutputStream do objeto URLConnection (que você obtém se fizer um POST) e já encapsular com um ObjectOutputStream, é melhor fazer o seguinte: crie um ByteArrayOutputStream, encapsule-o em um ObjectOutputStream, e então escreva o objeto e feche o stream. Então você terá um array de bytes, que poderá escrever sem problemas no OutputStream do URLConnection (é adequado, para evitar problemas, encapsular o OutputStream do URLConnection em um DataOutputStream, e mandar o tamanho do array de bytes, usando writeInt, antes do próprio array de bytes.)
c) No lado do servidor, faça o processo inverso. (DataInputStream, ByteArrayInputStream, ObjectInputStream).
Nossa, valeu cara!!!! Já estou começando a por a mão na massa.
Abraços.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/10/2007 07:45:18
|
Pilantra
JavaEvangelist
![[Avatar]](/images/avatar/0b96d81f0494fde5428c7aea243c9157.png)
Membro desde: 25/01/2005 03:29:00
Mensagens: 394
Localização: Maringá - PR
Offline
|
Os problema com versões de objetos que vocês disseram, por um acaso são esses?
java.io.StreamCorruptedException: invalid stream header: 3C68746D
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
RETORNOU OUTRA COISA null
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at classes.ObjAuth.validaPeao(ObjAuth.java:67)
at classes.ObjAuth.main(ObjAuth.java:23)
|
Gosta de Linux e Java? Acesse: http://andersonajx.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/10/2007 08:03:10
|
Insônia
Debugger
![[Avatar]](/images/avatar/c344336196d5ec19bd54fd14befdde87.png)
Membro desde: 24/03/2005 23:06:33
Mensagens: 73
Offline
|
Olá Amigo,
estou acompanhando este post, e talvez possa te ajudar. Eu já realizei uma implementacao para um problema parecido com o seu. Eu tinha um applet que integrava-se a biblioteca Finger [da empresa Griaule] (biblioteca de captura e reconhecimento de digital). Esse applet capturava a digital e enviava o template para uma Servlet processar. O trecho de codigo abaixo mostra como realizei isso no applet e no server.
applet:
No server, utilizo uma Servlet que faz o inverso:
servlet.doPost
Nao tive problemas com versao de JRE (talvez por sorte, nao sei...), nem tive problemas por criar um ObjectOutputStream diretamente do OutputStream vindo do URLConnection (idem...rs).
Mas acho que as dicas do thingol sao uteis e podem ser adaptadas facilmente ao codigo que estou postando.
Se vc nao estiver utilizando a biblioteca da Griaule, entao talvez tenha que realizar outras adaptaçoes... Caso nao esteja utilizando, vc poderia me dizer qual biblioteca utiliza? Eu só conheco a Finger, e gostaria de conhecer outras...
Espero ter ajudado!
|
SCJP, SCWCD |
|
|
 |
|
|