Communication client/serveur basique avec singleton

Soyez le premier à donner votre avis sur cette source.

Vue 19 059 fois - Téléchargée 25 886 fois

Description

Afin de répondre a une question du forum ( http://www.csharpfr.com/forum.v2.aspx?ID=592852 ), voici la mise en oeuvre d'un Singleton pour partager une instance de Socket dans plusieurs classes d'une application

Conclusion :


Quelque soit le nombre de fenetres clientes ouvertes, c'est toujours la meme instance du socket qui est utilisée (via le Singleton).
Il n'y a donc qu'une seule connexion au serveur.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

billou_13
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
16
Merci MorpionMx pour ta source.

Cependant, une petite remarque à propos de ta classe singleton : plusieurs sockets pourront être créés si l'application lance plusieurs threads. Pour explication, je t'envoie le lien vers une epxlication (en Anglais) mais très claire au sujet des singletons :
http://www.yoda.arachsys.com/csharp/singleton.html

La meilleure solution est donc la 5ème de la page. Ce qui donne pour ton code :

public sealed class Singleton
{
private Socket socket;

Singleton()
{
try
{
this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
// Connecte le socket sur le port 1025 du localhost
this.socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1025));
}
catch(Exception e) { MessageBox.Show(e.ToString());}
}

public static Singleton Instance
{
get
{
return Nested.instance;
}
}

class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}

internal static readonly Singleton instance = new Singleton();
}
}

Par ainsi, pour récupérer le socket, il te suffit de mettre en attribut de ta classe :
private Singleton sock = Singleton.Instance;

(Méthode testée et efficace contre le multithread).

Bonne journée à toi,

Billou_13
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
42
Certes, tu as tout a fait raison.
J'ai juste fait cette source pour repondre basiquement a la question, sans penser au MultiThread.

Merci pour ton exemple :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.