Monitorando as mensagens recebidas

3 respostas
das_iommi

Olá a todos!

Preciso fazer uma implementação num programa Java aqui, que monitore as mensagens recebidas de uma determinada aplicação.
Basicamente, eu conecto nessa aplicação e fico aguardando as mensagens que ela manda.
Queria receber essas mensagens diretamente no Main.java. Em C# eu fiz a mesma coisa com EventHandler.

Segue um exemplo abaixo do código feito em C#:

Aplicacao.cs
internal class Aplicacao
{
    internal event EventHandler<MessageEventArgs> MessageReceived;
    ...
    public void fromApp(String message)
    {
        this.MessageReceived(this, new MessageEventArgs(message));
    }
	...
}
MessageEventArgs.cs
internal class MessageEventArgs : EventArgs
{
    private String _message;

    internal String Message
    {
        get { return _message; }
        set { _message = value; }
    }

    internal MessageEventArgs(String msg)
    {
        _message = msg;
    }
}
Program.cs
static Aplicacao _applicacation
static void Main(string[] args)
{            
    Console.WriteLine("Starting application...");
    _application = new Aplicacao();
	_application.MessageReceived += new EventHandler<MessageEventArgs>(_application_MessageReceived);
	Conectar(); //conecta na aplicação server e monitora as mensagens recebidas
	...
}

static void _application_MessageReceived(object sender, MessageEventArgs e)
{
    Console.WriteLine("Mensagem recebida!" + e.ToString()); //cada mensagem que recebo eu escrevo na tela
}

Como posso fazer exatamente isso em Java?

3 Respostas

M

Essas informações serão recebidas a partir de onde?

das_iommi

De uma aplicação que gera mensagens, de texto mesmo. Essa aplicação usa sockets, e quando eu conecto nela, ela irá mandar algumas mensagens “prontas”, dependendo da atividade que ela fizer, ou seja, quero monitorar as mensagens recebidas e caso a mensagem contiver a tag “|x|” faço isso, se tiver “|Y|”, faço aquilo.

Nesse exemplo em C# eu consigo normal, cada mensagem que chega da outra aplicação, é disparado um evento. Em outra classe, eu “monitoro” esse evento e trato a mensagem.
Não quero fazer códigos no método fromApp (apesar de ser mais facil) pois (pelo menos em C#) esse evento “this.MessageReceived(this, new MessageEventArgs(message));” é bem mais rápido.

M

Agora entendi. Você quer receber mensagens via Socket.

Modo 1: extremamente simples e inflexível. Jogue tudo no mesmo método:

public class Main {

	public static void main(String[] args) throws UnknownHostException,
			IOException {
		Socket socket = new Socket("localhost", 9999);
		Scanner scanner = new Scanner(socket.getInputStream());
		while (scanner.hasNextLine()) {
			System.out.println(scanner.nextLine());
		}
	}

}

Modo 2: implementar o padrão Observer e criar um código infinitamente mais bem separado e flexível (que pode, inclusive, ser facilmente usado junto a uma interface gráfica). O problema nesse caso é que é preciso escrever mais código. Porém, dessa vez você escapou: eu tenho um código que faz exatamente isso. Veja o anexo.

Criado 2 de março de 2010
Ultima resposta 3 de mar. de 2010
Respostas 3
Participantes 2