Skip to content
Snippets Groups Projects
Commit 103291e0 authored by HECKMANN CYRIL's avatar HECKMANN CYRIL :nerd:
Browse files

Correction SUB et début Tron

parent 3b03c173
No related merge requests found
......@@ -96,6 +96,7 @@
// txtMsg
//
this.txtMsg.Location = new System.Drawing.Point(145, 300);
this.txtMsg.MaxLength = 1468;
this.txtMsg.Name = "txtMsg";
this.txtMsg.Size = new System.Drawing.Size(215, 20);
this.txtMsg.TabIndex = 6;
......
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FormClient
......@@ -19,16 +12,26 @@ namespace FormClient
{
InitializeComponent();
}
/// <summary>
/// Pseudo
/// </summary>
string pseudo;
/// <summary>
/// Socket du client
/// </summary>
Socket clientSocket;
/// <summary>
/// Endpoint du serveur
/// </summary>
EndPoint serverEP;
/// <summary>
/// Function exectuée dans le thread : On ecoute le réseau et traite les messages reçu
/// </summary>
/// <param name="client">Socket du client</param>
/// <param name="server">EndPoint du serveur</param>
private void readNet(Socket client, EndPoint server)
{
// Gets executed on a seperate thread and
// doesn't block the UI while sleeping
try
{
......@@ -36,29 +39,35 @@ namespace FormClient
while (true)
{
int nBytes = client.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref server);
// Message reçu
ChatMessage receive = new ChatMessage(buffer);
Action action;
// On vide la rtb si on recoit la reponse d'un GET
if (receive.commandeType == CommandeType.REPONSE && receive.commande == Commande.GET){
action = () => rtbMSG.Text = "";
// Permet d'effacer tout les messages affichés dans le form
this.Invoke(action);
}
if (receive.commandeType == CommandeType.REPONSE){
// On affiche dans la console
Console.WriteLine(" < Reponse du serveur > " + receive.data);
}
else
{
// Split du message POST afin d'obtenir le pseudo et le message séparement
string[] splitted = receive.data.Split('\0');
if (receive.commande == Commande.GET)
{
// GET
action = () => rtbMSG.Text = '\n' + " <" + splitted[0] + "> " + splitted[1];
this.Invoke(action);
}
else
{
// AUTRES
action = () => rtbMSG.Text += '\n' + " <" + splitted[0] + "> " + splitted[1];
this.Invoke(action);
Console.WriteLine(" <" + splitted[0] + "> " + splitted[1]);
......@@ -68,6 +77,7 @@ namespace FormClient
}
catch (Exception e)
{
// SERVEUR OFF => On ferme le client
Console.WriteLine("ERROR READ NET : Serveur fermé");
MessageBox.Show("Le serveur n'est pas disponible! Fermeture du client...");
Application.Exit();
......@@ -75,8 +85,13 @@ namespace FormClient
}
/// <summary>
/// Se declenche au demarrage : initialisation du socket et des info utilisateurs
/// </summary>
private void Form1_Load(object sender, EventArgs e)
{
// ======================================== INITIALISATION ============================
// On demande le port du client et son pseudo
Console.WriteLine("Port(pas 11111)?");
int portClient = Convert.ToInt32(Console.ReadLine());
Console.WriteLine('\n' + "Pseudo?");
......@@ -85,6 +100,7 @@ namespace FormClient
// Si pseudo trop long => On truncate
if (pseudo.Length > 30)
pseudo = pseudo.Substring(0, 30);
// ===================================================================================
Console.WriteLine("=============================================");
Console.WriteLine("=============================================");
......@@ -92,10 +108,11 @@ namespace FormClient
Console.WriteLine("=============================================");
Console.WriteLine("=============================================" + '\n' + '\n');
// Coordonnées du serveur
string serverIP = "127.0.0.1";
int serverPort = 11111;
// Création de la socket d'écoute UDP
// Création de la socket du client
clientSocket = new Socket(
AddressFamily.InterNetwork,
SocketType.Dgram,
......@@ -107,39 +124,56 @@ namespace FormClient
// Création du EndPoint serveur
serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
// Creation et lancement du thread d'ecoute
Thread sendAll = new Thread(x => readNet(clientSocket, serverEP));
sendAll.Start();
// On change le focus
this.ActiveControl = txtMsg;
}
/// <summary>
/// Se declenche au click du bouton envoi: Envoi du message POST
/// </summary>
private void btnPOST_Click(object sender, EventArgs e)
{
ChatMessage m = new ChatMessage(Commande.POST, CommandeType.REQUETE, pseudo + '\0' + txtMsg.Text);
byte[] buffer = m.GetBytes();
Console.WriteLine("taille du buffer" + buffer.Length);
// Envoi
clientSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, serverEP);
txtMsg.Text = "";
}
/// <summary>
/// Se declenche au click d'un bouton: Envoi du message GET/SUB/UNSUB....
/// </summary>
private void btnClickSENDMSG(object sender,EventArgs e)
{
// On recupere le tag
int cmd = Convert.ToInt32(((Button)sender).Tag);
// On crée le message
ChatMessage m = new ChatMessage((Commande)cmd, CommandeType.REQUETE, txtMsg.Text);
byte[] buffer = m.GetBytes();
Console.WriteLine("taille du buffer" + buffer.Length);
// Envoi du message
clientSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, serverEP);
// On affiche le nom de la room dans le titre du form
if ((Commande)cmd == Commande.CREATEROOM)
this.Text = "Room : " + txtMsg.Text;
}
/// <summary>
/// On capture la touche entrée pour envoi le message POST
/// </summary>
private void txtMsg_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
btnPOST_Click(sender, e);
}
/// <summary>
/// On bloque la taille du message
/// </summary>
private void txtMsg_KeyPress(object sender, KeyPressEventArgs e)
{
if (((TextBox)sender).Text.Length > 1400 && (e.KeyChar != (char)Keys.Return || e.KeyChar != (char)Keys.Enter))
......
......@@ -11,39 +11,57 @@ namespace ServeurUdp
{
class ServeurUdp
{
static List<ChatMessage> Allmessages = new List<ChatMessage>();
// Booleen utilisé dans la boucle while de readNet
static bool listen = true;
static List<EndPoint> subscribers = new List<EndPoint>();
/* ROOMS */
// Lien entre EndPoint et nom de room
static Dictionary<EndPoint, string> roomAssign = new Dictionary<EndPoint, string>();
// Lien entre nom de room et liste de endpoint dans cette room
static Dictionary<string, List<EndPoint>> roomSub = new Dictionary<string, List<EndPoint>>();
// Lien entre nom de room et liste de message de cette room
static Dictionary<string, List<ChatMessage>> roomMessages = new Dictionary<string, List<ChatMessage>>();
/// <summary>
/// Renvoie la room du EndPoint
/// </summary>
/// <param name="ep">Endpoint de l'utilisateur</param>
/// <returns>nom de la room</returns>
static private string getRoom(EndPoint ep)
{
string room = "";
if (roomAssign.ContainsKey(ep))
if (roomAssign.ContainsKey(ep)) // Si l'utilisateur est dans une room, on envoie la room
room = roomAssign[ep];
else
room = "global";
room = "global"; // sinon room global
return room;
}
/// <summary>
/// Envoie une reponse à un message
/// </summary>
/// <param name="servSocket">Socket du serveur</param>
/// <param name="ep">Endpoint de l'utilisateur visé</param>
/// <param name="cmd">Commande reçu</param>
static void SendAnswer(Socket servSocket, EndPoint ep,Commande cmd)
{
byte[] buffer = ChatMessage.GetBytes(cmd, CommandeType.REPONSE, cmd.ToString() + '\0' + "OK");
// On envoi l'accusé de reception
servSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, ep);
}
/// <summary>
/// Envoie tout les messages de la room du user
/// </summary>
/// <param name="servSocket">Socket du serveur</param>
/// <param name="dest">Destinataire de la commande GET</param>
static void SendAllMsg(Socket servSocket, EndPoint dest)
{
string room = getRoom(dest);
foreach (ChatMessage cm in roomMessages[room])
{
// Encodage du string dans un buffer de bytes en ASCII
// On convertie en byte chaque message
byte[] buffer = cm.GetBytes();
// Envoie du message
int nBytes = servSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, dest);
......@@ -51,6 +69,12 @@ namespace ServeurUdp
}
Console.WriteLine("All messages send to " + dest);
}
/// <summary>
/// Envoie du message au subscribers
/// </summary>
/// <param name="servSocket">Socket du serveur</param>
/// <param name="dests">liste des sub</param>
/// <param name="msg">Message a envoyer</param>
static void SendToSub(Socket servSocket, List<EndPoint> dests, ChatMessage msg)
{
byte[] buffer;
......@@ -63,35 +87,46 @@ namespace ServeurUdp
}
Console.WriteLine("Message send to subscribers");
}
/// <summary>
/// Envoie un message à une personne
/// </summary>
/// <param name="servSocket">Socket du serveur</param>
/// <param name="dests">destinataire</param>
/// <param name="msg">Message a envoyer</param>
static void SendToOne(Socket servSocket, EndPoint dest, ChatMessage msg)
{
byte[] buffer;
// Encodage du string dans un buffer de bytes en ASCII
buffer = msg.GetBytes();
// Envoie du message
servSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, dest);
}
/// <summary>
/// Sert a rejoindre une room / la crée
/// </summary>
/// <param name="roomName">Nom de la room</param>
/// <param name="EP">Utilisateur</param>
static void JoinRoom(string roomName,EndPoint EP)
{
foreach (KeyValuePair<string, List<EndPoint>> kv in roomSub)
foreach (KeyValuePair<string, List<EndPoint>> kv in roomSub) // on parcours les rooms
{
if (kv.Value.Contains(EP))
kv.Value.Remove(EP);
if (kv.Value.Contains(EP)) // Si l'utilisateur est deja dans une room
kv.Value.Remove(EP); // On le sort
}
if (!roomAssign.ContainsKey(EP))
if (!roomAssign.ContainsKey(EP)) // on met l'utilisateur dans une room
roomAssign.Add(EP, roomName);
else
roomAssign[EP] = roomName;
if (!roomMessages.ContainsKey(roomName))
if (!roomMessages.ContainsKey(roomName)) // Si nouvelle room, on crée une liste de messages
roomMessages.Add(roomName, new List<ChatMessage>());
if (!roomSub.ContainsKey(roomName))
if (!roomSub.ContainsKey(roomName)) // Si nouvelle room, on crée une liste de sub
roomSub.Add(roomName, new List<EndPoint>());
/* !!!!!!!!!!!!!!!!!!!!!! CREE ROOM GLOBAL */
}
/// <summary>
/// Ecoute le reseau et traite les message reçu
/// </summary>
/// <param name="serverSocket">Socket du serveur</param>
static void readNet(Socket serverSocket)
{
byte[] buffer = new byte[1500];
......@@ -99,52 +134,52 @@ namespace ServeurUdp
{
Console.WriteLine('\n' + "Attente d'une nouveau message...");
// Reception message client
// Reception message client et sauvegarde du dernier client
EndPoint lastUser = new IPEndPoint(IPAddress.Any, 0);
int nBytes = serverSocket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref lastUser);
ChatMessage receive = new ChatMessage(buffer);
// Decodage du buffer de bytes en ASCII vers un string
// On recupere le contenu du message
String msg = receive.data;
// ========= Gestion de commande ===============
switch (receive.commande)
{
case Commande.POST:
case Commande.POST:// Si post : On enregistre le message, on envoi au sub et on repond
string room = getRoom(lastUser);
Console.WriteLine(" <" + lastUser + "> " + msg);
roomMessages[room].Add(receive);
SendAnswer(serverSocket, lastUser, receive.commande);
SendToSub(serverSocket, roomSub[room], receive);
break;
case Commande.GET:
case Commande.GET:// Si get : On envoie une reponse, et tout les messages
Console.WriteLine(" <" + lastUser + "> GET");
SendAnswer(serverSocket, lastUser, receive.commande);
SendAllMsg(serverSocket, lastUser);
break;
case Commande.SUBSCRIBE:
case Commande.SUBSCRIBE: // Si Sub : On rengistre le sub et on envoie la reponse de confirm
Console.WriteLine(" <" + lastUser + "> SUBSCRIBE");
SendAnswer(serverSocket, lastUser, receive.commande);
roomSub[getRoom(lastUser)].Add(lastUser);
break;
case Commande.UNSUBSCRIBE:
case Commande.UNSUBSCRIBE:// Si Sub : On rengistre le UNSUB et on envoie la reponse de confirm
Console.WriteLine(" <" + lastUser + "> UNSUBSCRIBE");
SendAnswer(serverSocket, lastUser, receive.commande);
subscribers.Remove(lastUser);
roomSub[getRoom(lastUser)].Remove(lastUser);
break;
case Commande.STOPSERVEUR:
case Commande.STOPSERVEUR: // Si stopserveur : On stop le serv
Console.WriteLine(" <" + lastUser + "> STOPSERVEUR");
SendAnswer(serverSocket, lastUser, receive.commande);
stopServeur(ref serverSocket);
break;
case Commande.HELP:
case Commande.HELP: // Si help: on envoie les commandes possibles
Console.WriteLine(" <" + lastUser + "> HELP");
string help = '\n' + "0:POST" + '\n' + "1:GET" + '\n' + "2:HELP" + '\n' + "3:QUIT" + '\n' + "4:STOPSERVEUR" + '\n' + "5:SUBSCRIBE" + '\n' + "6:SUBSCRIBEv2" + '\n' + "7:UNSUBSCRIBE";
ChatMessage c = new ChatMessage(Commande.HELP, CommandeType.REPONSE, help);
SendToOne(serverSocket, lastUser, c);
break;
case Commande.CREATEROOM:
case Commande.CREATEROOM: // Si createroom : on fait rejoindre la room
Console.WriteLine(" <" + lastUser + "> CREATEROOM");
SendAnswer(serverSocket, lastUser, receive.commande);
JoinRoom(receive.data,lastUser);
......@@ -155,6 +190,10 @@ namespace ServeurUdp
}
}
/// <summary>
/// Coupe le serveur et la socket
/// </summary>
/// <param name="socket">Socket du serveur</param>
static void stopServeur(ref Socket socket)
{
Console.WriteLine("Fermeture Socket...");
......@@ -165,11 +204,14 @@ namespace ServeurUdp
Environment.Exit(0);
}
/// <summary>
/// Programme principal
/// </summary>
static void Main(string[] args)
{
try
{
// On crée la room global
if (!roomMessages.ContainsKey("global"))
roomMessages.Add("global", new List<ChatMessage>());
if (!roomSub.ContainsKey("global"))
......@@ -183,7 +225,7 @@ namespace ServeurUdp
Console.WriteLine("=============================================");
Console.WriteLine("=============================================" + '\n' + '\n');
//// Création de la socket d'écoute UDP
//// Création de la socket du serveur
Socket serverSocket = new Socket(
AddressFamily.InterNetwork,
SocketType.Dgram,
......@@ -194,7 +236,7 @@ namespace ServeurUdp
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 11111));
//************************************************************** Communications
// Lancement du thread d'ecoute
Thread listen = new Thread(x => readNet(serverSocket));
listen.Start();
}
......
......@@ -23,18 +23,26 @@ namespace TronServeur
System.Console.WriteLine("Initialisation");
// TODO Creation de la socket d'écoute TCP
Socket listenSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
// TODO Creation du tableau des sockets connectées
List<Socket> listSocket = new List<Socket>();
// Creation du moteur de jeu
myTron = new Tron.Tron(nJoueurs, taille);
// TODO Bind et listen
listenSocket.Bind(new IPEndPoint(IPAddress.Any, 11111));
listenSocket.Listen(10);
// TODO Acceptation des clients
Console.WriteLine("Attente d'une nouvelle connexion...");
Socket connectedSocket = listenSocket.Accept();
listSocket.Add(connectedSocket);
// TODO Envoie des paramètres
// ************************************* Routine à chaque tour
System.Console.WriteLine("Routine");
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment