jReMSN

Apesar de estarmos em plena web2.0, ainda existem muitas empresas que bloqueiam qualquer tipo de bate-papo, seja ele interno ou externo, mas certas vezes precisamos de alguma forma de chat que possibilite uma comunicação instantânea, seja por motivos profissionais ou não.
Pensando nisso, um pouco de vontade de estudar e uma certa ociosidade me fizeram criar um Messenger, o jReMSN (lê-se: jei-rê emi-éssi-eni ).

Como funciona?
Existe o servidor, um jar, alguém executa esse jar em algum computador, seleciona uma porta e pronto, o servidor se vira com o resto.
Existe o jar “cliente”, que pode ser executado de qualquer computador que “enxergue” o ip do computador que está executando o jar servidor, inúmeros clientes podem ser abertos de diferentes computadores, e para se conectar deve ser informado o ip do computador servidor, depois a porta e por ultimo o Nick desejado.
O computador que está servindo como servidor também pode executar o jar “cliente”.

Desenhando ficaria assim:
Ilustração do fluxo para cada cliente, este fluxo é repedido para cada novo cliente conectado, porém o “servidor” é único, apenas threads simples são criadas para cada cliente conectado.

Fluxo do sistema

1 – Software cliente solicita conexão
2 – Software servidor aceita a conexão, cria uma thread para ficar recebendo as mensagens deste cliente
3 – Software cliente é avisado que a conexão foi realizada
4 – Software cliente cria uma thread para ficar recebendo as mensagens do servidor 

5 – Software cliente envia uma mensagem através da conexão aberta, a thread responsável por este cliente recebe a mensagem e através de um método na classe servidor, envia esta mensagem a todos os clientes conectados (ao a apenas um se for mensagem particular).
6 – Software servidor envia a mensagem aos clientes conectados, a thread do cliente responsável por receber as mensagem do servidor, captura a mensagem, verifica o código (se é mensagem normal, particular, se é pedido de atenção, etç), efetua alguma ação correspondente.
7 – Após a thread do cliente efetuar todas as ações necessárias, ela adiciona a mensagem na tela.

Os passos 1, 2, 3 e 4 são efetuados apenas uma única vez para cada cliente, durante a conexão, após a conexão ser efetuada apenas os passos 5, 6 e 7 são realizados.

O que tem de bom?
O servidor não tem praticamente nenhuma função extravagante, funciona “apenas” como o descrito acima, os códigos são simples, um pouco extensos mas simples.
Vale mencionar que o servidor armazena uma lista dos clientes ativos, e quando alguém conecta ou desconecta esta lista é atualizada e repassada em forma de mensagem para os clientes conectados, para que eles se atualizem.

O software cliente possui esta carinha:
Imagem do software cliente
 

Menu de opções:
Imagem do menu de opções
Ao iniciar o programa, os botões “Conectar”, “Alterar Título“ e “Sair” ficam habilitados e o botão “Desconectar” fica desabilitado.
Ao se conectar o botão “Conectar” é desabilitado e o botão “Desconectar” é habilitado. 

Conectar: Solicita IP do servidor, solicita Porta do servidor e solicita um Nick para exibição.
Desconectar: Quando conectado, encerra a conexão mas não sai do programa.
Alterar Titulo: Solicita um texto, que será exibido como título da aplicação no lugar da frase “jReMSN-Cliente”, esta alteração só tem efeito enquanto o programa estiver ativo.
Sair: Encerra a conexão e fecha o programa (o botão fechar efetua a mesma ação).

 

Funcionalidades:

  • Exibe uma mensagem informando quando alguém se conecta/desconecta.
  • Exibe uma lista com todos que estão online, ao selecionar um nome na lista as mensagens enviadas serão recebidas apenas por aquela pessoa, ao selecionar “Todos”, todos os clientes conectados receberão as mensagens enviadas. (Quando uma mensagem particular for recebida, um “@” será exibido antes do texto para poder identificar que a mensagem é privada).
  • A barra de rolagens acompanha o texto.
  • Quando a janela do chat está inativa e alguém lhe envia uma mensagem (privada ou não) a barra de títulos fica piscando, alternando entre o titulo da aplicação e a mensagem “XXX digitou algo…”
  • É possível “chamar a atenção“ de alguém da lista de on-line, ao selecionar uma pessoa e clicar no botão “(())” a janela da pessoa selecionada recebe o foco e começa a tremer muito por cerca de 2 segundos, porém esta opção foi desabilitada no código fonte, para ativá-la basta alterar o parâmetro do “setEnabled” para true.

Atualizações

  • Implantado controle de transparência. 
  • Implantado a função “Sempre no topo”, que deixa o comunicador sempre sobre tudo.
  • Implantada a opção de alterar a cor do frame (o botão no menu foi desabilitado – setEnabled(false))
  • Implantada opção de alterar o ícone da janela.
  • Alterada campo “Recebedor de Mensagens”, deixando os textos coloridos dependendo do tipo (mensagens do sistema: Vermelho, nicks: Azul, Conversas Particulares: Roxo acinzentado)
  • Implantada funcionalidade “SystemTray” que cria um ícone na bandeja do sistema ao minimizar a janela. 

 

 Transparência:
Exemplo de transparência do jReMSN
Atravez de um controle deslizante na parte inferior da janela, é possível controlar sua transparência, deixando a janela com opacidade de 40 a 100%.

Alterar Ícones:
Exemplo de alteração de ícone do jReMSN
É possível, por uma opção no menu, alterar o ícone da jenala, pode-se por exemplo selecionar o ícone do eclipse e depois alterar o título para “Eclipse – ProjetoX”. São inumeras as possibilidades para dificultar a identificação do comunicador.

Área de Notificação:
A ultima grande alteração do comunicador, ao minimizar a janela um ícone é criado na área de notificação.
Quando se recebe alguma mensagem com a janela escondida, é exibido um alerta do sistema perto do relógio “Alerta Vermelho”.
 

Posso alterar?
Sim, este projeto é OpenSource, distribuído sobre a licença “GNU General Public License”, é possível encontrar algumas pequenas falhas ou restrições e de acordo com a licença, o funcionamento do programa não é garantido, porém esse mensageiro funciona muito bem. Se quiser alterar alguma coisa, ou mesmo refazer um do zero tendo este como base/modelo, “sinta-se em casa”, o código está bem comentado, pelo menos os métodos e classes mais importantes, e as nomenclaturas estão em portugês e auto explicativas.
As classes iniciais, o princípio, onde tudo começou (uma classe que se comunica com outra através do prompt de comando) foi criada a partir de comentários e dicas obtidas no fórum guj, o resto foi brotando de ideias próprias e críticas/sugestões de amigos. 

Onde baixo?
Os jars executáveis (somente .class) podem ser baixados nestes links:
            Cliente
            Servidor

O código fonte pode ser baixado nestes links:
            Cliente
            Servidor

Lembrando que é uma aplicação Java swing desenvolvida utilizando uma jdk6, ou seja, precisa ter ao menos a JRE 6 instalada na máquina.

Qualquer dúvida, crítica ou sugestão referente a alteração ou utilização do programa podem ser postadas aqui ou enviadas por e-mail.

Nota adicional:
Executado em um computador com 1,96GB de memória, processador Intel 1,60GHz (single core) e Windows XP , o servidor consome de 5 a 6 MB de memória com média de 10 clientes conectados, o cliente por sua vez consome de 18 a 22 MB de memória nesta mesma máquina.