Bonjour,
Je dois réaliser une application très simple.
Elle se connecte sur une machine sur un port précis. Ce port émet des messages texte en Tcp.
L'application qui écoute sur le port j'ai réussis à la faire grâce à ce tutoriel: http://skoffler.developpez.com/dotnet/tcpclient/ .
Je met le code que j'ai actuellement, à voir s'il y a des améliorations à produire ou non.
Les messages reçu font tous une taille de 214 bytes. Ils sont composés de chiffre et lettre.
Code : 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 static void Main(string[] args) { byte[] monReadBuffer = new byte[214]; TcpClient monClientTcp = new TcpClient("192.168.1.2", 3217); monClientTcp.NoDelay = true; NetworkStream monFlux = monClientTcp.GetStream(); int nbLus; while ((nbLus = monFlux.Read(monReadBuffer, 0/*offset*/, monReadBuffer.Length)) != 0) { //read peut déclencher exception String messageRecu = System.Text.Encoding.ASCII.GetString(monReadBuffer, 0, nbLus/*tout le buffer n'est pas utilisé*/); Console.WriteLine("Nb d'octet recus: {0}", nbLus); Console.WriteLine("message:#{0}#", messageRecu.ToString()); } monFlux.Close(); monClientTcp.Close(); Console.WriteLine("test"); Console.ReadLine(); }
Le but de cette application est de récupérer le message et l'insérer en base de donnée.
1/ J'ai fait quelques tests, j'ai augmenté la taille de mon buffer à 2000 bytes, et lorsque je reçois un message il me l'affiche directement et n'attend pas de lire les 2000 bytes, je ne comprends pas pourquoi? Je n'ai pas de contrôle sur la machine distante et ne sais pas trop comment les messages sont construit et envoyé. Est-ce qu'il y a dans le paquet tcp un champ qui indique le nombre de byte envoyé et donc ainsi la fonction Read s'arrête de lire dès qu'elle à lu tout le message? (Je n'ai pas trouvé cette information sur les pages que j'ai lu dans la Msdn)
2/ Comment être sûr de ne rater aucun message lorsque j'écoute les messages arrivant?
J'ai lu quelques documents notamment la msdn sur les classes TcpClient NetworkStream etc... Mais je ne vois pas comment m'assurer de bien récupérer tous les messages, j'ai vu que l'on peut utiliser TcpClient en mode Asynchrone (ou Socket dans le même mode) est-ce que cela peut m'apporter quelque chose?
3/ Dois-je utiliser les Threads un pour la réception des messages et un pour l'insertion dans la Bdd. Dans le sens où un message est reçu, j'appelle une fonction dans un Thread séparé en lui passer en paramètre le message.
Je vais avoir un peu de traitement à faire sur ce message il est composé de plusieurs champs donc un peu de découpage de String, je ne pense pas que ce soit très très long, et la fréquence des messages n'est pas très très élevé, si j'arrive à un message par seconde c'est déjà bien. (Les messages proviennent d'appel téléphonique entrant/sortant)
Donc est-ce utile de séparer l'insertion en base de données dans un Thread séparé.
4/ Comment m'assurer que lorsque je me connecte je ne sois pas au milieu de la réception d'un message, ou alors c'est impossible car quand je me connecte, l'ordinateur distant va commencer en m'envoyer les messages mais si il y avait un message en cour, il ne me sera pas envoyé à moitié mais je vais simplement le rater.
5/ Quand je me connecte avec mon application je vois tous les messages, il y a 3 retour à la ligne dans le message j'ai tenté de les supprimer avec
Pour bien voir si j'arrivais à les supprimer mais ca n'a pas fonctionné, est-ce que j'ai mal écris le Replace? Je ne comprends pas pourquoi ca ne passe pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 messageRecu.Replace("\n", "$$$$"); messageRecu.Replace("\r", "####");
6/ Dernière question:
Mon application devra tourner en permanence, est-ce mieux de créer un service windows par exemple pour être sûr que mon application continue de fonctionner en permanence ou bien un simple programme console que l'on lance au démarrage sur une machine?
![]()
Partager