Enviar um objeto da máquina do cliente para o servidor, tem como?  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
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.
[WWW]
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
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).
[WWW]
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ê.
[WWW]
Grinvon
GUJ Master
[Avatar]

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.
[MSN] [ICQ]
Grinvon
GUJ Master
[Avatar]

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.
[MSN] [ICQ]
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
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.
[WWW]
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
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).
[WWW]
Pilantra
JavaEvangelist
[Avatar]

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.
[WWW] [MSN]
Pilantra
JavaEvangelist
[Avatar]

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
[WWW] [MSN]
Insônia
Debugger
[Avatar]

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
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team