Enviar mensagem via TCP quando um botão em outro programa for acionado

2 respostas
B

Boa noite!

Tive dúvida até no título do post. Vou tentar explicar meu problema e uma solução que pensei.

O drsmachado já me ajudou muito no meu último post. Ele recomendou que eu fizesse através de JMS o recebimento das mensagens para serem persistidas. Assim eu fiz e funcionou perfeitamente. (Obrigado drsmachado!)

Agora tenho uma outra dúvida, como enviar uma mensagem através do TCP somente quando um botão for acionado, em outro programa.

Eu pensei no seguinte:

Quando a pessoa acionar determinado botão ele vai gravar no banco de dados a mensagem para ser enviada (É uma mensagem pré-configurada), e dentro do meu do...while() fazer uma conexão com o banco, consultar pra ver se tem alguma mensagem para o destinatário e se houver envia-la. Só que para cada mensagem recebida (Serão muitas de vários dispositivos), o programa teria q abrir uma consulta no banco de dados, consultar, retornar e só se houvesse ele enviaria, após isso ele iria alterar uma flag no BD informando que ela já foi enviada. Alguém consegue pensar em um método mais prático?

Segue meu método run() para tentar visualizar melhor.

Cada thread é aberta quando for feita uma conexão TCP:
@Override
	public void run() {
		BufferedInputStream in;
		OutputStream out;
		
		try {
			in = new BufferedInputStream(conexao.getInputStream());
			out = conexao.getOutputStream();
			System.out.println("Conexão aberta com "+conexao.getInetAddress());
			
			// Criar a sessão JMS
			Session session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE);
			queueMensagem = session.createQueue("Mensagem");
						
			// Criar o produtor JMS
			MessageProducer producer = session.createProducer(queueMensagem);
		
			// Enquanto conexão TCP estiver ativa, faça:
			do{

				//Recebo a mensagem através do in.read()
				System.out.println("Recebido");
						
                                //ENVIAR AQUI UMA MENSAGEM DE VOLTA ATRAVÉS DO OUT.WRITE()
                                //QUANDO UM BOTÃO FOR ACIONADO EM OUTRO PROGRAMA

				TextMessage mensagem = session.createTextMessage(recebido.toString());
				producer.send(mensagem);
					
				
			}while(conexao.isConnected());

			session.close();
			connection.close();                                      
			in.close();
			out.close();
			conexao.close();

		}
	}

Desculpe se não fui claro! Mas eu achei muito difícil de explicar

2 Respostas

charleston10

olha tem varias soluções pra fazer oq vc quer existem as tecnologias possiveis em java

Remote Method Invocation - RMI
Common Object Request Broker Architecture - CORBA
Sockets

Eu recomendo rmi ou sockets…

ambos tenho o exemplo.

socket
http://javaaberto.blogspot.com.br/2012/12/sockets.html

rmi
http://javaaberto.blogspot.com.br/2012/09/chat-com-rmi.html

;]

B

Então, acho q eu n consegui explicar direito, hehehe!

Eu tenho o seguinte esquema:

Muitos dispositivos enviam mensagens a cada 30 segundos para o meu servidor através de uma conexão via socket TCP. Gostaria q uma pessoa mandasse mensagens para um desses dispositivos através de um site.

Eu pensei no seguinte: A pessoa escreve a mensagem e ela será gravada no banco de dados com uma flag enviada=“false”, assim, dentro do meu código do…while(conexao.isConnected()) do socket (Código no post acima), eu faço uma verificação no banco de dados sempre que o dispositivo mandar uma mensagem para o servidor, se houver alguma mensagem para ele com a flag enviada=“false” ele envia essa mensagem através do out.writer para o dispositivo e transforma ela em enviada=“true”.

Só que como serão muitas mensagem que o dispositivo irá mandar para o servidor, ele iria ficar fazendo a verificação no banco a cada 30 segundos, para cada dispositivo (Serão muitos). Existe uma maneira melhor de fazer essa logística de envio?

Criado 21 de abril de 2013
Ultima resposta 22 de abr. de 2013
Respostas 2
Participantes 2