terça-feira, 14 de agosto de 2012

RE: RES: [java-br] Socket

·

a resposta anterior ficou horrivel, separa ai de acordo com os numeros: 1,2,3,4,5 rs
> To: java-br@yahoogrupos.com.br
> From: douglaskd88@hotmail.com
> Date: Tue, 14 Aug 2012 16:46:53 +0000
> Subject: RE: RES: [java-br] Socket
>
>
> olha, acho que você deve implementar mais coisas ai que são "quase essenciais": 1 - implementar após o accept(), um sistema de login e senha.... 2 - separe um pouco as classes, faça o tratamento dos dados assim que receber a informação, quanto menos Ifs melhor 3 - fazer testes de stress, coloque um while(1<1000) na classe (cliente) para se conectar 1000x e ler/escrever 1000 no socket, depois faça outro teste, 1000 conexões e 100.000 ler/escrever no socket, de acordo com a dica abaixo(4)........... veja o tempo que demorou e quanto consumiu de memoria.....acompanhe o processamento e banda do servidor 4 - quando um cliente realiza conexão é criada uma nova thread para esse cliente, ai ele envia as informações e desconecta...eu acho que nesse caso é legal você manter a conexão ativa, segurando uma thread la na classe do cliente, por exemplo, se conectou...vai enviando informações a vontade, se alguma tentativa falhar, conecta novamente. 5 - trate as exceções com carinho, de inicio tudo bem você vai dando exception e descobrindo onde esta os maiores problemas, mais depois com o tempo, tente tratar as exceções antes delas ocorrerem, para minimizar erros nos clientes. (que seja com ifs) 6 - de acordo com a dica acima(5), se pelo que eu entendi, eu tenho um GPS e falhou vai dar erro e ja era...ai é problema, por que erros vão ter....você vai ter que ter uma tolerancia a esses erros, por exemplo se eu recebi a requisição agora: 20s e não recebi a de 40s, você pode ter um Log e marca-lo, porém sem deixar de funcionar o cliente... qualquer dúvida estamos ai To: java-br@yahoogrupos.com.br
> From: lvctecno@yahoo.com.br
> Date: Tue, 14 Aug 2012 12:13:49 -0300
> Subject: RES: [java-br] Socket
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> Ola Marcelo obrigado pelo interesse na ajuda.
>
>
>
> Deixa eu te passar o cenário do problema:
>
>
>
> Tenho um aplicativo rodando em Android que se comunica através de HTTP
>
> (paginas jsp) com servidor Tomcat, trabalho com sistemas de rastreamento
>
> cada aparelho me envia de 60 em 60 segundos sua id e localização.
>
>
>
> Cada aparelho faz em media 5 requisições por minuto, incluso o envio de
>
> localização, ae tu multiplica isso por 100 aparelhos e vamos chegar na casa
>
> das 500 requisições por minuto, o que as paginas estão dando conta sem
>
> problemas.
>
>
>
> O meu problema está no consumo, pois cada requisição hoje, me enviando 0 ou
>
> 1 ou nada, consome no aparelho 1Kb, quando percebi que via socket consome
>
> somente 1k, ou seja 1023k a menos.
>
>
>
> Consegui depois de muito penar na web, construir um servidor socket assim
>
> (sei que devo estar fazendo altos sacrilégios, mas foi como consegui chegar
>
> e até então meu conhecimento em sockets era abaixo de zero) :
>
>
>
> Na classe principal:
>
>
>
> public static void main(String[] args) throws IOException {
>
>
>
> ServerSocket serverSocket = new ServerSocket(PORTA);
>
>
>
> System.out.println("INICIADO");
>
>
>
> while(true){
>
>
>
> Socket socket = serverSocket.accept();
>
>
>
> new ServicoThread(socket).start();
>
>
>
> }
>
>
>
> }
>
>
>
> Na classe Serviço:
>
>
>
> public class ServicoThread extends Thread {
>
>
>
> private final Socket socket;
>
>
>
> public ServicoThread(Socket socket) {
>
>
>
> this.socket = socket;
>
>
>
> }
>
>
>
> @Override public void run() {
>
>
>
> try {
>
>
>
> DataInputStream in = new
>
> DataInputStream(socket.getInputStream());
>
>
>
> DataOutputStream out = new
>
> DataOutputStream(socket.getOutputStream());
>
>
>
> ExecutaServico es = new ExecutaServico(in);
>
>
>
> es.enviar(out);
>
>
>
> out.close();
>
>
>
> in.close();
>
>
>
> socket.close();
>
>
>
> } catch (IOException e) {
>
>
>
> e.printStackTrace();
>
>
>
> }
>
>
>
> }
>
>
>
> }
>
>
>
> Na classe executora assim:
>
>
>
> public ExecutaServico(DataInputStream in) {
>
>
>
> String nomeServico = "";
>
>
>
> try {
>
>
>
> this.servico = DataInputStream.readUTF(in).toString().trim();
>
>
>
> if(servico.trim().equals("02")){
>
>
>
> nomeServico = "LOCALIZACAO";
>
>
>
> this.id = DataInputStream.readUTF(in);
>
>
>
> this.latitude = DataInputStream.readUTF(in);
>
>
>
> this.longitude = DataInputStream.readUTF(in);
>
>
>
> this.velocidade = DataInputStream.readUTF(in);
>
>
>
> }
>
>
>
> public void enviar(DataOutputStream out) throws IOException{
>
>
>
> if (this.servico.equals("02")) { //LOCALIZAÇÃO
>
>
>
> int i = cadastrarPosicao();
>
>
>
> if(i > 0){
>
>
>
> out.writeUTF("1");
>
>
>
> } else {
>
>
>
> out.writeUTF("0");
>
>
>
> }
>
>
>
> }
>
>
>
> public synchronized int cadastrarPosicao(){
>
>
>
> int i = 0;
>
>
>
> try {
>
>
>
> cs = bd.conectar().prepareCall("{call
>
> qry_001(?,?,?,?)}");
>
>
>
> cs.setString(1, id);
>
>
>
> cs.setString(2, latitude);
>
>
>
> cs.setString(3, longitude);
>
>
>
> cs.setString(4, velocidade);
>
>
>
> i = cs.executeUpdate();
>
>
>
> } catch (SQLException ex) {
>
>
>
> ex.printStackTrace();
>
>
>
> } finally {
>
>
>
> try {
>
>
>
> if (cs != null){
>
>
>
> cs.close();
>
>
>
> cs = null;
>
>
>
> }
>
>
>
> } catch (SQLException c){ }
>
>
>
> bd.desconectar();
>
>
>
> }
>
>
>
> return i;
>
>
>
> }
>
>
>
> Bom via de regra geral funciona, mas não tenho coragem de colocar em
>
> produção, porque não estou acreditando que este dará conta da quantidade de
>
> requisições, com apenas dois aparelhos em laboratório, a quantidade de
>
> deadlocks é pequena, mas existe, mas com um grande quantidade acredito que
>
> vá explodir.
>
>
>
> Se vc puder me ajudar a enquadrar isso que eu fiz até aqui, na maneira como
>
> vc descreveu e conseguirmos montar alguma coisa que responda a uma grande
>
> quantidade de requisições, a gente tenta encarar.
>
>
>
> Fique a vontade se quiser me adicionar no MSN.
>
>
>
> De antemão muito obrigado pelas informações, cara valeu.
>
>
>
> Luciano
>
>
>
> De: java-br@yahoogrupos.com.br [mailto:java-br@yahoogrupos.com.br] Em nome
>
> de MarceloMF
>
> Enviada em: terça-feira, 14 de agosto de 2012 11:01
>
> Para: java-br@yahoogrupos.com.br
>
> Assunto: Re: [java-br] Socket
>
>
>
> Olá Luciano,
>
>
>
> O protocolo http roda em cima do protocolo TCP, você provavelmente devera
>
> escolher entre 2 protocolos:
>
>
>
> TCP - Estabelece conexão, realiza o 3way handshake:
>
> PC1 -------------->(SYN) PC2 (Primeiro pacote solicitando conexão)
>
> PC2 ----->(SYN+ACK) PC1 (Segundo pacote confirmando o recebimento do
>
> primeiro)
>
> PC1 -------------->(ACK) PC2 (Terceiro pacote confirmando o recebimento do
>
> segundo e estabelecendo a conexão)
>
>
>
> UDP - Não estabelece conexão, não realiza o 3way handshake, por isso é
>
> utilizado para funcionalidades como streeming.
>
>
>
> Então é provável que você utilize o TCP, dessa forma você devera criar um
>
> protocolo para trafegar suas informações, normalmente ele se divida em 2
>
> partes:
>
> header -> Informações gerais sobre o pacote/mensagem
>
> payload -> Conteúdo do pacote/mensagem
>
>
>
> Exemplo de header:
>
> NOME_TRANSACAO(10POSICOES C/ " " A ESQUERDA)+TAMANHO_PAYLOAD(10POSICOES C/
>
> 0 A ESQUERDA)+PAYLOAD(VARIÁVEL)+HASH_PACOTE(64 POSIÇÕES)
>
>
>
> Exemplo de payload:
>
> NOME_INFORMACAO1(10POSIÇÕES C/ " " A
>
> ESQUERDA)+TAMANHO_INFORMACAO1(10POSIÇÕES C/ 0 A
>
> ESQUERDA)+INFORMACAO1(VARIÁVEL)
>
> +NOME_INFORMACAO2(10POSIÇÕES C/ " " A
>
> ESQUERDA)+TAMANHO_INFORMACAO2(10POSIÇÕES C/ 0 A
>
> ESQUERDA)+INFORMACAO2(VARIÁVEL)
>
> +NOME_INFORMACAO3(10POSIÇÕES C/ " " A
>
> ESQUERDA)+TAMANHO_INFORMACAO3(10POSIÇÕES C/ 0 A
>
> ESQUERDA)+INFORMACAO3(VARIÁVEL)
>
>
>
> O seu pacote:
>
> HEADER+PAYLOAD
>
>
>
> Perceba que os campos do header são fixo e que o payload é variável. Como
>
> você define o tamanho do payload e o tamanho de cada informação dentro do
>
> payload, é possível realizar o parser da string tranquilamente.
>
>
>
> Não sei qual sua necessidade, mas considere utilizar webservices, seja
>
> rest, wsdl, ou mesmo JMS.
>
>
>
> Depois de definido o layout do seu protocolo, virá a parte mais legal, que
>
> é definir como o seu servidor irá processar essas mensagens.
>
>
>
> Nesse ponto sugiro uma lida no livro Programação de rede Unix, Capitulo 30
>
> -> Alternativas de projeto cliente/servidor, irei listar os tópicos, pois
>
> sei que pode te ajudar.
>
>
>
> 30.4 - > Servidor TCP Interativo
>
> 30.5 -> Servidor TCP concorrente, um filho por cliente
>
> 30.6 -> Servidor TCP pré-bifurcado, sem bloqueio accept
>
> 30.7 -> Servidor TCP pré-bifurcado, bloqueio de arquivo em torno de accept
>
> 30.8 -> Servidor TCP pré-bifurcado, bloqueio de thread em torno de accept
>
> 30.9 -> Servidor TCP pré-bifurcado, passagem de descritor
>
> 30.10 -> Servidor TCP concorrente, um thread por cliente
>
> 30.11 -> Servidor TCP pré-threaded, um accept por thread
>
> 30.12 -> Servidor TCP pré-threaded, thread principal chama accept
>
>
>
> Acima temos exemplos da utilização de forks e threads, no seu caso,
>
> provável que utilize threads e definir como funcionara suas threads/pool de
>
> threads será crucial para a escalabilidade da sua aplicação. Sugiro que
>
> você abstraia a linguagem e se concentre nos conceitos... dessa forma você
>
> irá conseguir desenvolver algo bacana.
>
>
>
> O Java - Como programar do Deitel possui exemplos simples de como trabalhar
>
> com sockets/threads, legal para fazer e ver funcionando, mas sinceramente
>
> deixa a desejar e por isso recomendei o Programação de rede Unix como
>
> literatura auxiliar.
>
>
>
> Na mesma linha, você pode pesquisar sobre JAVA NIO(caso você possua *muitas
>
> transações* concorrentes) e também se preocupar com a criptografia dos
>
> pacotes... seja ela feita na camada de apresentação ssl/tls ou a nível de
>
> aplicação, seja simétrica ou assimétrica.
>
>
>
> Boa sorte! Inveja alheia... queria estar com um problema desses nas mãos
>
> \o/.
>
>
>
> []s
>
>
>
> --
>
> Att, Marcelo M. Fleury
>
> Blog - http://marcelomf.blogspot.com/
>
> Slides - http://www.slideshare.net/marcelomf/
>
>
>
> "O primeiro dever da inteligência é desconfiar dela mesma." By Einstein
>
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> ------------------------------------
>
> Para sair da lista, envie email para: java-br-unsubscribe@yahoogroups.com
> Para upload/download de arquivos: http://www.yahoogroups.com/files/java-brLinks do Yahoo! Grupos
>
>


[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

Para sair da lista, envie email para: java-br-unsubscribe@yahoogroups.com
Para upload/download de arquivos: http://www.yahoogroups.com/files/java-brLinks do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/java-br/

<*> Para sair deste grupo, envie um e-mail para:
java-br-unsubscribe@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html

0 comentários:

Pague com LPs do Mister Colibri

Pague com LPs do Mister Colibri
Quer comprar celular,Tablet,pen drive, GPS e muito outros produtos e ainda podendo pagar tudo em LPs ?Pois saiba que isso é possível,basta você visitar o site downloadstotal.com e realizar a sua compra com toda tranquilidade e segurança!!!

Hora

Online

Arquivo do Blog