Nous écrivons une discussion en Delphi. Faire une conversation primitive sur DELPHI. Installation des conditions préalables

Dans ce sujet, j'aimerais écrire en détail comment créer le chat ICQ le plus simple dans Delphi !

Ce dont nous avons besoin pour cela :
1.Delphi (7 est le meilleur)
2. Composant TICQ installé.
3. Bras tendus.

Commençons!
Nous créons donc un nouveau projet dans Delphi et lançons le composant TICQ sur le formulaire.
Nous lançons Memo1, EDit1,Edit2,button1,ListBox1,L istBox2 sur le formulaire.
Explication:
Memo1 - journal de discussion
Edit1 - UIN
Edit2 - mot de passe
bouton1 - connexion
ListBox1 - utilisateur en ligne
ListBox2 - utilisateur enregistré

Bouton 1 :

Procédure TForm1.Button1Click(Expéditeur : TObject); commencer ICQClient1.UIN:=StrToInt(Edit1.Text); ICQClient1.Password:=Edit2.Text; icqclient1.Login(); fin;

L'événement ICQClient1MessageRecv1 devrait ressembler à ceci :

Procédure TForm1.ICQClient1MessageRecv1 (Expéditeur : TObject ; Msg, UIN : String) ; commencer Memo1.Lines.Add(trim(nick(UIN))+": "+Msg); //log si Msg<>"!" alors //si le message commence par "!" ne lancez pas start if OnLine (UIN) dans le chat<>-1 puis //vérifier si l'utilisateur est dans le chat Send(Msg,UIN) //si dans le chat alors accepte les messages dans le chat sinon si Reged(UIN)=-1 alors//vérifier l'enregistrement icqclient1.SendMessage( StrToInt(UIN), "bienvenue sur le chat !" + #13#10 + "pour vous inscrire, entrez !reg<ваш ник>") sinon commencez icqclient1.SendMessage(StrToInt(UIN), "Pour accéder au chat, utilisez la commande !chat" + #13#10 + "Pour obtenir de l'aide, envoyez !help") //l'utilisateur n'est pas dans le chat ! fin ; end else Command( UIN,Msg); //commandes de chat ! end;

Fonction en ligne :

Fonction TForm1.OnLine(UIN:string):integer; var je:entier; commencer en ligne :=-1 ; pour i:=0 à ListBox1.Items.Count-1, faites if Trim(Copy(ListBox1.Items[i],4,9))=UIN then //UIN length OnLine:=i; fin;

Envoi de messages pour discuter :

Procédure TForm1.Send(Msg,UIN:string); var i2:entier; je:entier; Str,Str2:chaîne ; commencer Str2:=ListBox1.Items ; pour i:=0 à ListBox1.Items.Count-1, commencez si i2=5, puis commencez Sleep(2000) ; je2:=0; fin; si en ligne (UIN)<>je commence alors i2:=i2+1; Str:=ListBox1.Items[i]; si Trim(Copy(Str,1,2))=Trim(Copy(Str2,1,2)) alors icqclient1.SendMessage(StrToInt(Copy(ListBox1.Items[i],4,9)), pseudo(UIN) +": "+Msg); fin; fin; fin;

Fonction pseudo :

Fonction TForm1.nick(UIN:string):string; commencer si Reged (UIN)<>-1 puis pseudo:=TRIM(Copy(ListBox2.Items,13,50)) fin

Fonction enregistrée:

Fonction TForm1.Reged(UIN:string):integer; var je:entier; débutReged :=-1 ; pour i:=0 à ListBox2.Items.Count-1, faites if Copy(ListBox2.Items[i],4,9)=UIN then Reged:=i; fin;

Et enfin la procédure de Commande (commandes de chat) :

