E aí galera? Aqui na faculdade meu professor de Redes deu como trabalho implementar um protocolo confiável na camada de aplicação de um chat, semelhante ao MSN: possuímos o IP do servidor e obtemos a lista de usuários online, ao clicar no contato o servidor retorna o IP do usuário e fazemos a conexão com o outro cliente) logo usamos pacotes de datagramas na implementação. Assim, vamos utilizar os primeiros caracteres das strings enviadas para implementar o protocolo. Só que surgiu uma dúvida:
Um objeto da classe DatagramPacket implementa fielmente o tamanho e as unidades enviadas de pacotes na rede? Ou seja, UM objeto DatagramSocket enviado no programa é realmente enviado um ÚNICO pacote ou é apenas uma abstração?
Afinal, caso se um DatagramPacket corresponda a mais de um pacote “real” vou ter que implementar meu protocolo nesses “pacotes reais”, o que torna meu trabalho infinitamente mais difícil levando em consideração que sou um iniciante em Java (não em programação) e obviamente compreender bem a API faz-se ainda mais necessário pra mim.
Qualquer ajuda/sugestão (até mesmo além da minha dúvida) é sempre bem vinda. Grato desde já.
Pela pequena experiência que tive, você define o tamanho do pacote que será enviado e o cliente vai tratar esses dados.
Acredito que o melhor seria você usar um tamanho fixo para os pacotes enviados ou colocar identificadores pra poder tratar.
Por exemplo: O primeiro byte do pacote ser o tipo de dado e ter um valor inteiro. Dependendo do valor, o cliente identifica e sabe o tamanho do pacote.
Aqui tem um chat de exemplo, usando UDP. As classes já implementam algum tipo de segurança, embora o que o seu professor queira seja um pouco mais complicado do que o que tem aqui:
Eu sugeriria que você estudasse o funcionamento do TCP a fundo. Pegue o livro do Tanembaum, e entenda como o TCP funciona em cada camada. Como ele garante confiabilidade através de retransmissão, confirmação. Entenda o que é o protocolo de janela deslizante, como ele faz a divisão de pacotes em datagramas, pois você precisará implementar tudo isso no braço.
Já vou adiantando. Para fazer bem bonitinho, como o messenger, não é uma tarefa fácil.
Você terá que estudar bastante e dificilmente encontrará algo similar na internet.
Viny, a pequena experiência que tive com sockets UDP foi com C# e não tive tanto tempo pra estudar, apesar de ter que implementar retransmissão e confirmação de entrega na aplicação.
Quanto ao tamanho, quando não preencho o tamanho completo do pacote, o protocolo completa esse pacote com bytes aleatórios e/ou bytes “vazios”?
Já ouvi falar muito bem do livro do Tanembaum, mas na época meu professor de redes recomendou o livro do Kurose por ser mais didático e na época era apenas pra estudar pra matéria da faculdade.
Quanto a encontrar algo na internet, foi realmente difícil encontrar algo falando sobre fazer isso em C# e quando procurei, não encontrei nenhum profissional que já tivesse feito isso. Eles sempre diziam que era muito específico. Espero que seja mais fácil em Java.
Na verdade, o UDP tem um campo para o tamanho da mensagem, e é nele que ele se baseia. O que eu quis dizer, é que esse tamanho é limitado em 16k (relendo aqui eu me expressei mesmo muito mal).
Eu nunca implementei exatamente esse software, mas como já trabalhei por muitos anos com redes (6 anos na Siemens, 4 anos na VISA) tenho uma noção bastante clara do que deve ser feito para realizar esse trabalho.
Sim. No caso do UDP, não existe divisão em multiplos pacotes. Cada pacote enviado corresponde a um pacote de rede.
Agora cuidado. O UDP não dá garantia nem de ordem, nem de integridade, e nem que esse pacote chegará.
A garantia de integridade é feita por um checksum de 16 bits. Se ele estiver implementado no seu roteador, ele “engolirá” pacotes errados, sem nenhum tipo de aviso. Se ele não estiver implementado (pq é opcional), vai chegar um pacote inválido.