Esse programa é uma versão que eu implementei para o projeto final dos alunos do curso de Engenharia de Software da Universidade Federal de Goiás como projeto final da disciplina de Desenvolvimento de Software Concorrente. O objetivo é a construção de um jogo da velha que permita que dois jogadores remotos, em uma mesma rede local, possam jogar uma série de melhor de 5 partidas. Para que os programas remotos possam se comunicar, foi definido o protocolo de comunicação descrito abaixo.
- ID: 2 dígitos que identifica o tipo da mensagem
- Tamanho: 3 dígitos que indica o número de caracteres (tamanho) total da mensagem, incluindo os 5 dígitos do cabeçalho.
Mensagens UDP (datagramas, sem conexão prévia entre os computadores) trocadas entre o programa e demais computadores com o objetivo de saber quem está online e fazer o convite para participar de um jogo. O programa irá utilizar a porta 20181 (uma referência para 2018/1 - primeiro semestre de 2018, quando esse projeto foi proposto) para escutar estas mensagens. Essa porta deverá ficar disponível para troca de mensagens, mesmo quando o jogador estiver participando de um jogo. O tipo e formato das mensagens estão descritos a seguir:
- Formato da Mensagem: 01999Apelido
- 01: identificação da mensagem
- 999: tamanho total da mensagem, incluindo o cabeçalho
- Apelido: nome no qual você deseja ser identificado. É o nome do jogador que está enviando a mensagem.
- Essa mensagem será enviada via broadcast para a porta 20181 em duas situações:
- quando você iniciar o programa, indicando que você fez o login;
- sempre que desejar saber quais são os jogadores que estão online no momento.
- Formato da Mensagem: 02999Apelido
- 02: identificação da mensagem
- 999: tamanho total da mensagem, incluindo o cabeçalho
- Apelido: identificação do jogador que está enviando a mensagem
- Essa mensagem é uma resposta automática à mensagem MSG01. Essa mensagem deverá ser enviada somente para quem enviou a mensagem MSG01, onde o jogador corrente estará se identificando, mostrando que está online. Ao receber as mensagens MSG02 (bem como a MSG01) o programa deverá atualizar a lista de jogadores que estão online. Essa lista conterá o apelido e IP de cada jogador (o IP pode ser obtido através do campo RemoteAddress existente no socket que estiver escutando a porta 20181), para que o jogador corrente possa fazer um convite a algum desses jogadores para participar de um jogo. Jogadores que estiverem na lista e não responderem à sua mensagem MSG01 deverão ser retirados da lista.
- Formato da Mensagem: 03999Apelido
- 03: identificação da mensagem
- 999: tamanho total da mensagem, incluindo o cabeçalho
- Apelido: identificação do jogador que está enviando a mensagem
- Essa mensagem será enviada via broadcasting indicando que você encerrou o programa e está off-line a partir desse instante. Ao receber as mensagens MSG03, o programa deverá atualizar a lista de jogadores que estão online.
- Formato da Mensagem: 04999Apelido
- 04: identificação da mensagem
- 999: tamanho total da mensagem
- Apelido: identificação do jogador que está enviando a mensagem
- Essa mensagem será enviada para um jogador específico que estiver na sua lista de jogadores online. O recebimento dessa mensagem indica que o jogador (Apelido) está te convidando para um jogo. Lembrando que o jogo será uma melhor de 5 partidas.
- Formato da Mensagem: 05999Apelido|Porta
- 05: identificação da mensagem
- 999: tamanho total da mensagem
- Apelido: identificação do jogador que está enviando a mensagem
- |: separador de campo
- Porta: caso o convite tenha sido aceito, número da porta TCP que será utilizada para fazer a conexão ponto-a-ponto (peer-to-peer). Caso não queira (ou não possa) aceitar o convite, o número da porta deverá ser 0 (zero) indicando que o você não quer jogar ou que já está jogando com outro jogador (nesse caso, a resposta deverá ser automática).
- Essa mensagem será enviada somente para quem te enviou a MSG04. Ao aceitar um convite, o programa deverá abrir um socket TCP que ficará escutando a porta informada na mensagem, esperando que o jogador que fez o convite conecte com você para iniciar o jogo.
- Formato da Mensagem: 06007Ok
- 06: identificação da mensagem
- 007: tamanho total da mensagem (tamanho fixo)
- Ok: resposta fixa
- Essa mensagem será enviada automaticamente pelo jogador que fez o convite para o jogo, informando ao jogador que foi convidado que ele recebeu a resposta do convite e, caso o convite tenha sido aceito, irá fazer a conexão TCP na porta indicada para iniciar o jogo. Como a resposta ao convite foi feita usando mensagens UDP, essa resposta pode não ser lida pelo jogador que fez o convite. Dessa forma, o jogador que recebeu o convite terá certeza que a conexão TCP será feita. Caso a MSG06 não chegue dentro de um certo intervalo de tempo (timeout), o jogador que recebeu o convite poderá, ou enviar uma nova resposta, ou não se preparar para iniciar o jogo (não abrir uma porta para conexão TCP).
- Formato da Mensagem: 07006N
- 07: identificação da mensagem
- 006: tamanho total da mensagem (tamanho fixo)
- N: indica quem vai iniciar o jogo
- Essa mensagem é enviada pelo jogador que recebeu o convite, logo após quem convidou fazer a conexão TCP. O campo N indica quem irá iniciar o jogo e pode ser os seguintes valores:
- quem recebeu o convite irá iniciar o jogo (no caso, o jogador que enviou essa mensagem)
- quem convidou irá iniciar o jogo (no caso, o jogador que recebeu essa mensagem)
- Formato da Mensagem: 08006N
- 08: identificação da mensagem
- 006: tamanho total da mensagem (tamanho fixo)
- N: indica a posição que o jogador escolheu no tabuleiro
- Essa mensagem é enviada pelo jogador que possui a vez, imediatamente após ele escolher uma posição no tabuleiro. No tabuleiro, cada posição é numerada de 1 a 9, conforme mostrado abaixo. Ao receber a mensagem, o programa deverá atualizar o tabuleiro e a vez passa ao jogador que recebeu a mensagem.
Tabuleiro:
1 2 3
4 5 6
7 8 9 - Formato da Mensagem: 09005
- 09: identificação da mensagem
- 005: tamanho total da mensagem (tamanho fixo)
- Como cada jogador sabe quando o jogo encerrou (com alguém vencendo ou, no caso de todas as posições do tabuleiro serem preenchidas, havendo empate), não é necessário indicar o fim do jogo. Entretanto, ao encerrar uma partida, uma nova partida deverá ser iniciada, caso ainda nenhum jogador tenha alcançado a vitória na melhor de 5. Essa mensagem deverá ser enviada por quem perdeu a última partida. Em caso de empate, mensagem deverá ser enviada por quem não começou a partida anterior (que acabou de ser encerrada). Quem envia essa mensagem irá começar a nova partida, podendo escolher uma posição para jogar, enviando, logo após, uma mensagem MSG08. Quando houver um ganhador definitivo na melhor de 5 partidas (3ª vitória de algum dos jogadores), ou então um empate entre os jogadores (encerrou-se a 5ª partida e nenhum jogador teve mais vitórias que o outro), a conexão será automaticamente encerrada e, para participar de um novo jogo, deverá ser feito um novo convite.
- Formato da Mensagem: 10005
- 10: identificação da mensagem
- 005: tamanho total da mensagem (tamanho fixo)
- Essa mensagem deverá ser enviada pelo jogador que, por algum motivo, desistiu de continuar jogando. Nesse caso, logo após o envio da mensagem, o jogador deverá encerrar a conexão.
Mensagens TCP (com conexão prévia entre os computadores) trocadas entre os dois jogadores participantes do jogo. Essa conexão deverá ser feita pelo jogador que fez o convite, logo após o envio da mensagem MSG06.