Procédure TForm1.Command(UIN,Msg:string); var i,i1,razdel:entier; commande, clé, clé2: chaîne ; Chaîne : chaîne ; aide : TStrings ; commencer la section d'essai :=0 ; pour i:=1 à Longueur(Msg) commencez help:= TStringList.Create; help.LoadFromFile("command/help.txt"); //Ouvre un fichier avec du texte if (Msg[i]=" ") et (razdel=0) then razdel:=i; fin; si diviser<>0 puis commencez command:=Copy(Msg,1,razdel-1); clé:=Copie(Msg,razdel+1,Longueur(Msg)); key2:=Copie(Msg,razdel+1,Longueur(Msg)); fin sinon début commande:=Msg; clé:=""; fin; if (command="!chat") ou (command = "!chat") alors commencez ListBox1.Items.Append(ListBox2.Items); icqclient1.SendMessage(StrToInt(UIN), "vous êtes connecté"); fin; if (command = "!help") ou (command = "!help") alors commencez if OnLine(UIN)<>-1 puis commencez icqclient1.SendMessage(StrToInt(UIN), help.Text); end else icqclient1.SendMessage(StrToInt(UIN), "Pour utiliser les commandes, entrez dans le chat !"); fin; //fin; if (command="!exit") ou (command = "!Exit") ou (command = "!EXIT") alors commencez ListBox1.Items.Delete(OnLine(UIN)); fin; if (command="!reg") ou (command="!nick") ou (command="!REG") et (key<>"") puis commencez si Reged (UIN)<>-1 puis icqclient1.SendMessage(StrToInt(UIN), "Vous êtes déjà inscrit dans le chat ! :)") sinon if (Length(Trim(key))>15) then icqclient1.SendMessage(StrToInt(UIN), "Pseudo trop long , Il doit contenir plus de 3 et moins de 15 caractères et ne doit pas contenir d'espaces") else if (Length(Trim(key))<3) then icqclient1.SendMessage(StrToInt(UIN), "Слишком короткий ник, Он должен быть длинной,больше 3 и менее 15 символов, не должен сожержать пробелов") else //if (Length(Trim(UIN))<9) then //icqclient1.SendMessage(StrToInt(UIN), "Ваш уин не подходит для регистрации!") //else begin ListBox2.Items.Append("0 "+UIN+" "+Trim(Key)); icqclient1.SendMessage(StrToInt(UIN), "Вы успешно зарегистрировались!Для входа в чат наберите!чат"); ListBox2.Items.SaveToFile("user/user.txt"); end; end; //end; except end; end;

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 à 18h26

Nous écrivons notre vélo à Delphi

  • Débarras *

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.

Partie I. Écriture de l'interface.

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.

Partie 2. Internalités.

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 ;

Partie 3. Tests finaux.

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.

Partie I. Écriture de l'interface.

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.

Partie 2. Internalités.

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 ;

Partie 3. Tests finaux.

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.

Installation des conditions préalables

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.

Placer des composants et écrire du code

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;
const WSVer = 101 $ ;
var
wsaData : TWSAData ;
P:PHostEnt;
Buf : tableau de Carboniser;
commencer
Résultat := "" ;
si WSAStartup (WSVer, wsaData) = 0 puis commence
si GetHostName (@Buf, 128) = 0 puis commence
P:= GetHostByName (@Buf);
si P.<> nul alors
Résultat := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
fin;
WSANettoyage ;
fin;
fin;

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 :

procédure TForm1.Button2Click(Expéditeur : TObject);
commencer
ClientSocket1.Address:=Edit2.Text; // Adresse IP du serveur
ClientSocket1.Port :=65 000 ; //son port
ClientSocket1.Active :=True ; //activer le client
ClientSocket1.Open; //commencer
fin;

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 ;
Socket : TCustomWinSocket );
commencer
memo1.Lines.add(Socket.RemoteAddress+": ");
memo1.Lines.add(Socket.ReceiveText);
StatusBar1.Panels.Items.Text:=Socket.RemoteAddress;
fin;

Pour envoyer le message, j’ai écrit en deux procédures. Les voici:

procédure TForm1.SendMes(Texte : Chaîne);
commencer
si form1.ServerSocket1.Active alors
si form1.ServerSocket1.Socket.ActiveConnections>0 alors
form1.ServerSocket1.Socket.Connections.SendText(Texte);

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;

gastrogourou 2017