Usando java comm. Reaproveitar uma porta ja aberta...é possivel?

4 respostas
B

Ola a todos…

Deixa eu explicar melhor.
Tenho um applet que abre uma porta serial atraves do comando básico que a gente encontra facil facil pela net:

portId = CommPortIdentifier.getPortIdentifier(porta);

serialPort = (SerialPort) portId.open("LeitorPorta", 2000);

inputStream = serialPort.getInputStream();
...

Então toda vez que saio da tela (e o aplet é encerrado) eu nao consigo reutilizar novamente a porta sem te-la fechado no metodo destroy do applet.

Eu queria fazer algo como isso:

//Aqui eu consigo capturar quem esta ocupando esta porta
if(portId.getCurrentOwner()!="LeitorPorta") {
					serialPort = (SerialPort) portId.open("LeitorPorta", 2000);
				} else {
					//Eu inventei esse metodo só pra ilustrar minha ideia
                                        serialPort =  portId.getPortInUse();

				}

Alguem sabe se isso é possível?
Ou infelizmente terei que abrir e fechar a porta toda vez que entrar/sair da tela?

Obrigado a todos
T+

4 Respostas

T

Você não pode reaproveitar a porta, porque isso é uma restrição do sistema operacional (que não permite abrir duas vezes consecutivas a porta). Encontre todos os eventos do tempo de vida da applet (como “stop” ou “destroy”) para poder fechar a porta. Se mesmo assim não conseguir, ponha uma mensagem do tipo “Feche o browser e entre novamente”) se tiver algum problema de já achar a porta aberta (argh).

G

thingol falou tudo acho que não ha nada mais a dizer então e isto brother ! e só seguir o que lhe foi passado pelo thingol.

B

Ola rapaziada, obrigado pela resposta.

Então, a porta foi aberta pelo meu próprio processo. Funciona +/- assim:

  • O usuario entrou na aplicacao e o browser executou o applet que abriu a porta;
  • Depois o usuario entrou em uma outra tela (no mesmo browser) e o applet que abriu a porta foi “destruído”, mas no stop e destroy eu não fechei a porta (não usei o .close() );
  • Aí o usuário voltou a tela que tem o applet, e com isso ele (o applet) executa novamente o processo de abrir a porta.

Nesse novo processo de abertura eu consigo identificar QUEM abriu (ou deixou ) a porta aberta. MAS não consigo ir além disso.

Eu sei que poderia fechar a porta no destroy do applet, mas queria evitar isso, pq o certo é a porta ficar aberta durante todo o tempo que o sistema estiver sendo utilizado pelo usuário.

Resumindo: Abri a porta, mas nao quero que ela seja fechada qdo o applet for destruído.

A minha esperança é: Se eu consigo obter QUEM deixou a porta aberta será que nao consigo capturar (não sei se esse é o termo correto) essa porta e continuar utilizando-a (ja que foi o meu próprio processo que a deixou aberta)?

Obrigado e um Feliz Ano Novo a todos!

G

Cara, sinseramente não estou entendendo a sua necessidade de ter esta porta aberta todo tempo ? Pq veja bem para vc enviar, abre a porta e envia, ai fecha a porta. Para receber tem um gerenciador de eventos que fica monitorando os eventos na porta, quando chega alguma coisa na porta vc vai adicionando em um buffer, ai pode ser global este. Despois vc vai la abre a porta e inicializa um thread para aquela porta espera por alguns segundo pq pode ser que o passo anterior não tenha acontecido ou seja, os dados cheguem depois que inicializou a thread. Depois disto obtem os dados do buffer e manda para a camada superior ou a que vc estiver usando e fecha a porta. O processo e este, faço isto utilizando comunicação full-duplex, ou seja estou recebendo e enviando “simultaneamente”, então não entendo esta nessecidade. Mas todo caso vc tem um descritor SerialComm que contem as configurações da porta, este e um objeto, o jeito de vc fazer isto seria obtendo e passando este para ser verificado depois se e null ou nao.

Espero ter te ajudado.

Criado 23 de dezembro de 2008
Ultima resposta 27 de dez. de 2008
Respostas 4
Participantes 3