COMMUNICATION CLIENT/SERVEUR BASIQUE AVEC SINGLETON

billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 3 nov. 2005 à 15:57
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 - 3 nov. 2005 à 17:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/34470-communication-client-serveur-basique-avec-singleton

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
3 nov. 2005 à 17:10
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 :)
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 nov. 2005 à 15:57
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
Rejoignez-nous