sábado, 18 de agosto de 2012

RES: [java-br] Socket

·

 

Boa tarde pessoal,

O negocio é mais complicado do que tudo, meu Deus.

A classe servidor ficou assim:

public Principal() {

try{

ServerSocketChannel servidor = ServerSocketChannel.open();

servidor.configureBlocking(false);

selec = SelectorProvider.provider().openSelector();

InetSocketAddress enderecoLocal = new InetSocketAddress(PORTA);

servidor.socket().bind(enderecoLocal);

System.out.println("INICIADO");

servidor.register(selec, SelectionKey.OP_ACCEPT);

while(true){

selec.select();

Set readyKeys = selec.selectedKeys();

Iterator i = readyKeys.iterator();

while(i.hasNext()){

SelectionKey selecionada = (SelectionKey) i.next();

i.remove();

if(selecionada.isAcceptable()){

iniciarConexao(selecionada);

}

if(selecionada.isValid() && selecionada.isReadable()){

receberEnviarDados(selecionada);

}

}

}

} catch (Exception exc){

exc.printStackTrace();

}

}

public void iniciarConexao(SelectionKey skey) throws Exception{

ServerSocketChannel servidor = (ServerSocketChannel) skey.channel();

SocketChannel conexao = servidor.accept();

conexao.configureBlocking(false);

conexao.register(selec, SelectionKey.OP_READ);

}

public void receberEnviarDados(SelectionKey skey) throws Exception{

SocketChannel conexao = (SocketChannel) skey.channel();

buffer = ByteBuffer.allocate(1024);

conexao.read(buffer);

byte recebido[] = buffer.array();

buffer.flip();

String dados = new String(recebido);

if (dados.trim() != null){

Servico servico = new Servico();

String resposta = servico.ExecutaServico(dados);

buffer.clear();

CharBuffer.wrap(resposta);

buffer.flip();

conexao.write(buffer);

}

}

Está muito rápido e confiável, mas agora surgiu outro problema:

Cada vez que desconecto usando o cliente, o Server cai e/ou fica dando erro
de null direto, não para mais, já tentei tratar o recebimento de null na
linha: If (dados.trim() != null) mas não resolveu não.

E estou conseguindo enviar comandos pro Server na boa mas naum estou
conseguindo receber a resposta, alguém sabe dizer o que estou fazendo
errado?

No cliente estou fazendo assim:

SocketChannel cliente = SocketChannel.open();

InetSocketAddress endereco = new InetSocketAddress(ip_servidor,
porta);

cliente.connect(endereco);

ByteBuffer buffer = ByteBuffer.allocate(30);

String enviar = "02|"+id+"|"+lat+"|"+lon+"|"+vel;

buffer =
ByteBuffer.wrap(enviar.getBytes());

int num = cliente.write(buffer);

Log.d("BYTES ENVIADOS", String.valueOf(num));

//ATE AQUI FUNFANDO
PERFEITAMENTE----------------------------------------------------------

//NA HORA DE RECEBER É QUE ESTÁ DIFICIL

buffer.clear();

cliente.read(buffer);

buffer.position(0);

byte recebido[] = buffer.array();

buffer.flip();

String dados = new String(recebido);

Log.d("BYTES RECEBIDOS", dados);

try{

cliente.finishConnect();

} catch(IOException x){ }

Desde já agradeço a ajuda de todos.

Luciano

De: java-br@yahoogrupos.com.br [mailto:java-br@yahoogrupos.com.br] Em nome
de MarceloMF
Enviada em: quinta-feira, 16 de agosto de 2012 13:23
Para: java-br@yahoogrupos.com.br
Assunto: Re: [java-br] Socket

Oi Luciano,

Em 15 de agosto de 2012 09:46, Luciano Coelho <lvctecno@yahoo.com.br
<mailto:lvctecno%40yahoo.com.br> >escreveu:

> **
>
>
>
>
> Fala Marcelol,
>
>
> Perceba que o seu metodo de salvar no banco esta synchronized(mutex), isso
> quer dizer que esse método não sera executado em paralelo, algum motivo
> especial para isso ?
> R. já retirei isso
>
>
> Reforço a necessidade de realizar os testes de estresse! Enquanto eles
> estiverem rolando, utilize o visualvm(ou algum outro aplicativo para
> profiling java) para ver o comportamento das threads(se elas estão
morrendo
> normalmente), também acompanhe suas conexões com netstat -nab no windows
ou
> netstat -nap no linux.
> R. vou verificar
>
>
> Perceba que sua aplicação esta abrindo uma thread para cada requisição...
> ou seja, você tem +- 8 requisições por segundo, em 1hr você teria 28800
> threads... será que elas estão morrendo normalmente ? Será que os sockets
> estão sendo finalizados realmente ? Tem que testar/monitorar/ajustar
> código....
> R. tem como saber se o socket está sendo encerrado corretamente? Estou
> usando o nios assim, :
>
>
A melhor forma é monitorar com o netstat -na

> Selector acceptSelector = SelectorProvider.provider().openSelector();
>
> ServerSocketChannel ssc = ServerSocketChannel.open();
>
> ssc.configureBlocking(false);
>
> InetAddress lh = InetAddress.getLocalHost();
>
> InetSocketAddress isa = new InetSocketAddress(lh, PORTA);
>
>
> ssc.socket().bind(isa);
>
> SelectionKey acceptKey = ssc.register(acceptSelector,
> SelectionKey.OP_ACCEPT);
>
> int keysAdded = 0;
>
> while ((keysAdded = acceptSelector.select()) > 0) {
>
> Set readyKeys = acceptSelector.selectedKeys();
>
> Iterator i = readyKeys.iterator();
>
> while (i.hasNext()) {
>
> SelectionKey sk = (SelectionKey)i.next();
>
> i.remove();
>
> ServerSocketChannel nextReady =
> (ServerSocketChannel)sk.channel();
>
> Socket s = nextReady.accept().socket();
>
> DataInputStream in = new
> DataInputStream(s.getInputStream());
>
> DataOutputStream out = new
> DataOutputStream(s.getOutputStream());
>
>
> ExecutaServico es = new ExecutaServico(in);
>
> es.enviar(out);
>
> out.close();
>
> in.close();
>
> }
>
> }
>
> Por padrão no linux por exemplo, você normalmente tem um limite de 1024
> arquivos para serem abertos... sugiro que você ajuste para 64000, da uma
> olhada no ulimit e /etc/security/limits.conf, além disso existem as
> limitações de file descriptors, mas acho que não será necessário.
> R. o servidor eh Windows 2008 web, sabe onde posso fazer esse ajuste?
>
>
> Do que eu entendi da sua aplicação, faria o seguinte:
>
> Fazer com que o sistema aceite por parâmetro um numero máximo de threads,
> acredito que 10 seria o suficiente. O resto das requisições entrariam em
> uma fila(isso, quando necessário), dessa forma você teria um pool de
> threads de até 10 threads(assim você irá aliviar o GB e o sistema
> operacional)... Utilizaria singleton para conexão com o banco de dados e
> não deixaria a requisição com o banco synchronized(mutex).
> R. Onde configuro no sistema o Maximo de threads?
>
>
Não é configurável... você vai precisar desenvolver... encontrei alguns
exemplos no google, pesquisando por: java pool threads

Tem algum material falando sobre singleton, vou pesquisar na web, mas se
> tiver alguma coisa especifica.
>

Acredito que você já tenha encontrado, mas achei rápido aqui:
http://java.sun.com/developer/technicalArticles/Programming/singletons/

> Já tirei o synchronized.
>
> Cara mais uma vez obrigado pelas dicas.
>

Por nada, gostaria de conseguir ajudar mais... desculpe ai pelo delay nas
respostas.

[]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]

__._,_.___
Atividade nos últimos dias:
Para sair da lista, envie email para: java-br-unsubscribe@yahoogroups.com
Para upload/download de arquivos: http://www.yahoogroups.com/files/java-br
Não passe mais um Dia dos Namorados sozinho(a). Conheça o Y! Encontros.

Ofertas HP: ProBook 4430s

Ainda dá tempo de encontrar companhia para passar o Dia dos Namorados!
.

__,_._,___

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