1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
class Program
{
public List<Player> players = new List<Player>();
public server Server = new server() ;
public static int Main()
{
int recv;
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8888);
Program prog = new Program();
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
//Message de bienvenue et titre du serveur
Console.WriteLine("Arcadia Serveur 0.1\n");
newsock.Bind(ipep);
//Message indiquand l'attente de client !
Console.WriteLine("Waiting for a client...");
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
recv = newsock.ReceiveFrom(data, ref Remote);
//******************
// On split les données recu afin de partager les différente commandes executé !! Première case du tableau doit toujours etre egal au pseudo de l'user
//******************
List<string> data_parse0 = new List<string>();
string[] tab0 = Encoding.ASCII.GetString(data, 0, recv).Split('-');
foreach( string i in tab0)
{
data_parse0.Add(i);
}
string id0 = data_parse0[0];
string machine_nom = data_parse0[1];
data_parse0.RemoveAt(0);
data_parse0.RemoveAt(0);
Console.Write("[ " + id0 + " ] - " + Remote.ToString()+" : "+ prog.executeCommande(data_parse0,id0)+"\n");
//Console.WriteLine("{0}\n", Remote.ToString());
string welcome = "Welcome to my Serveur\n\n";
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
prog.Server.Ip_server = ipep.Address;
//On rentre dans une boucle infinie qui gère les transaction udp entrant/sortant en repondant en sortie en permancence jusqua fermeture du serveur par commande ou Hard Off/Crash
while (true)
{
data = new byte[1024];
recv = newsock.ReceiveFrom(data, ref Remote);
//******************
// On split les données recu afin de partager les différente commandes executé !! Première case du tableau doit toujours etre egal au pseudo de l'user
//******************
List<string> data_parse = new List<string>();
string[] tab = Encoding.ASCII.GetString(data, 0, recv).Split('-');
foreach (string i in tab)
{
data_parse.Add(i);
}
//Récupere le nom (ID) du player connecté !!
string id = data_parse[0];
string machine_type = data_parse[1];
//Control si le player est un nouveau player connecté ou pas! Si oui on instancie un nouvel objet player et l'ajoute au tableau des joueurs
bool newLogin = true;
foreach(Player var in prog.players)
{
if(var.Device_name.Equals(id))
{
newLogin = false;
}
}
//Si c'est un nouveau player qui se connecte on construit un nouvel objet "player"
if (newLogin && data_parse[2].Equals("login"))
{
IPEndPoint remoteIpEndPoint = Remote as IPEndPoint;
prog.players.Add(new Player(id,id,data_parse[1],remoteIpEndPoint.Address));
}
data_parse.RemoveAt(0);
data_parse.RemoveAt(0);
string resultat = prog.executeCommande(data_parse,id);
data = Encoding.ASCII.GetBytes(resultat);
Console.WriteLine("[ " + id0 + " ] " + " [ " + machine_type + " ] - " + resultat);
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
//Control de commande spécial à appeler après l'envoie de message tel que "Stoper le serveur"
if (resultat.Equals("stoping server"))
{
newsock.Shutdown(SocketShutdown.Both);
newsock.Dispose();
newsock.Close(0);
return 0;
}
}
}
//LA fonction qui execute les traitements d'après le tableau de commande envoye
public string executeCommande(List<string> commande,string user_name)
{
string res = "";
switch (commande[0])
{
//Se logue au serveur
case "login":
res = "succes login";
break;
//Se deconnecte du serveur
case "exit":
case "bye":
case "disconnect":
int index = 0;
if (controlUserLogin(user_name))
{
int i = 0;
foreach (Player var in players)
{
if (var.User_name.Equals(user_name))
{
index = i;
res = "succes deconnected ";
}
i++;
}
players.RemoveAt(index);
} else { res = "you are not loged"; }
break;
//Stop le serveur
case "stop":
if (controlUserLogin(user_name)){res = "stoping server";}else { res = "you are not loged"; }
break;
//Ping le serveur
case "ping":
if (controlUserLogin(user_name)) { res = "ping "+ Server.Ip_server; } else { res = "you are not loged"; }
break;
//Renvoie la liste des joueurs connecté preésent dans le tableau de class "players"
case "list":
case "player":
case "players":
if (controlUserLogin(user_name))
{
foreach (Player var in players)
{
res += var.User_name + " : " + var.Plateform_name + "\n";
}
}
else { res = "you are not loged"; }
break;
default:
res = "command error";
break;
}
return res;
}
private bool controlUserLogin(string userName)
{
bool control = false;
foreach (Player var in players)
{
if (var.User_name.Equals(userName))
{
control = true;
}
}
return control;
}
} |
Partager