Choix des lecteurs
Articles populaires
Certains lecteurs, en regardant le titre de la section, peuvent s'indigner et demander : « Quel est le lien entre X-Coding et un simple chat ? En principe, il n'y a aucun lien. Chat est un programme simple qui fonctionne avec le réseau. Je sais qu’on ne peut pas tout mettre sous le même pinceau, et si un utilitaire utilise le réseau, cela ne veut pas dire qu’il s’agit d’un hacker. Mais quand même, je vais décrire ici la création du chat, car nous allons le construire sur un protocole fondamentalement différent de celui habituel. Dans tous les cas, cette connaissance ne sera pas superflue.
Mais nous parlerons de chat un peu plus tard, mais maintenant un peu de théorie.
Il existe actuellement deux protocoles principaux : TCP et UDP. Auparavant, IPX était encore très courant et était utilisé par Novell. Mais pour le moment, il s'éloigne et on voit rarement un tel animal. Ce n'est que sur les systèmes plus anciens que vous pouvez voir IPX. La plupart des autres protocoles que vous connaissez (FTP, HTTP, POP3, SMTP, etc.) s'exécutent sur TCP ou UDP.
Qu'est-ce que cela signifie : « au-dessus d'un autre protocole » ? TCP implémente les fonctions de base pour travailler avec un réseau. Il peut établir une connexion avec un ordinateur distant, transmettre et recevoir des données et vérifier si le serveur a reçu correctement les paquets envoyés. Disons que nous voulons créer un protocole de transfert de fichiers (FTP). Pour ce faire, nous prenons TCP, le dotons des capacités dont nous avons besoin et - l'obtenons - le signons. Il s'avère donc que FTP fonctionne via (en plus) le protocole TCP. Si nous voulons créer FTP à partir de zéro, nous devrons réimplémenter les fonctions de configuration de la connexion et de transfert de données. Il vous suffit donc de préparer les données dans un format spécial (protocole FTP) et de les transmettre au protocole TCP, qui établira lui-même une connexion et enverra ces données là où elles sont nécessaires.
Si vous connaissez Delphi et avez au moins une petite compréhension de la théorie de la POO, vous avez déjà remarqué l'analogie avec la programmation orientée objet. C’est exactement le principe sur lequel fonctionne le réseau. Tout cela est standardisé, et si vous voulez en savoir plus, lisez une documentation sur le modèle OSI (Open Systems Interconnection) et ses sept niveaux (ici je peux la renvoyer sur mon site web ou voir la section 4.1 de ce livre). Ce sujet est assez intéressant, et dans tous les cas il convient de connaître la structure des protocoles.
Le protocole UDP est très similaire à TCP. Il implémente également des capacités de transfert de données, mais il n'établit pas de connexions et ne maintient pas l'intégrité des données transmises. Le protocole ouvre simplement un port, y dépose une partie des données et ne se soucie même pas de savoir si elles parviendront ou non au destinataire. Par conséquent, UDP est beaucoup plus rapide que TCP.
Si vous souhaitez travailler avec ce protocole, vous devrez procéder vous-même à la vérification de l'exactitude de la réception des données. Par conséquent, pour transférer des fichiers ou d'autres informations volumineuses, vous devez choisir TCP, car si même un petit morceau du fichier est perdu, il ne sera pas récupéré. Eh bien, pour le chat que nous allons écrire aujourd'hui, UDP sera une option plus pratique. C’est très rapide et très efficace pour les messages de petite taille.
Dans Delphi, la bibliothèque est bien adaptée pour travailler avec
Je pense qu'elle deviendra bientôt ta meilleure amie.
La théorie est terminée, passons à la rédaction du chat. Étirez vos doigts, votre souris, votre clavier et lancez Delphi. Nous allons maintenant commencer mon activité préférée : la programmation. Nous aurons besoin de 3 composants sur le formulaire.
□ Composant Tmeto. Il peut être étiré sur presque toute la forme.
□ Le composant TEdit dans lequel on va écrire le message à envoyer.
□ TBouton, lorsque vous appuyez dessus, le message sera envoyé. En figue. La figure 4.21 montre la forme du futur chat.
Pour travailler avec les ports, nous avons besoin des composants idUDPClient (peut envoyer des données, Fig. 4.22) de l'onglet Indy Clients et idUDPServer (peut recevoir des données, Fig. 4.23) de l'onglet Mes serveurs. Transférez un de ces composants dans le formulaire.
Figure 4.22. Propriétés du composant idUDPCiient
Riz. 4.23. Propriétés du composant idUDPServer
Nous devons maintenant configurer le protocole et O R. La première chose que nous ferons est de sélectionner n'importe quel port de 1 à 65 000 via lequel la communication aura lieu. J'ai décidé de choisir 11245 (vous pouvez en choisir un autre). Attribuez cette valeur à la propriété Port du composant client idUDpc et à la propriété De default Port du composant idUDPServer. Cela forcera le client et le serveur à s'exécuter sur le même port, ce qui est nécessaire au bon fonctionnement de la communication.
SOUVIENS-TOI!!! Les ports du protocole UDP ne chevauchent pas les ports TCP. Cela signifie que le port TCP 80 n'est pas égal au port UDP 80.
Le client (idüDPCilent) doit maintenant spécifier la propriété Host. L'adresse IP de l'ordinateur auquel les messages seront envoyés est enregistrée ici. Mais notre chat et nos messages devraient être reçus par tous les utilisateurs du réseau qui ont lancé le programme. Par conséquent, pour éviter les problèmes, il est conseillé de définir BroadcastEnabled sur true pour les deux composants. R Au lieu d'une adresse IP spécifique, utilisez une adresse de diffusion (une adresse que tout le monde reçoit). Si vous utilisez des adresses telles que 192,168,100.x dans votre réseau, alors votre adresse de diffusion sera 192.168.100.255 (nous changeons le dernier octet en 255).
Les préparatifs sont terminés, vous pouvez programmer.
Créez un gestionnaire d'événements de bouton et écrivez-y le code suivant :
Procédure TForml.ButtonlClick(Expéditeur : TObject); commencer IdUDPClientl.Send(Editl.Text); fin;
Il n'y a qu'une seule ligne qui envoie le contenu de la ligne d'entrée (composant) à l'aide d'un client UDP
Nous devons maintenant apprendre au serveur UDP à recevoir ces informations. Pour ce faire, créez un gestionnaire d'événements OnUDPRead POUR le composant idUDPServer. Écrivez-y ce qui suit :
Procédure TForml. IdODPServerlüDPRead (Expéditeur : TObject ; ÄEata : TStream ; ABrnding : TIdSocketHandle);
var StringFormatedStream : TStringStream ; s:Chaîne ; commencer //Initialisation
StringFormatedStream : = TStringStream.Create(""); //Copie d'un simple flux vers une chaîne StringFormatedStream.CopyFrom(AData, AData.Size);
// Afficher le message reçu
Memol.Lines.Add(ABinding.PeerIP+" "+StringFormatedStream.DataString);
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s , Longueur(s)); // Libération du flux de chaînes StringFormatedStream.Free; fin;
La procédure du gestionnaire d'événements a trois paramètres. Le premier est présent dans tous les handlers et ne contient rien d’intéressant pour nous. La seconde concerne les données reçues du réseau. Troisièmement, il stocke des informations sur la provenance des données.
Ainsi, les données reçues sont stockées dans le deuxième paramètre. Ils nous parviennent sous la forme d’un simple TStream non formaté. Pour faciliter le travail avec les données, il est préférable de les transférer vers un flux de chaînes. Pensez-vous que cela soit gênant ? Que se passe-t-il si vous transmettez non pas du texte, mais une image et que le composant la formate en texte ? Désormais, ce ne sera plus un inconvénient, mais une véritable déception !
Voyez avec quelle facilité tout se transforme en texte. Le gestionnaire déclare une variable StringFormatedStream de type TStringStream (flux de chaînes). La première ligne de code l'initialise. La deuxième ligne copie les données d'un simple flux brut vers un flux de chaînes. Tous!!! Le texte transmis se trouve désormais dans la propriété Datastring de StringFormatedStream. APRÈS CELA, n'hésitez pas à SORTIR ce résultat dans le composant Mémo.
Figure 4.24. Chat en action
Mais nous écrivons un chat, et il serait souhaitable d'afficher des informations sur qui a envoyé ce texte. Par exemple, l'adresse IP de l'expéditeur des données est affichée, qui se trouve dans la propriété repe du troisième paramètre ABinding. Mais ce n'est qu'un exemple, et dans un vrai programme, cela aura l'air moche. De quoi parle M. 192.168.100.x ? Ou peut-être que c’est même la dame qui parle. Par conséquent, vous pouvez ajouter le nom de l’expéditeur directement au texte d’envoi. Le code changera comme suit :
IdUDPClisntl. Send("Mettez le nom de l'expéditeur ici" Editl.Text); Vous pouvez autoriser l'utilisateur à saisir un nom dans une ligne de saisie Edit2 distincte. Dans ce cas, le code sera comme ceci ; IdUDPClisntl.Send(Edit2.Text+" "+Editl.Text);
Sur le CD dans le répertoire \Examples\Chapter 4\Chat vous pouvez voir un exemple de ce programme.
nouveau joueur 4 juillet 2012 à 18h26Bonjour, Habrauser. Je vais être honnête, j'adore le langage Delphi et je pense qu'il a été oublié de manière injustifiée. Et dans ce sujet, j'aimerais partager avec vous mon expérience d'écriture d'un chat. Ce n’est pas une affaire très compliquée, mais très, très drôle.
Introduction.
Pour écrire ce chat, j'ai utilisé l'assembly IDE Borland Delphi 7 Lite. Toutes les bibliothèques nécessaires étaient déjà incluses.
En fait, cette partie est la plus simple. Tout d’abord, nous devons réfléchir au fonctionnement de notre chat. J'ai décidé de sélectionner manuellement le port, l'adresse du serveur et le surnom. En principe, vous pouvez choisir vous-même le port et le spécifier dans le code source, mais de cette façon, nous pouvons exécuter autant de copies du programme que nous le souhaitons en mode serveur jusqu'à ce que nous manquions de ports. Nous créons donc quatre champs de saisie, un élément de type Mémo et trois boutons. N'oubliez pas d'ajouter deux sockets, serveur et client. Nous écrivons du texte sur les boutons. Nom du programme, icône. Etc. Ceci conclut la première partie.
En principe, il n'y a pas beaucoup de travail ici, mais c'est très important. Tout d’abord, nous écrivons le code des boutons. Il est situé en dessous.
procédure TForm1. Button1Click (Expéditeur : TObject );
commencer
bouton2. Activé : = faux ; // Désactive le bouton du serveur
Prise de courant. adresse := modifier1. Texte ;
Prise de courant. Port : = StrtoInt(edit2.Text); // Notez le port et l'IP
Prise de courant. Actif : = vrai ; //Activer le socket
Prise de courant. Ouvrir ; // Ouvre-le
bouton3. activé := vrai ; //Déverrouillez le bouton d'envoi
fin ;
Et c'est à peu près la même chose pour tous les autres boutons.
Vous n'avez besoin de rien pour les champs de saisie.
Séparément, je souhaite envisager d'écrire le code du bouton d'envoi de message car c'est très important.
procédure TForm1. Button3Click (Expéditeur : TObject );
var f : entier ; aujourd'hui : TdateTime ;
commencer
aujourd'hui : = maintenant ; //Découvrez l'heure
s1:=modifier4. Texte ; //Former une ligne avec le pseudo et l'heure d'envoi
s2:=modifier3. Texte ;
s3: = "[" + s2+ "] (" + TimetoStr(aujourd'hui) + ") :" + s1; //Coller le tout ensemble
ifclsocket. actif = vrai alors
ClSocket. Prise. EnvoyerTexte(s3) //Envoie une chaîne au serveur
autre
commencer
pour f : = 0 à SrSocket. Prise. ActiveConnections - 1 faire //Envoyer au nom du serveur à tous les clients
commencer
Prise S. Prise. Connexions[f]. EnvoyerTexte(s3);
fin ;
Mémo1. lignes. ajouter(s3); // Notez vous-même la date du chat
fin ;
modifier4. texte : = "" ;
fin ;
Et enfin, on écrit le code de connexion/déconnexion/réception. Ici, il est important de ne pas oublier de lier les événements aux procédures.
procédure TForm1. SrsocketClientRead (Expéditeur : TObject ;
var i : entier ;
commencer
Reçu : = Prise. RecevoirTexte(); //Transférer le texte reçu vers une variable
pour i : = 0 à SrSocket. Prise. ActiveConnections - 1 faire //Envoyer les informations reçues à tous les clients connectés
Prise S. Prise. Connexions[i]. EnvoyerTexte (Reçu);
mémo1. Lignes. ajouter (Reçu) ; //Écrivez-le pour nous-mêmes
fin ;procédure TForm1. SrSocketClientDisconnect (Expéditeur : TObject ;
Socket : TCustomWinSocket );
commencer
Mémo1. Lignes. Ajouter ( "Le client s'est déconnecté") ; //Il suffit d'avertir le serveur
fin ;procédure TForm1. SrSocketClientConnect (Expéditeur : TObject ; Socket : TCustomWinSocket) ;
commencer
Mémo1. Lignes. Ajouter ( "Le client s'est connecté") ;
fin ;
Cette partie est la plus courte. Dans les paramètres du projet, ajoutez un nom, une version, construisez et dessinez une icône.
De plus, après quelques recherches sur Internet, j'ai trouvé ce code pour spécifier l'adresse IP et je l'ai inclus dans mon chat.
fonction GetLocalIP : Chaîne ;
const WSVer = 101 $ ;
var
wsaData : TWSAData ;
P:PHostEnt;
Buf : tableau [ 0.. 127] de Char ;
commencer
Résultat : = "" ;
si WSAStartup(WSVer, wsaData) = 0 alors commencez //Je ne veux rien commenter ici, parce que... Je ne sais pas vraiment comment ça marche
si GetHostName (@ Buf, 128) = 0 alors commencez
P : = GetHostByName (@Buf) ;
si p<>nul alors
Résultat : = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
fin ;
WSANettoyage ;
fin ;
fin ;
En fait, c'est toute la discussion. Comme vous pouvez le constater, l’écrire est très simple. Et je vous suis juste reconnaissant d’avoir respecté ce post.
Passe une bonne journée!
Mots-clés : Delphi, programmation
Bonjour, Habrauser. Je vais être honnête, j'adore le langage Delphi et je pense qu'il a été oublié de manière injustifiée. Et dans ce sujet, j'aimerais partager avec vous mon expérience d'écriture d'un chat. Ce n’est pas une affaire très compliquée, mais très, très drôle.
Introduction.
Pour écrire ce chat, j'ai utilisé l'assembly IDE Borland Delphi 7 Lite. Toutes les bibliothèques nécessaires étaient déjà incluses.
En fait, cette partie est la plus simple. Tout d’abord, nous devons réfléchir au fonctionnement de notre chat. J'ai décidé de sélectionner manuellement le port, l'adresse du serveur et le surnom. En principe, vous pouvez choisir vous-même le port et le spécifier dans le code source, mais de cette façon, nous pouvons exécuter autant de copies du programme que nous le souhaitons en mode serveur jusqu'à ce que nous manquions de ports. Nous créons donc quatre champs de saisie, un élément de type Mémo et trois boutons. N'oubliez pas d'ajouter deux sockets, serveur et client. Nous écrivons du texte sur les boutons. Nom du programme, icône. Etc. Ceci conclut la première partie.
En principe, il n'y a pas beaucoup de travail ici, mais c'est très important. Tout d’abord, nous écrivons le code des boutons. Il est situé en dessous.
procédure TForm1. Button1Click (Expéditeur : TObject );
commencer
bouton2. Activé : = faux ; // Désactive le bouton du serveur
Prise de courant. adresse := modifier1. Texte ;
Prise de courant. Port : = StrtoInt(edit2.Text); // Notez le port et l'IP
Prise de courant. Actif : = vrai ; //Activer le socket
Prise de courant. Ouvrir ; // Ouvre-le
bouton3. activé := vrai ; //Déverrouillez le bouton d'envoi
fin ;
Et c'est à peu près la même chose pour tous les autres boutons.
Vous n'avez besoin de rien pour les champs de saisie.
Séparément, je souhaite envisager d'écrire le code du bouton d'envoi de message car c'est très important.
procédure TForm1. Button3Click (Expéditeur : TObject );
var f : entier ; aujourd'hui : TdateTime ;
commencer
aujourd'hui : = maintenant ; //Découvrez l'heure
s1:=modifier4. Texte ; //Former une ligne avec le pseudo et l'heure d'envoi
s2:=modifier3. Texte ;
s3: = "[" + s2+ "] (" + TimetoStr(aujourd'hui) + ") :" + s1; //Coller le tout ensemble
ifclsocket. actif = vrai alors
ClSocket. Prise. EnvoyerTexte(s3) //Envoie une chaîne au serveur
autre
commencer
pour f : = 0 à SrSocket. Prise. ActiveConnections - 1 faire //Envoyer au nom du serveur à tous les clients
commencer
Prise S. Prise. Connexions[f]. EnvoyerTexte(s3);
fin ;
Mémo1. lignes. ajouter(s3); // Notez vous-même la date du chat
fin ;
modifier4. texte : = "" ;
fin ;
Et enfin, on écrit le code de connexion/déconnexion/réception. Ici, il est important de ne pas oublier de lier les événements aux procédures.
procédure TForm1. SrsocketClientRead (Expéditeur : TObject ;
var i : entier ;
commencer
Reçu : = Prise. RecevoirTexte(); //Transférer le texte reçu vers une variable
pour i : = 0 à SrSocket. Prise. ActiveConnections - 1 faire //Envoyer les informations reçues à tous les clients connectés
Prise S. Prise. Connexions[i]. EnvoyerTexte (Reçu);
mémo1. Lignes. ajouter (Reçu) ; //Écrivez-le pour nous-mêmes
fin ;procédure TForm1. SrSocketClientDisconnect (Expéditeur : TObject ;
Socket : TCustomWinSocket );
commencer
Mémo1. Lignes. Ajouter ( "Le client s'est déconnecté") ; //Il suffit d'avertir le serveur
fin ;procédure TForm1. SrSocketClientConnect (Expéditeur : TObject ; Socket : TCustomWinSocket) ;
commencer
Mémo1. Lignes. Ajouter ( "Le client s'est connecté") ;
fin ;
Cette partie est la plus courte. Dans les paramètres du projet, ajoutez un nom, une version, construisez et dessinez une icône.
De plus, après quelques recherches sur Internet, j'ai trouvé ce code pour spécifier l'adresse IP et je l'ai inclus dans mon chat.
fonction GetLocalIP : Chaîne ;
const WSVer = 101 $ ;
var
wsaData : TWSAData ;
P:PHostEnt;
Buf : tableau [ 0.. 127] de Char ;
commencer
Résultat : = "" ;
si WSAStartup(WSVer, wsaData) = 0 alors commencez //Je ne veux rien commenter ici, parce que... Je ne sais pas vraiment comment ça marche
si GetHostName (@ Buf, 128) = 0 alors commencez
P : = GetHostByName (@Buf) ;
si p<>nul alors
Résultat : = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
fin ;
WSANettoyage ;
fin ;
fin ;
En fait, c'est toute la discussion. Comme vous pouvez le constater, l’écrire est très simple. Et je vous suis juste reconnaissant d’avoir respecté ce post.
Passe une bonne journée!
Mots-clés : Delphi, programmation
Je pense que l'idée de créer votre propre chat (d'entreprise) vous est venue plus d'une fois. La même idée m’est venue et, comme toujours, j’ai commencé à chercher des informations sur Internet, mais je n’ai rien trouvé de bon. D'une manière ou d'une autre, tout ne décrit pas complètement comment cela peut être fait.
Et je me suis promis que dès que je l'étudierai, je publierai des informations complètes sur ce sujet. J'ai fait ma conversation sur des sockets. Vous pouvez communiquer en les utilisant à la fois sur Internet et sur un réseau local. Pour ce faire, il vous suffit de connaître l'adresse IP. Programmé en Delphi7.
Depuis que je l'ai fait sur Delphi7, les composants dont j'avais besoin n'étaient pas là par défaut. ( ServeurSocket1, ClientSocket1).
Pour ce faire, vous devez ajouter des composants Socket.
Allez dans le menu Composant --> Installer les packages...--> Ajouter --> dclsockets70.bpl
Et nous indiquons le chemin d'accès au package avec les composants, il se trouve dans le dossier racine Delphi du package Bin. Je l'avais dans :
C:\Program Files\Borland\Delphi7\Bin\ dclsockets70.bpl
Après cet ajout, ces composants devraient apparaître dans votre onglet Internet.
J'ai ajouté les éléments suivants au formulaire : ServerSocket1, ClientSocket1, Edit1 (pour le chat), Edit2 (pour l'adresse IP du serveur), Memo1 pour afficher un message et 3 boutons.
Pour créer un serveur, écrivez la chose suivante dans l'événement dans le bouton :
fonction ObtenirLocalIP : Chaîne;procédure TForm1.Button3Click(Expéditeur : TObject);
commencer
ServerSocket1.Port :=65 000 ; // Port de votre serveur, définissez celui de votre choix
ServerSocket1.Active :=True ; // active le serveur
ServerSocket1.Open; //commencer
ShowMessage("Votre IP : "+GetLocalIP); //nous donnons notre adresse IP pour que le client puisse se connecter à nous
fin;
Une fois le serveur allumé, le client pourra se connecter au serveur.
Pour cela, il saisit l'adresse IP du serveur dans Edit2, et appuie sur le bouton de connexion :
Attention: Le Client peut uniquement envoyer un message, et le Serveur, à son tour, peut en recevoir. Pour une communication bidirectionnelle, activez Client et Serveur sur deux programmes à différentes extrémités du réseau.
Pour lire un message, le serveur attend que le message soit reçu... le voici
procédure TForm1.ServerSocket1ClientRead(Expéditeur : TObject ;Pour envoyer le message, j’ai écrit en deux procédures. Les voici:
si form1.ClientSocket1.Active alors
form1.ClientSocket1.Socket.SendText(Texte);
fin;
procédure TForm1.Button1Click(Expéditeur : TObject);
commencer
SendMes(Edit1.Text);
memo1.Lines.add(GetLocalIP+": ");
memo1.Lines.add(Edit1.Text);
fin;
Articles Liés: | |
Création d'un disque de démarrage Partition Magic Le programme Parted Magic n'est pas bootable
Parted Magic est un programme pour les systèmes d'exploitation UNIX développé... Les meilleurs programmes pour créer une image disque ISO
Utiliser des programmes spéciaux. Créer une image virtuelle est très... Réinitialisation du MacBook aux paramètres d'usine : options et instructions
L'arrêt ou le redémarrage de votre Apple iMac réinitialise le contenu de la mémoire... |