Pessoal, estou desenvolvendo um programa com base no BlueChat(programa de conversa que usa BlueTooth) . O meu problema é que tem um momento que os celulares clientes enviam mensagens ao mesmo tempo, ou seja, acessam o servidor ao mesmo tempo.
Eu tentei usar synchronized, mas só piorou a situação, quando tiro o synchronized, this.wait(), etc , funciona menos pior , somente no final que dá problema.
O pedaço do código segue abaixo : (Esse código faz parte do servidor,é ele que faz a função de leitura do que os clientes escrevem)
synchronized(this)
{
if( cont == 0 || nomeGarçom.equals(endpt.remoteName) )
{
arrayStringPedido[cont] = datain.readUTF();
nomeGarçom=endpt.remoteName;
log("read in SIGNAL_SEND_PEDIDO name "+arrayStringPedido[cont]+" from "+endpt.remoteName);
cont++;
}
else
{
try
{
log(endpt.remoteName+" (NA ESPERA -- NA ESPERA -- NA ESPERA -- NA ESPERA -- NA ESPERA -- NA ESPERA) PARA ENVIO DE MEU PEDIDO");
this.wait();
}
catch(InterruptedException e)
{}
}
}
}else if ( signal == NetLayer.SIGNAL_TERMINATE_SEND_PEDIDO )
{
datain.readUTF();
PedidoRecordStore objPedidoRecordStore = new PedidoRecordStore ();
// update the message screen to reflect the entered message.
// create a dummy packet object to hold the entered message.
ChatPacket packet = new ChatPacket( NetLayer.SIGNAL_TERMINATE_SEND_PEDIDO, endpt.remoteName, "Pedido: "+(objPedidoRecordStore.buscaNumRecords()+1)+" acaba de chegar" );
messageui.msgs.addElement( packet );
messageui.repaint();
log(" NetLayer.SIGNAL_TERMINATE_SEND_PEDIDO -- NetLayer.SIGNAL_TERMINATE_SEND_PEDIDO (CONT VALUE:) "+cont);
cont=0;
objPedidoRecordStore.salvaPedido( arrayStringPedido );
synchronized(this)
{
this.notifyAll();
}
}
Pessoal, vou detalhar mais:
Eu quero fazer que o servidor seje bloqueado quando um cliente estiver usando ele. Eu tentei , mas acho que está acontecendo o seguinte: Quando o primeiro cliente manda mensagens ,e outro cliente manda logo depois (enquanto o primeiro ainda está mandando)o servidor é bloqueado ( this.wait() ) e aí dá problema pros dois clientes … Acaba que dá maior bagunça e eu não consigo o sucesso …
Quando eu tiro o synchronized, this.wait(), notifyAll() funciona bem (acho que porque cada cliente cria uma instância própria do servidor pra ele, então funciona bem). Mas, no final, quando checo no servidor, vejo que perdeu o sincronismo e afeta no funcionamento do uso de uns RecordStores que eu tenho …
Pessoal, preciso muito da ajuda de alguém … Se quiserem (acho que vai ser melhor) posso mandar o projeto pra vcs entenderem melhor o que estou dizendo. Mas, se alguém já teve a mesma experiência e conseguiu a solução , por favor , me ajude , tb.
Obrigado,
Raphael.
Pensando melhor :Já coloquei o projeto em Anexo. (é um projeto J2ME que usa BlueTooth, o BlueWaiter é o cliente e o BlueKitchen é o servidor. Pra fazer o teste e entender o q eu falei é só abrir 3 instâncias clientes, cadastrar algum pedido e enviar , tentar enviar com quase nenhum intervalo entre os envios de cada instância.Tentar enviar os pedidos dos clientes quase ao msm tempo , deu pra entender?)Lembrando que os clientes e servidor tem que ser do msm tipo (na tela de entrada vcs vão ver o q é o tipo q eu falo); os celulares clientes têm que ser de nomes diferentes(tb, tela da entrada). Depois do envio dos pedidos é só checar no servidor , opção de comunicação e vcs vão ver o problema q eu tenho)
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHH!!!
Por favor, me ajudem.
EDIT - Por favor, quando postar código, use a tag [ code ] (use o botãozinho na página) porque o código é reformatado e a compreensão torna-se difícil, se você não usar a tag [ code ].