コード例 #1
0
        /// <summary>
        /// Méthode du processus léger écoutant les connexions des clients. A chaque nouveau client est associé un processus léger ainsi qu'une socket.
        /// </summary>
        private void listenConnect()
        {
            Socket   clientSocket   = null;
            MySocket clientMySocket = null;

            while (true)
            {
                try {
                    clientSocket   = listener.AcceptSocket();
                    clientMySocket = new MySocket(clientSocket);
                    //Un client se connecte, démarrage un processus léger:
                    Thread clientThread = new Thread(receiveClientMsg);
                    clientThread.Start(clientMySocket);

                    //Ajout du client dans la table de hachage:
                    clients.Add(clientMySocket, clientThread);
                    //Création et levée de l'évènement:
                    ServerEventArgs e = new ServerEventArgs(clientMySocket.Id, ServerEventArgs.typeEvent.CONNEXION, null);
                    serverSocketReceiveEvent(this, e);
                }
                catch {
                    break;
                }
            }
        }
コード例 #2
0
        public void serverEventFunc(object sender, SocketLibrary.ServerEventArgs e)
        {
            switch (e.Type)
            {
            case ServerEventArgs.typeEvent.MESSAGE:    //dans cet exemple on fait un écho dès la réception du message
                byte[] count = new byte[4];
                count = BitConverter.GetBytes(e.Msg.Length);
                byte[] msgecho = new byte[4 + e.Msg.Length];
                count.CopyTo(msgecho, 0);
                e.Msg.CopyTo(msgecho, 4);
                //test the msg at server
                string ss = Encoding.Default.GetString(e.Msg);
                setMsgecho(ss);
                if (!myServer.send(e.Id, msgecho))
                {
                    Console.WriteLine("client déconnecté");
                }
                //client déconnecté
                break;

            case ServerEventArgs.typeEvent.CONNEXION:
                //Un client s'est connecté. (e.Msg = null)
                MessageBox.Show("Connexion du client " + e.Id, "co", MessageBoxButtons.OK);
                break;

            case ServerEventArgs.typeEvent.DECONNEXION:
                //Un client s'est déconnecté. (e.Msg = null)
                MessageBox.Show("Déconnexion du client " + e.Id, "déco", MessageBoxButtons.OK);
                break;
            }
        }
コード例 #3
0
 public bool Send(int id, byte[] msg)
 {
     try {
         foreach (MySocket ms in clients.Keys)
         {
             if (ms.Id == id)
             {
                 ms.Socket.Send(msg, SocketFlags.None);
                 return(true);
             }
         }
         return(false);
     }
     catch {
         ServerEventArgs e = new ServerEventArgs(id, ServerEventArgs.typeEvent.DECONNEXION, null);
         serverSocketReceiveEvent(this, e);
         MySocket.addFreeId(id, getBiggestId());
         return(false);
     }
 }
コード例 #4
0
        /// <summary>
        /// Méthode du processus léger écoutant les messages des clients. Le processus léger est bloquant sur le receive, et implique que la taille du message soit contenue dans les quatre premiers octets de celui-ci.
        /// Un event est levé à chaque réception de message.
        /// </summary>
        private void receiveClientMsg(Object o)
        {
            MySocket cs = (MySocket)o;

            while (true)
            {
                try {
                    //Les quatre premiers octets contiennent la taille du message:
                    byte[] count = new byte[4];
                    cs.Socket.Receive(count, SocketFlags.None);
                    //La taille du message est maintenant connue:
                    byte[] msg = new byte[BitConverter.ToInt32(count, 0)];
                    cs.Socket.Receive(msg, msg.Length, SocketFlags.None);
                    //Création et levée de l'évènement:
                    ServerEventArgs e = new ServerEventArgs(cs.Id, ServerEventArgs.typeEvent.MESSAGE, msg);
                    serverSocketReceiveEvent(this, e);
                }
                catch {
                    if (cs.Socket != null)
                    {
                        //Erreur durant la réception du message, le client est déconnecté:
                        cs.Socket.Close();
                    }
                    if (serverSocketReceiveEvent != null)
                    {
                        ServerEventArgs e = new ServerEventArgs(cs.Id, ServerEventArgs.typeEvent.DECONNEXION, null);
                        serverSocketReceiveEvent(this, e);
                        MySocket.addFreeId(cs.Id, getBiggestId());
                        Thread thisThread = clients[cs];
                        clients.Remove(cs);
                        thisThread.Abort();
                    }
                    break;
                }
            }
        }
コード例 #5
0
 /// <summary>
 /// Intercepter un évenement, puis créer un ServerToolsEvent correspondant à son type. 
 /// </summary>
 private void HandleServerEvent(object sender, ServerEventArgs e)
 {
     ServerToolsEvent sta = null;
     switch (e.Type) {
         case ServerEventArgs.typeEvent.CONNEXION:
             sta = new ServerToolsEvent(e.Id, ServerToolsEvent.typeEvent.CONNEXION, null, null, null, -1);
             break;
         case ServerEventArgs.typeEvent.DECONNEXION:
             sta = new ServerToolsEvent(e.Id, ServerToolsEvent.typeEvent.DECONNEXION, null, null, null, -1);
             break;
         case ServerEventArgs.typeEvent.MESSAGE:
             Message msg = MessageUtil.decoder(e.Msg);
             sta = new ServerToolsEvent(e.Id, ServerToolsEvent.typeEvent.MESSAGE, msg.Operation, msg.ListParams, msg.Source, int.Parse(msg.Stamp));
             break;
     }
     serverToolsReceiveEvent(this, sta);
 }
コード例 #6
0
        /// <summary>
        /// Méthode du processus léger écoutant les messages des clients. Le processus léger est bloquant sur le receive, et implique que la taille du message soit contenue dans les quatre premiers octets de celui-ci.
        /// Un event est levé à chaque réception de message.
        /// </summary>
        private void receiveClientMsg(Object o)
        {
            MySocket cs = (MySocket)o;
            while (true) {
                try {
                    //Les quatre premiers octets contiennent la taille du message:
                    byte[] count = new byte[4];
                    cs.Socket.Receive(count, SocketFlags.None);
                    //La taille du message est maintenant connue:
                    byte[] msg = new byte[BitConverter.ToInt32(count, 0)];
                    cs.Socket.Receive(msg, msg.Length, SocketFlags.None);
                    //Création et levée de l'évènement:
                    ServerEventArgs e = new ServerEventArgs(cs.Id, ServerEventArgs.typeEvent.MESSAGE, msg);
                    serverSocketReceiveEvent(this, e);

                }
                catch {
                    if (cs.Socket != null) {
                        //Erreur durant la réception du message, le client est déconnecté:
                        cs.Socket.Close();
                    }
                    if (serverSocketReceiveEvent != null) {
                        ServerEventArgs e = new ServerEventArgs(cs.Id, ServerEventArgs.typeEvent.DECONNEXION, null);
                        serverSocketReceiveEvent(this, e);
                        MySocket.addFreeId(cs.Id, getBiggestId());
                        Thread thisThread = clients[cs];
                        clients.Remove(cs);
                        thisThread.Abort();
                    }
                    break;
                }

            }
        }
コード例 #7
0
        /// <summary>
        /// Méthode du processus léger écoutant les connexions des clients. A chaque nouveau client est associé un processus léger ainsi qu'une socket.
        /// </summary>
        private void listenConnect()
        {
            Socket clientSocket = null;
            MySocket clientMySocket = null;
            while (true) {
                try {
                    clientSocket = listener.AcceptSocket();
                    clientMySocket = new MySocket(clientSocket);
                    //Un client se connecte, démarrage un processus léger:
                    Thread clientThread = new Thread(receiveClientMsg);
                    clientThread.Start(clientMySocket);

                    //Ajout du client dans la table de hachage:
                    clients.Add(clientMySocket, clientThread);
                    //Création et levée de l'évènement:
                    ServerEventArgs e = new ServerEventArgs(clientMySocket.Id, ServerEventArgs.typeEvent.CONNEXION, null);
                    serverSocketReceiveEvent(this, e);
                }
                catch {
                    break;
                }
            }
        }
コード例 #8
0
 public bool Send(int id, byte[] msg)
 {
     try {
         foreach (MySocket ms in clients.Keys) {
             if (ms.Id == id) {
                 ms.Socket.Send(msg, SocketFlags.None);
                 return true;
             }
         }
         return false;
     }
     catch {
         ServerEventArgs e = new ServerEventArgs(id, ServerEventArgs.typeEvent.DECONNEXION, null);
         serverSocketReceiveEvent(this, e);
         MySocket.addFreeId(id, getBiggestId());
         return false;
     }
 }
コード例 #9
0
 private void HandleServerEvent(object sender, ServerEventArgs e)
 {
     ServerToolsEvent sta = null;
     switch (e.Type) {
         case ServerEventArgs.typeEvent.CONNEXION:
             sta = new ServerToolsEvent(e.Id, ServerToolsEvent.typeEvent.CONNEXION, null, null);
             break;
         case ServerEventArgs.typeEvent.DECONNEXION:
             sta = new ServerToolsEvent(e.Id, ServerToolsEvent.typeEvent.DECONNEXION, null, null);
             break;
         case ServerEventArgs.typeEvent.MESSAGE:
             //Décoder opération demandée
             sta = new ServerToolsEvent(e.Id, ServerToolsEvent.typeEvent.MESSAGE, "operation", new List<byte[]>() { new byte[] { } });
             break;
     }
     serverToolsReceiveEvent(this, sta);
 }