Пример #1
0
        /**
         * <summary>Se connecte à un serveur</summary>
         * <param name="serveur">Informations du serveur auquel se connecter</param>
         */
        public async Task <bool> ConnectAsync(IPEndPoint serveur)
        {
            try
            {
                await _client.ConnectAsync(serveur.Address, serveur.Port);

                _flux = _client.GetStream();
                Catcher.LogInfo($@"Connecté au serveur TCP {serveur.Address}:{serveur.Port}");

                return(true);
            }
            catch (Exception e)
            {
                Catcher.LogError($@"Impossible de se connecter au serveur TCP {e.Message}");

                return(false);
            }
        }
Пример #2
0
        /**
         * <summary>Lance l'écoute sur le serveur</summary>
         * <returns>Les données wrappées dans le model T demandé, null si une erreur</returns>
         */
        protected async Task <T> ReceiveAsync <T>(NetworkStream flux) where T : class, IModelReseau
        {
            T data = null;

            try
            {
                await Task.Run(() =>
                {
                    Catcher.LogInfo("En attente d'un message...");

                    byte[] buffer = new byte[1024];
                    using (MemoryStream ms = new MemoryStream())
                    {
                        int numBytesRead = flux.Read(buffer, 0, buffer.Length);
                        while (flux.DataAvailable || numBytesRead > 0)
                        {
                            if (numBytesRead == 0)
                            {
                                numBytesRead = flux.Read(buffer, 0, buffer.Length);
                            }

                            Catcher.LogInfo($"Réception de {numBytesRead} bytes");

                            ms.Write(buffer, 0, numBytesRead);
                            numBytesRead = 0;
                        }

                        data = Serialise.MemoryStreamToObject <T>(ms);                        // converti les octets en un model demandé

                        Catcher.LogInfo($"Message de longueur {ms.ToArray().Length} reçu");
                    }
                });
            }
            catch (Exception e)
            {
                Catcher.LogError(@"Impossible de recevoir un message TCP : " + e.Message);
            }

            return(data);
        }
Пример #3
0
        /**
         * <summary>Envoie un model au client</summary>
         * <param name="data">Model qui implémente <see cref="IModelReseau"/> à envoyer</param>
         * <param name="flux">Flux <see cref="NetworkStream"/> à envoyer</param>
         * <returns>true si tout s'est bien passé, false sinon</returns>
         */
        protected virtual async Task <bool> SendAsync(IModelReseau data, NetworkStream flux)
        {
            try
            {
                await Task.Run(() =>
                {
                    BinaryWriter binaryWriter = new BinaryWriter(flux);                     // converti le flux en binaire

                    byte[] byteData = Serialise.ObjectToByteArray(data);

                    binaryWriter.Write(byteData);                     // envoie le model sous forme de bytes[]

                    Catcher.LogInfo($"Message de longueur {byteData.Length} envoyé");
                });

                return(true);
            }

            catch (Exception e)
            {
                Catcher.LogError(@"Impossible d'envoyer un message TCP : " + e.Message);
                return(false);
            }
        }
Пример #4
0
        /**
         * <summary>Démarre le serveur</summary>
         * <param name="config">Configuration du serveur dans un <see cref="IPEndPoint"/></param>
         * <returns>true si la connexion a pu s'effectuer, false sinon</returns>
         */
        public async Task <bool> ListenAsync(IPEndPoint config)
        {
            _serveur = new TcpListener(config);

            try
            {
                await Task.Run(() =>
                {
                    _serveur.Start();
                    _client = _serveur.AcceptTcpClient();                     // accepte une connexion client
                    _flux   = _client.GetStream();
                });

                Catcher.LogInfo("Serveur TCP démarré");

                return(true);
            }
            catch (Exception e)
            {
                Catcher.LogError(@"Impossible de démarrer le serveur TCP " + e.Message);

                return(false);
            }
        }