IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

[Sql Server] - Notification de mise à jour


Sujet :

Silverlight

  1. #1
    Membre régulier Avatar de Anto03
    Inscrit en
    Octobre 2005
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 155
    Points : 87
    Points
    87
    Par défaut [Sql Server] - Notification de mise à jour
    Bonjour à tous,

    Dans mon appli silverlight je dois vérifier qu'un champ d'une table n'a pas été modifié. Pour se faire j'ai fait un petit timer qui vérifie cela toute les secondes.

    Ma question, vous la voyez venir, est simple : plutôt que de faire une requête toute les secondes peut on notifier la modification au client silverlight ??

    Merci d'avance pour votre aide.
    Antony, développeur .Net
    http://www.flecheinthepeche.fr/blog/

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Anto03 Voir le message
    Bonjour à tous,

    Dans mon appli silverlight je dois vérifier qu'un champ d'une table n'a pas été modifié. Pour se faire j'ai fait un petit timer qui vérifie cela toute les secondes.
    Peut on savoir pourquoi cette vérification

  3. #3
    Membre régulier Avatar de Anto03
    Inscrit en
    Octobre 2005
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 155
    Points : 87
    Points
    87
    Par défaut
    Oui bien sûr. Il s'agit d'un petit jeu en silverlight qui se joue joueur contre joueur et tour par tour (comme une partie d'échec).

    Donc le joueur 1 joue, il met à jour un champ dans une table pour dire qu'il a fini son tour. Ensuite le joueur 2 doit savoir que c'est à son tour de jouer, d'ou mon timer.

    L'idée du timer ne me plait pas vraiment, c'est pour ça que je pose la question
    Antony, développeur .Net
    http://www.flecheinthepeche.fr/blog/

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je pense qu'il existe d'autre méthodes plus appropriées que ta méthode qui n'est pas assez élégante. Ben il va falloir que je fouille dans mes TP il me semble que j'ai une fois résolu ce genre de truc.
    Je te fais signe d'ici peu ..

  5. #5
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    un serveur pardi c'est fait pour.
    SL => Serveur => SL


    chaque client communique au serveur qui communique avec l'autre client. C'est comme cela que marchent tous les jeux d'Internet. Un Serveur SQL ne fait pas de "push" à ma connaissance
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  6. #6
    Membre régulier Avatar de Anto03
    Inscrit en
    Octobre 2005
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 155
    Points : 87
    Points
    87
    Par défaut
    En effet, l'idée du serveur m'a traversé l'esprit. Mais même souci, ce sera le serveur qui fera le test toute les secondes et qui notifiera la modification à l'application silverlight !

    A la limite, c'est son boulot, mais j'avais peur que ce soit trop lourd si ya 100 joueurs par exemple ça fait 100 requêtes par seconde....

    Dans ce cas là, techniquement ça marche comment ?
    Antony, développeur .Net
    http://www.flecheinthepeche.fr/blog/

  7. #7
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    Citation Envoyé par Anto03 Voir le message
    En effet, l'idée du serveur m'a traversé l'esprit. Mais même souci, ce sera le serveur qui fera le test toute les secondes et qui notifiera la modification à l'application silverlight !

    A la limite, c'est son boulot, mais j'avais peur que ce soit trop lourd si ya 100 joueurs par exemple ça fait 100 requêtes par seconde....

    Dans ce cas là, techniquement ça marche comment ?
    pas du tout. le serveur ne fait pas de test, il écoute. c'est ton client qui appelle le serveur pour dire "j'ai joué ceci". le serveur vérifie que c'était bien à ce joueur de jouer, il entre le choix du mec en base puis contacte l'autre client (avec qui il a une connexion constante puisque c'est un serveur) et lui dit, à toi de jouer, ton ennemi a joué ceci. dans le même temps, il envoie au joueur qui a joué une commande pour dire "c'est au tour de l'autre, merci d'attendre".

    Après, je connais pas les détails de ton jeu, car un tour par tour peut se faire dans la durée (plusieurs jours) mais il faut penser connexion avec le serveur et un principe de "push" dans les deux sens, pas de timer ou quoi que ce soit. juste des listener
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  8. #8
    Membre régulier Avatar de Anto03
    Inscrit en
    Octobre 2005
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 155
    Points : 87
    Points
    87
    Par défaut
    Merci Louis-Guillaume pour ces infos !

    C'est en effet exactement ce qu'il me faut ! Une partie se déroulera en 2 min en moyenne avec des tours de 10 secondes maximum. Au bout de 10 secondes si le joueur n'a pas joué on passe au joueur suivant.

    Si je suis ton raisonnement pour mettre en place ça coté serveur, il faut que le serveur enregistre l'heure lorsque il donne la main au joueur 1 et si au bout de 10 secondes il reçoit aucune réponse il passe la main, c'est ça ? Donc là, Timer ? lol

    Bon j'ai la théorie, mais techniquement ou puis-je trouver des ressources ou exemple ? h2s84 tu as un TP sur ce sujet ??
    Antony, développeur .Net
    http://www.flecheinthepeche.fr/blog/

  9. #9
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    Citation Envoyé par Anto03 Voir le message
    Merci Louis-Guillaume pour ces infos !

    C'est en effet exactement ce qu'il me faut ! Une partie se déroulera en 2 min en moyenne avec des tours de 10 secondes maximum. Au bout de 10 secondes si le joueur n'a pas joué on passe au joueur suivant.

    Si je suis ton raisonnement pour mettre en place ça coté serveur, il faut que le serveur enregistre l'heure lorsque il donne la main au joueur 1 et si au bout de 10 secondes il reçoit aucune réponse il passe la main, c'est ça ? Donc là, Timer ? lol

    Bon j'ai la théorie, mais techniquement ou puis-je trouver des ressources ou exemple ? h2s84 tu as un TP sur ce sujet ??
    alors oui et non. J'ai pas trop le temps de réfléchir à ton problème, mais non pas besoin de timer. Pour moi, la vérification serveur se fait en faisant une comparaison avec leur de la dernière action de l'autre joueur. ca coute "une soustraction" plutôt qu'un timer qui tourne constamment.

    ou alors, tu mets un timer chez le client.


    pour les ressources, cherche les articles qui parlent de chat en silverlight, c'est le meme principe de communication. après, tu mets ce que tu veux dans le message, des commandes ou autre.
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  10. #10
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Tu as 2 solutions :
    • Un service wcf en polling duplex
    • Un serveur de socket


    Selon la charge que tu estimes il faut choisir.
    Je crois que la limite d'un WCF en polling duplex c'est 10 clients.

    Pour un serveur de socket c'est illimité.
    Oublie pas de prendre en compte le fait que plusieurs parties peuvent être joué en même temps.

    M'est avis que tu vas terminer sur un serveur de socket comme moi j'ai opté pour mon jeu.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  11. #11
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ah et pour ton système de 10 secondes sans jouer.
    Dès que le serveur dit à un client : c'est ton tour.
    Tu lances un timer de 10sec.
    Si le Tick s'exécute tu envoies au serveur la requête qui dit : le tour est fini, signale au joueur suivant que c'est à lui.
    Si le joueur joue avant, tu stop ton timer.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  12. #12
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par Anto03 Voir le message
    Bonjour à tous,

    Dans mon appli silverlight je dois vérifier qu'un champ d'une table n'a pas été modifié. Pour se faire j'ai fait un petit timer qui vérifie cela toute les secondes.

    Ma question, vous la voyez venir, est simple : plutôt que de faire une requête toute les secondes peut on notifier la modification au client silverlight ??

    Merci d'avance pour votre aide.
    Marrant, cela me fait penser à ca: http://msdn.microsoft.com/en-us/library/ms175110.aspx

  13. #13
    Membre régulier Avatar de Anto03
    Inscrit en
    Octobre 2005
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 155
    Points : 87
    Points
    87
    Par défaut
    Merci pour toutes vos réponses !

    @Skyounet : Le serveur de socket me paraît en effet le plus adapté. Pour les 10 secondes je voyais bien les choses comme ça aussi . Aurais tu un lien, une documentation technique pour faire un serveur de socket sous silverlight / C# ?

    @Thomas Lebrun : en effet, j'avais déjà trouvé de la documentation à ce sujet. Avec WCF : http://msdn.microsoft.com/en-us/libr...1(BTS.10).aspx
    Et la notification avec Oracle : http://www.codeproject.com/KB/WCF/WC...ification.aspx mais je ne sais pas si c'est facilement applicable sous sql Serveur.

    De toute façon, si j'opte pour le système de serveur de Louis-Guillaume et Skyounet je n'ai plus besoin de ce système !
    Antony, développeur .Net
    http://www.flecheinthepeche.fr/blog/

  14. #14
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par Anto03 Voir le message
    @Thomas Lebrun : en effet, j'avais déjà trouvé de la documentation à ce sujet. Avec WCF : http://msdn.microsoft.com/en-us/libr...1(BTS.10).aspx
    Et la notification avec Oracle : http://www.codeproject.com/KB/WCF/WC...ification.aspx mais je ne sais pas si c'est facilement applicable sous sql Serveur.
    Le lien http://msdn.microsoft.com/en-us/libr...1(BTS.10).aspx te montre comment faire avec SQL Server donc pas de pb

  15. #15
    Invité
    Invité(e)
    Par défaut
    Mon TP, je ne l'ai pas encore trouvé mais comme parmi les solutions proposées par Skyounet j'utilisais les sockets et mon client était en Winform.
    Bref je crois que tu devrait te pencher sur les sockets non ?

  16. #16
    Membre régulier Avatar de Anto03
    Inscrit en
    Octobre 2005
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 155
    Points : 87
    Points
    87
    Par défaut
    Désolé pour le retard de ma réponse... Donc oui évidemment je me suis lancé dans les sockets !

    Voici les quelques liens que j'ai trouvé pour ceux que ça intéresse :

    http://weblogs.asp.net/dwahlin/archi...ts-part-i.aspx
    http://techblogging.wordpress.com/20...n-silverlight/

    Si vous avez d'autres ressources je suis preneur !

    Merci beaucoup pour votre aide à tous en tout cas !!
    Antony, développeur .Net
    http://www.flecheinthepeche.fr/blog/

  17. #17
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ben je peux te montrer mon code si tu veux
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  18. #18
    Membre régulier Avatar de Anto03
    Inscrit en
    Octobre 2005
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 155
    Points : 87
    Points
    87
    Par défaut
    Rooh oui je veux bien ! Grand fou va !

    Plaisanterie mis à part, oui je serais très curieux de voir ça surtout que ce que tu as fait ce rapproche bcp de ce que je veux faire si j'ai tout compris ?

    Comment on procède pour l'envoie ?
    Antony, développeur .Net
    http://www.flecheinthepeche.fr/blog/

  19. #19
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Alors déjà il te faut 2 serveurs. Un qui va être utiliser pour le Clientaccesspolicy et un autre qui sera ton serveur à toi.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.IO;
    using System.Net;
     
    namespace CrossPolicyServer
    {
        // Encapsulate and manage state for a single connection from a client
        class PolicyConnection
        {
            private Socket mConnection;
     
            // buffer to receive the request from the client
            private byte[] mBuffer;
            private int mReceived;
     
            // the policy to return to the client
            private byte[] mPolicy;
     
            // the request that we're expecting from the client
            private static string policyRequestString = "<policy-file-request/>";
     
            public PolicyConnection(Socket client, byte[] policy)
            {
                mConnection = client;
                mPolicy = policy;
     
                mBuffer = new byte[policyRequestString.Length];
                mReceived = 0;
     
                try
                {
                    // receive the request from the client
                    mConnection.BeginReceive(mBuffer, 0, policyRequestString.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
                }
                catch (SocketException)
                {
                    mConnection.Close();
                }
            }
     
            // Called when we receive data from the client
            private void OnReceive(IAsyncResult res)
            {
                try
                {
                    mReceived += mConnection.EndReceive(res);
     
                    // if we haven't gotten enough for a full request yet, receive again
                    if (mReceived < policyRequestString.Length)
                    {
                        mConnection.BeginReceive(mBuffer, mReceived, policyRequestString.Length - mReceived, SocketFlags.None, new AsyncCallback(OnReceive), null);
                        return;
                    }
     
                    // make sure the request is valid
                    string request = System.Text.Encoding.UTF8.GetString(mBuffer, 0, mReceived);
                    if (StringComparer.InvariantCultureIgnoreCase.Compare(request, policyRequestString) != 0)
                    {
                        mConnection.Close();
                        return;
                    }
     
                    // send the policy
                    mConnection.BeginSend(mPolicy, 0, mPolicy.Length, SocketFlags.None, new AsyncCallback(OnSend), null);
                }
                catch (SocketException)
                {
                    mConnection.Close();
                }
            }
     
            // called after sending the policy to the client; close the connection.
            public void OnSend(IAsyncResult res)
            {
                try
                {
                    mConnection.EndSend(res);
                }
                finally
                {
                    mConnection.Close();
                }
            }
        }
     
        // Listens for connections on port 943 and dispatches requests to a PolicyConnection
        class PolicyServer
        {
            private Socket mListener;
            private byte[] mPolicy;
     
            // pass in the path of an XML file containing the socket policy
            public PolicyServer(string policyFile)
            {
                // Load the policy file
                FileStream policyStream = new FileStream(policyFile, FileMode.Open);
     
                mPolicy = new byte[policyStream.Length];
                policyStream.Read(mPolicy, 0, mPolicy.Length);
     
                policyStream.Close();
     
     
                // Create the Listening Socket
                mListener = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
     
                // Put the socket into dual mode to allow a single socket 
                // to accept both IPv4 and IPv6 connections
                // Otherwise, server needs to listen on two sockets,
                // one for IPv4 and one for IPv6
                // NOTE: dual-mode sockets are supported on Vista and later
                mListener.SetSocketOption(SocketOptionLevel.IPv6, (SocketOptionName)27, 0);
     
                mListener.Bind(new IPEndPoint(IPAddress.IPv6Any, 943));
                mListener.Listen(10);
     
                mListener.BeginAccept(new AsyncCallback(OnConnection), null);
            }
     
            // Called when we receive a connection from a client
            public void OnConnection(IAsyncResult res)
            {
                Socket client = null;
     
                try
                {
                    client = mListener.EndAccept(res);
                }
                catch (SocketException)
                {
                    return;
                }
     
                // handle this policy request with a PolicyConnection
                PolicyConnection pc = new PolicyConnection(client, mPolicy);
     
                // look for more connections
                mListener.BeginAccept(new AsyncCallback(OnConnection), null);
            }
     
            public void Close()
            {
                mListener.Close();
            }
        }
     
     
     
        public class Program
        {
            static void Main(string[] args)
            {
                PolicyServer ps = new PolicyServer("clientaccesspolicy.xml");
                System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
            }
     
        }
    }

    Ensuite là fichier xml qui va bien :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding ="utf-8"?>
    <access-policy>
      <cross-domain-access>
        <policy>
          <allow-from>
            <domain uri="*" />
          </allow-from>
          <grant-to>
            <socket-resource port="4530" protocol="tcp" />
          </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>

    J'utilise donc le port 4530 pour mon serveur pour mon jeu.

    Et en gros pour le serveur ça donne ça

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    class Server
    {
        public void Initialize()
        {
            Console.WriteLine("Starting Socket listener...");
            WaitingForClients();
            //mThreadConnection = new Thread(new ThreadStart(WaitingForClients));            
        }
     
        private void WaitingForClients()
        {
            mListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 4530);
     
            mListener.Start();
     
            while (true)
            {
                Socket client = mListener.AcceptSocket();
     
                Console.WriteLine(string.Format("Starting Socket Listener for client {0}", client.RemoteEndPoint.ToString()));
     
                int id = ReadId(client);
     
                WaitForReceive(client);
            }
        }
     
        private short ReadId(Socket client)
        {
            using (BinaryReader reader = new BinaryReader(new NetworkStream(client)))
            {
                reader.ReadInt16(); /* swap command */
                return reader.ReadInt16();
            }
        }
     
        private void OnAsyncSocketOperationComplete(object sender, SocketAsyncEventArgs e)
        {
            if (e.LastOperation == SocketAsyncOperation.Receive)
            {
                DataReceived(e);
            }
        }
     
        private void WaitForReceive(Socket socket)
        {
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
     
            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(OnAsyncSocketOperationComplete);
            socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
            socketEventArg.UserToken = socket;
            socketEventArg.SetBuffer(new byte[256], 0, 256);
     
            socket.ReceiveAsync(socketEventArg);
        }
     
        private void DataReceived(SocketAsyncEventArgs e)
        {
            if (e.BytesTransferred == 0)
            {
                // player disconnected
                return;
            }
     
            using (MemoryStream stream = new MemoryStream(e.Buffer, e.Offset, e.BytesTransferred))
            {
                using (BinaryReader reader = new BinaryReader(stream))
                {
                    short command = reader.ReadInt16();
     
                    switch ((Command)command)
                    {
                        case ...
     
                        default:
                            break;
                    }
                }
            }
     
            WaitForReceive(e.UserToken as Socket);
        }
     
        private void SendCommand(Socket socket, params short[] args)
        {
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
     
            socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
            socketEventArg.UserToken = socket;
     
            // juste une méthode pour convertir un tableau de short en tableau de byte
            byte[] bytes = Utils.Convert(args);
     
            socketEventArg.SetBuffer(bytes, 0, bytes.Length);
     
            socket.Send(bytes);
        }
     
    }

    Et dans mon serveur j'ai une liste de Player (mais j'ai pas mis dans le code là) avec Player qui est :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Player
    {
        public Players PlayerEntity { get; set; }
        public Socket Socket { get; set; }
    }

    Players c'est une classe qui vient de ma bdd générée via Linq To Entities.

    Ensuite chaque Players est relié à un GameInfo (aussi une table en bdd) pour gérer plusieurs jeux en même temps.

    Donc un player parle au serveur avec comme format : commande arguments
    arguments ça peut être par exemple : joueur provenance, joueur destination, case a attaquer
    De l'autre côté selon la commande (un enum) je récupère les différents arguments. Quand le nombre d'argument est variables le format devient
    commande nombre d'argument arguments.

    De l'autre côté pour le joueur c'est la même principe si ce n'est qu'il faut se connecter au serveur d'abord.
    Si tu as des problèmes pour cette partie je pourrais te montrer.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  20. #20
    Invité
    Invité(e)
    Par défaut
    Comme j'ai pas trouvé mon TP et que je suis paresseux de te faire un p'tit exemple. En voivi un.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/08/2009, 16h07
  2. DataSet - SQL Server 2005 Problème mise à jour
    Par djunityfr dans le forum Windows Forms
    Réponses: 1
    Dernier message: 29/06/2009, 16h12
  3. [SQL Server 2000] Liste des jours d'un mois donné
    Par luimême dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/04/2008, 11h27
  4. Réponses: 1
    Dernier message: 23/01/2008, 14h27
  5. [2000 Server] Problème de mise à jour windowsupdate !!
    Par rohstev dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 24/08/2005, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo