Este projeto implementa a terceira etapa do projeto da disciplina de Infraestrutura de Comunicações - IF678 2025.1, desenvolvendo um sistema de chat de sala única utilizando comunicação UDP com a biblioteca Socket em Python e protocolo RDT (Reliable Data Transfer) implementado na camada de aplicação.
Desenvolver um sistema cliente-servidor para chat em sala única utilizando o protocolo UDP com confiabilidade implementada na camada de aplicação, onde múltiplos clientes podem se conectar ao servidor e trocar mensagens. O sistema implementa funcionalidades como lista de amigos e sistema de banimento por votação
client.py: Implementação do cliente de chat que se conecta ao servidor;server.py: Implementação do servidor que gerencia as conexões e distribui as mensagens;clienteRDT.py: ClasseRDTFullque implementa o protocolo de transferência confiável para o cliente;serverRDT.py: ClasseRDTServerque implementa o protocolo de transferência confiável para o servidor;
- ✅ Comunicação UDP utilizando a biblioteca Socket do Python;
- ✅ Envio de arquivos em pacotes de até 1024 bytes (buffer_size);
- ✅ Recepção e armazenamento de arquivos no servidor;
- ✅ Devolução do arquivo com nome modificado para o cliente;
- ✅ Suporte a diferentes tipos de arquivo (texto, imagens, PDF, etc.);
- ✅ Protocolo Stop-and-Wait: Implementação do protocolo RDT 3.0;
- ✅ Numeração Sequencial: Pacotes numerados alternadamente (0 e 1, conforme a máquina de estados);
- ✅ Sistema de ACK: Acknowledgments para confirmação de recebimento;
- ✅ Timeout e Retransmissão: Retransmissão automática em caso de perda;
- ✅ Detecção de Duplicatas: Identificação e descarte de pacotes duplicados;
- ✅ Simulação de Perda: Simulação configurável de perda de pacotes via linha de comando com taxa fixa ou aleatória;
- ✅ Confiabilidade sobre UDP: Transferência confiável utilizando protocolo não-confiável;
- ✅ Sistema de Identificação: Cadastro de usuários com nomes únicos;
- ✅ Chat em Sala Única: Todos os usuários cadastrados podem enviar e receber mensagens;
- ✅ Lista de Amigos: Cada usuário pode criar e gerenciar sua lista de contatos;
- ✅ Identificação de Amigos: Mensagens de amigos são destacadas com
[amigo]; - ✅ Sistema de Banimento: Votação para remoção de usuários da sala;
- ✅ Notificações: Avisos de entrada e saída de usuários;
- ✅ Visualização de Usuários: Comando para listar todos os participantes da sala;
- Linguagem: Python 3.6 ou superior;
- Bibliotecas: socket, struct, threading, sys, signal, datetime (bibliotecas padrão do Python);
- Sistema Operacional: Linux, Windows;
Em um terminal, execute:
python "server.py"O servidor iniciará e ficará aguardando conexões na porta 12345.
Em um terminal, execute:
python "client.py"O cliente solicitará o IP do servidor:
Digite o IP do servidor:
Verifique o IP do Servidor e digite para prosseguir.
Após conectar-se, o servidor solicitará a identificação do usuário:
Identifique-se com: hi, meu nome eh <nome>Digite a mensagem de identificação com seu nome desejado:
Exemplo:
hi, meu nome eh RenatoCaso o nome já esteja em uso, será solicitado outro nome.
No chat, você pode utilizar os seguintes comandos:
bye- Sair do chat;list- Listar todos os usuários conectados;mylist- Mostrar sua lista de amigos;addtomylist <nome>- Adicionar um usuário à sua lista de amigos;rmvfrommylist <nome>- Remover um usuário da sua lista de amigos;ban <nome>- Votar para banir um usuário da sala; Qualquer outra mensagem será enviada para todos os usuários da sala.
- Inicialização: Cliente e servidor inicializam com sequência 0;
- Envio de Dados:
- Remetente envia pacote com número de sequência atual;
- Aguarda ACK correspondente dentro do timeout configurado;
- Recebimento:
- Receptor verifica número de sequência esperado;
- Envia ACK com o número de sequência recebido;
- Entrega dados à aplicação apenas se sequência correta;
- Tratamento de Erros:
- Timeout: Retransmite o último pacote enviado;
- ACK Duplicado: Ignora ACKs de sequências antigas;
- Pacote Duplicado: Reenvia último ACK sem entregar dados;
-
Identificação do Cliente:
- Clientes se identificam com
hi, meu nome eh <nome>; - O servidor verifica se o nome já está em uso;
- Clientes se identificam com
-
Formato das Mensagens:
- As mensagens são exibidas no formato:
IP:PORTA/~[amigo]NOME: MENSAGEM HORA DATA; - Mensagens de amigos são identificadas com o prefixo
[amigo];
- As mensagens são exibidas no formato:
-
Sistema de Banimento:
- A votação para banimento requer maioria simples (50% + 1);
- O usuário banido é removido da sala imediatamente;
-
Manutenção de Conexões:
- O servidor mantém registro de todos os endereços e seus respectivos nomes;
- Ao sair (
bye), os registros são removidos automaticamente;
send(data, addr): Envia dados com garantia de entrega para um endereço;receive(): Recebe dados garantindo ordem e integridade;broadcast(message, exclude): Transmite mensagem para todos os clientes;broadcast_to_registered(message, names, exclude_addr): Transmite mensagem para todos os clientes registrados;
send(data): Envia dados com garantia de entrega;receive(): Recebe dados garantindo ordem e integridade;
O sistema foi testado com:
- ✅ Múltiplas conexões simultâneas (4 conexões simultâneas em máquinas diferentes na mesma rede);
- ✅ Teste de envio e recebimento de mensagens em grupo;
- ✅ Gerenciamento de lista de amigos;
- ✅ Sistema de votação para banimento;
- ✅ Confiabilidade na entrega de mensagens;
Esdras Gabriel |
Henrique César |
João Victor |
Luiz Gustavo |
Márcio Júnior |
|---|