samedi 24 février 2007

Class player côté serveur (version light)

Voici comme promis la Class Player (version light)

public class SPlayer
{

protected static int counterid=0; //Le counter id commun à tous les player
protected string login=""; //Le nom du peer



public uint IndexModif=1; //Quelque chose est-il modif ?
public uint IndexModif_Login=1; //Sous index de modif de login

Id=counterid++; //Défini son ID unique


}

Ca suffit pour comprendre ce que j'ai à expliquer. (Si vous avez des questions, laissez-les en commentaires.)
Vous remarquerez que l'ip n'est pas stocker dans la class, sachant que l'on à l'ID, cela est inutile de surcharger la class, elle est déjà bien assez imposante.
Il n'y à pas de position, angle, ou autre, sachant que toutes ces informations ne circulent pas par le serveur mais directement entre les peers (ce qui économise la majeure partie de bande passante utilisée dans les jeux). Ici seul nous intéresse son login (pseudo) son id (relié à son ip par le fichier texte cf. précèdent) et savoir si quelque chose à changer.

La création d'un player se fait à la connexion d'un peers, et à sa déconnection, l'entité est détruite ainsi que son entrée dans le fichier texte (grâce à son id)

Mais à quoi va-t-elle nous servir ?
Simplement à créer une entité avec laquelle on puisse directement communiquer et que l'on puisse nommer.
Ainsi on procédera facilement aux différentes opérations que le serveur devra faire en communications avec les clients.


Voila, pour le moment je ne fais que présenter la class, elle sera utile afin de comprendre les prochains codes. Il est à noter qu'une class semblable sera présente côté peers.
Le prochain post, traitera de l'envoi d'information afin de tenir le fichier texte ID/IP côté client.

Ou en est le projet ?

Je ne vais pas m'attarder à présenter les différents aspects du moteur réseau, ni comment je vais les gérer, vous le découvrirez au fil du développement lors de la conversion du moteur réseau, bout par bout.


J'ai, à ce jour, presque terminé la gestion des peers (clients) connectés. Le tout est codé, et presque fonctionnel à 100%.

Ma technique est très simple, bien qu'elle m'ait obligée à poser les bases du moteur réseau en lui même. Une liste telle la suivante est tenue à jour sur le serveur:

127.0.0.1:2763
0
127.0.0.2:2764
1
127.0.0.3:2765
2
127.0.0.4:2766
3
127.0.0.5:2767
4

On reconnait dans ce fichier l'adresse ip des clients, le port utilisé, et en dessous l'id du peer.
A chaque connexion d'un peer, une entrée dans le fichier est créée, et un message est envoyé à tout les autres peers déjà enregistrés dans cette liste pour leur dire d'ajouter cette entrée.
Il en est de même à chaque déconnection. Quand un peer se déconnecte, il envoi un message au serveur pour lui dire d'enlever son entrée. Dans le cas ou le peer plante, au bout de 10 secondes où le peer ne répond pas, il le considère comme déconnecté.

On peut ainsi tenir une liste des peers connectés à jour, et constamment pareille, entre les peers et le serveur.

Au niveau code ça donne ca :



  • Pour l'ajout d'une entrée côté serveur :
listener=new TcpListener(IPAddress.Any,16840); //On ouvre le socket
listener.Start(); // On lance l'écoute
Tools.Log("Starting server"); // On affiche dans la console l'état
while(true)
{
Socket socket=listener.AcceptSocket();
Tools.Log("Connexion de "+socket.RemoteEndPoint); // Y'a un client

using (StreamWriter sw = File.AppendText("test.txt")) //On ouvre un fichier texte
{
sw.WriteLine(socket.RemoteEndPoint); // On y écrit son IP
sw.WriteLine(ClientPlayer.Id); //on va à la ligne pour son ID

}

A noter :
ClientPlayer = new SPlayer();


Je posterai la class Splayer afin que vous compreniez les prochains morceaux de codes, et l'envoi d'information afin de tenir le même fichier texte côté client.

Ouverture du Devlog

Tout d'abord pourquoi ce Devlog ?

Tout simplement afin de tenir au courant les personnes intéressées des évolutions de mon projet. (et pouvoir recevoir des critiques)

Pourquoi Maintenant ?

J'en avais le temps et l'envie, donc pourquoi pas. Et le projet que je concocte commence à être intéressant pour moi, donc pourquoi ne pas en faire profiter qui veux ?

Que vais-je y trouver ?

Les avancées de mon projet, mes découvertes et recherches


Quel projet ?

Le projet est un moteur pour MMO mi-décentralisé. L'objectif à terme, est de pouvoir gérer plus de 500 joueurs sur un serveur bas de gamme avec les exigences d'un FPS (rapidité de réponse, interpolation,....) . Je me base sur le moment sur un moteur réseau fait, afin de le modifier petit à petit vers un réseau décentralisé capable de gérer une myriade de joueurs.

Merci à listorien qui m'autorise à me baser sur son travail.