# Introdução às Redes de Computadores/Bate-papo em grupo

Clientes se conectarão ao servidor de chat, em uma determinada porta TCP. O servidor deverá estar ativo para atender às requisições de conexão. Após esse estabelecimento, os usuários entrarão numa sala, onde se encontrarão com outros usuários que estejam conectados. Poderá ser realizado troca de mensagens dentro da sala (para que todos vejam), mensagem privativa (para um determidado usuário), e se possível, transferência de arquivo. Em essência, o protocolo será parecido com o protocolo IRC (Internet Relay Chat).
A linguagem de programação será JAVA, e suas APIs serão utilizadas nesse desenvolvimento.
As fontes de pesquisas serão livros (como Tanenbaum, Kurose, Deitel) e documentações e códigos encontrados na Web.
O diagrama básico da arquitetura do protocolo será:

# Código do Programa

O código do programa foi desenvolvido em Java, por ser uma linguagem simples e por poder rodar em diferentes plataformas.
Como dito, o projeto divide-se em duas partes: o lado Cliente e o lado Servidor. O servidor é responsável por abrir uma conexão numa determinada porta, escolhida pelo usuário do servidor (chamado de administrador nesse caso). O administrador executa o servidor, que aguarda conexões de usuários. O serviço pode ser finalizado quando o administrador assim decidir. O usuário do lado cliente deve informar o endereço do servidor (seja o IP ou o nome, via DNS) e a porta em que ele está oferecendo o serviço, além de escolher um apelido (nickname).
As telas do programa foram criadas utilizando a API Thinlet, que gera janelas amigáveis a partir de parâmetros XML. Os códigos importam o arquivo XML com os dados da janela, e o Thinlet se encarrega de montá-las para visualização. A interface utilizada para a criação dessas janelas para o Thinlet foi o ThinG GUI Editor.

## FSM do Bate-Papo em grupo

Abaixo está especificado o FSM simplificado do método apresentado:

## Diagrama de Mensagens

Podemos ver abaixo um exemplo de uma comunicação entre cliente e servidor. Podemos observar que ao Cliente analisado sair, a mensagem de saída é rotornada pelo servidor apenas aos clientes restantes.
Os códigos-fonte referentes ao arquivo XML utilizado por cada classe e as respectivas classes são apresentadas a seguir:

## Lado Servidor

Essas classes ficam do lado servidor, devendo ser executados pelo administrador da Sala de Bate-Papos.

### Classe Servir

Essa classe é resposável por apresentar uma tela ao administrador para que ele escolha a porta em que o serviço será oferecido. O arquivo servir.xml cria a tela apresentada ao administrador, que escolhe a porta e envia esse parâmetro à classe Server.java.

#### Servir.java
### Classe Server

Essa classe é a resposável por iniciar o serviço do chat. Ela cria o socket para comunicação com o cliente. Ela também envia as mensagens passadas para as threads clientes.

#### Server.java
### Classe ThreadServer

Essa classe contém as mensagens de protocolo interpretadas pelo servidor. Ela realiza a comunicação direta com os clientes, criando uma thread para cada cliente conectado.

#### ThreadServer.java
## Lado Cliente

Essas classes rodam do lado cliente, apresentando ao usuário uma interface simples e intuitiva de acesso ao servidor de chat.

### Principal

Essa é a classe pricnipal do lado cliente. Ela cria a tela inicial de interface com o usuário, assim como também faz chamada a todas as outras classes do lado cliente. Nessa tela, são apresentadas as opções de conexão e desconexão e a tela do chat que é apresentada ao usuário, com a lista dos usuários on-line e as mensagens enviadas e recebidas.

#### Principal.java
### Conectar

Ao iniciar o programa, o usuário pode escolher a opção de se conectar com o servidor. Nesse momento, uma tela com a opção de escolha do endereço do servidor e a porta do serviço oferecido é mostrada, assim como o campo para digitar o nickname do usuário. Essa classe efetua a conexão com o servidor através do uso de sockets.

#### Conectar.java
### Chat

Essa classe é responsável por apresentar ao usuário a tela de comunicação com os outros usuários on-line. Apresenta a lista de usuários ativos no momento e as mensagens enviadas e recebidas.

#### Chat.java
### Cliente

Essa classe é responsável pela comunicação através do uso do protocolo criado entre o servidor e o cliente. Aqui é gerada uma thread para se comunicar com o servidor, interpretando as mensagens recebidas e enviando-as para a classe Principal, que apresenta as mensagens formatadas para o usuário visualizar.

#### Cliente.java
### Outros

Uma outra classe utilizada é a ThisFrame.java, que simplesmente utiliza o Thinlet para criar uma janela externa, que conterá as sub-janelas do programa de chat. Outro arquivo XML utilizado é o sobre.xml, que apresenta informações sobre o programa quando o usuário escolhe no menu a opção Ajuda->Sobre.

#### sobre.xml
## Previsões futuras para o programa

A maioria dos bugs encontrados no programa é referente à comunicação com o servidor. Ele só aceita três tipos de mensagens: NICK, MSG e CAIU. Se algum outro tipo de mensagem for enviada, o servidor não irá tratá-la e nem tem uma rotina para tal finalidade. Como o programa cliente desse chat somente troca as mensagens tratadas pelo servidor, não há nenhum erro. Contudo, ao se conectar com o servidor através do protoclo TELNET, há a possibilidade de outros parâmetros serem trocados. Nesse caso, podem ocorrer erros.
Uma modificação a ser feita é quanto a mensagens que o servidor não trata, devolvendo ao cliente uma mensagem de erro. Dessa forma, evita-se o erro que ocorre em tempo de execução caso o servidor não saiba o que fazer com a mensagem que recebeu.
Outro problema é devido à mensagem "NICK:". Para um usuário logar no chat, precisa enviar uma mensagem do tipo NICK com o nome de usuário. Caso ele já esteja logado, e entre novamente com esse comando, outro usuário será criado na mesma thread e adicionado ao chat. É preciso criar uma rotina que trate esse comando reenviado como sendo a troca do nick daquele usuário, evitando os erros decorrentes.
Outro problema é o uso de nicknames com o caractere vírgula (","), que o servidor divide como sendo a lista de usuários. Ou seja, um único usuário irá criar três itens no cliente, na sua lista de usuários on-line, porém todos referentes a uma única thread. E não será possível enviar mensagem para aquele usuário.
Outro bug que deve ser tratado é quando a mensagem for enviada a um nick inexistente na lista de usuários do servidor. Nesse caso, é gerada uma exceção no servidor que não é tratada. Pode-se criar uma rotina de tratamento caso o nome do usuário destinatário não esteja no servidor.
Para implementações futuras, serão propostos comandos, como "\nick" que permitirá mudar o nickname do usuário, e também envio de arquivos para determinados usuários. O programa é bem modularizado, permitindo adição de novas funções sem dificuldades.