1. Delphes et Socket
Le réseau informatique est composé d'une série de protocoles de communication réseau, dont les protocoles principaux sont les protocoles TCP/ip et UDP au niveau de la couche transport. TCP est orienté connexion et les deux parties communicantes conservent un chemin, tout comme la ligne téléphonique actuelle. Si vous utilisez telnet pour vous connecter au BBS, le protocole TCP est utilisé sans connexion et les parties communicantes ne se maintiennent pas chacune. le statut de l'autre. Il est utilisé lorsque le navigateur accède à Internet. Le protocole HTTP est basé sur le protocole UDP. Les protocoles TCP et UDP sont très complexes, en particulier le protocole TCP. Afin de garantir l'exactitude et l'efficacité de la transmission réseau, une série de processus complexes de correction et de tri des erreurs doivent être effectués.
Socket est une spécification de socket basée sur les protocoles de couche de transport (principalement TCP et UDP). Elle a été initialement proposée par l'Université de Californie à Berkeley. Elle définit une spécification pour la communication entre deux ordinateurs (également une spécification de programmation si deux ordinateurs communiquent en utilisant). un "canal", alors les deux extrémités de ce "canal" sont deux prises. Les sockets protègent les différences entre les logiciels de communication sous-jacents et les systèmes d'exploitation spécifiques, rendant ainsi la communication possible entre deux ordinateurs ayant installé le logiciel de protocole TCP et implémenté la spécification du socket.
La spécification Windows Socket de Microsoft (winsock en abrégé) étend la spécification socket de Berkeley. En utilisant les méthodes Socket standard, vous pouvez communiquer avec Sockets sur n'importe quelle plate-forme ; en utilisant ses extensions, vous pouvez l'implémenter plus efficacement sur les plates-formes Windows. Dans Delphi, le Socket sous-jacent doit également être le Socket Windows. Socket réduit la difficulté d'écrire des logiciels de communication entre ordinateurs, mais en général, cela reste assez compliqué (cela sera discuté en détail plus tard) ; InPRise encapsule efficacement Windows Socket dans Delphi, permettant aux utilisateurs d'écrire facilement des programmes de communication réseau. Ci-dessous, nous expliquons avec des exemples comment utiliser Socket pour écrire des programmes de communication dans Delphi.
2. Utilisez Delphi pour écrire le programme de communication Socket.
Ce qui suit est un simple programme de communication Socket, dans lequel le client et le serveur sont le même programme. Lorsque le client (serveur) saisit un morceau de texte dans memo1 et appuie sur Entrée, le texte peut être affiché sur le serveur (client) dans. memo2, l’inverse est également vrai. Les étapes spécifiques sont les suivantes :
1. Créez un nouveau formulaire et nommez-le arbitrairement. Vous pouvez aussi bien le définir comme chatForm ; placer un MainMenu (dans la colonne Standard) et créer les éléments de menu ListenItem, ConnectItem, Disconnect et Exit ; ajoutez-les au chatForm , où le nom de TClientSocket est défini sur ClientSocket, Définissez le port sur 1025, l'actif par défaut est faux ; définissez le nom de TServerSocket sur ServerSocket, définissez le port sur 1025, l'actif par défaut est faux, et laissez les autres inchangés, puis insérez deux mémos, l'un nommé memo1 et le autre ; other Pour memo2, la couleur de memo2 est définie sur gris car elle est principalement utilisée pour afficher les entrées de l'autre partie. Ci-dessous, nous expliquons la raison lors de l'écriture du code.
2. Double-cliquez sur ListemItem. Écrivez le code suivant :
procédure TChatForm.ListenItemClick(Expéditeur : TObject);
commencer
ListenItem.Checked := pas ListenItem.Checked;
si ListenItem.Checked alors
commencer
ClientSocket.Active := Faux ;
ServerSocket.Active := Vrai ;
fin
autre
commencer
si ServerSocket.Active alors
ServerSocket.Active := Faux ;
fin;
fin;
La description de ce segment de programme est la suivante : Lorsque l'utilisateur sélectionne le ListemItem, le ListenItem est inversé. S'il est sélectionné, cela signifie qu'il est dans l'état Listen. Ce que les lecteurs doivent comprendre est : écouter est une méthode propriétaire lorsque Socket sert. en tant que serveur. S'il est en écoute, alors ServerSocket est défini sur l'état actif ; sinon, l'écoute est annulée et ServerSocket est fermé. En fait, seul l'utilisateur sélectionne initialement cet élément de menu, indiquant que le programme agit en tant que serveur. Au contraire, si l'utilisateur sélectionne ConnectItem, il doit être utilisé comme Client.
3. Double-cliquez sur ConnectItem et entrez le code suivant.
procédure TChatForm.ConnectItemClick(Expéditeur : TObject);
commencer
si ClientSocket.Active alors ClientSocket.Active := False ;
if InputQuery('Ordinateur auquel se connecter', 'Nom de l'adresse :', Serveur) alors
si Longueur (Serveur) > 0 alors
avec ClientSocket faire
commencer
Hôte := Serveur ;
Actif := Vrai ;
ListenItem.Checked := False;
fin;
fin;
La fonction principale de ce programme est de définir l'application en tant que client lorsque l'utilisateur sélectionne l'élément de menu ConnectItem, et une zone de saisie apparaît pour permettre à l'utilisateur de saisir l'adresse du serveur. C'est pourquoi nous ne corrigeons pas l'hôte ClientSocket au début, afin que les utilisateurs puissent se connecter dynamiquement à différents serveurs. Ce que les lecteurs doivent comprendre, c'est que l'adresse de l'hôte n'est qu'un attribut que Socket possède lorsqu'il est client. Lorsque Socket est un serveur, il n'utilise "généralement" pas l'adresse car elle est liée à la machine locale.
4. Écrivez le code suivant dans la méthode keydown de memo1 :
procédure TChatForm.Memo1KeyDown(Expéditeur : TObject ; var Clé : Word ;
Maj : TShiftState);
commencer
si Clé = VK_Return alors
si IsServer alors
ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1])
autre
ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);
fin;
La fonction de ce code est évidente, c'est-à-dire qu'il commence à envoyer des messages. S'il s'agit d'un serveur, il envoie uniquement un message au premier client. Puisqu'un serveur peut se connecter à plusieurs clients et que chaque connexion avec le client est maintenue par un Socket, le tableau ServerSocket.Socket.Connections est stocké. qui maintient la connexion avec le Client. Dans le Socket standard, le Socket côté serveur obtient le Socket qui maintient la connexion avec le client via la valeur de retour de la méthode accept(), et les méthodes d'envoi et de réception de messages sont respectivement send(sendto) et recv(recvfrom). . Delphi a fait cette encapsulation.
5. Une brève introduction aux codes restants.
procédure TChatForm.ServerSocketAccept(Expéditeur : TObject ;
Socket : TCustomWinSocket );
commencer
IsServer := Vrai ;
fin;
La méthode Accept de ServerSocket est terminée lorsque le client se connecte pour la première fois. D'après ses paramètres, on peut considérer qu'elle est exécutée après la méthode accept standard. Parce qu'il existe le type de paramètre TCustomWinSocket, il doit s'agir de la valeur de retour du. Socket côté serveur standard.
procédure TChatForm.ClientSocketRead(Expéditeur : TObject ;
Socket : TCustomWinSocket );
commencer
Memo2.Lines.Add(Socket.ReceiveText);
fin;
procédure TChatForm.ServerSocketClientRead(Sender: TObject;
Socket : TCustomWinSocket );
commencer
Memo2.Lines.Add(Socket.ReceiveText);
fin;
Ces deux morceaux de code sont déclenchés par Delphi lorsque le côté serveur et le côté client reçoivent les messages de l'autre, et leur fonction est d'afficher les messages reçus dans memo2. Parmi eux, le Socket dans ClientSocketRead est en fait le Socket lui-même, et le Socket dans ServerSocketClientRead est en fait un Socket dans ServerSocket.Socket.Connection[]. Cependant, dans Delphi, le Socket côté serveur est effectivement encapsulé.
procédure TChatForm.ServerSocketClientConnect(Expéditeur : TObject ;
Socket : TCustomWinSocket );
commencer
Memo2.Lines.Clear;
fin;
procédure TChatForm.ClientSocketDisconnect(Expéditeur : TObject ;
Socket : TCustomWinSocket );
commencer
ListenItemClick(nil);
fin;
Ces deux paragraphes sont relativement simples. Parmi eux, ServerSocketClientConnect est déclenché lorsque ServerSocket reçoit une nouvelle connexion. ClientSocketDisconnect est déclenché lorsque ClientSocket émet Disconncet.
procédure TChatForm.Exit1Click(Expéditeur : TObject);
commencer
ServerSocket.Fermer ;
ClientSocket.Close ;
Fermer;
fin;
procédure TChatForm.Disconnect1Click(Expéditeur : TObject);
commencer
ClientSocket.Active := Faux ;
ServerSocket.Active := Vrai ;
fin;
Le premier paragraphe consiste à fermer l’application. Dans Socket standard, lorsque chaque Socket est fermé, la méthode closesocket() doit être appelée, sinon le système ne libérera pas de ressources. Dans ServerSockt.Close et ClientSocket.Close, la méthode closesocket() doit être appelée en interne dans le système.
3. Prise standard et prise dans Delphi.
Le cadre d'application Socket standard est le suivant :
Côté serveur : Socket()[Créer un nouveau Socket]--Bind()[Lier avec l'adresse du serveur]--Listen()--Accept()--block wait--read()[Accepter les messages, dans les fenêtres plate-forme, la méthode est send(TCP) ou sendto(UDP)]--process service request--Write()[envoyer un message, sur la plate-forme Windows, la méthode est send(TCP), Ou envoyer vers (UDP).
Le côté client est relativement simple : Socket()--Connect() [Se connecter à un serveur spécifique via un certain port, qui doit établir une connexion avec le serveur]--Write()--Read().
Socket peut être basé sur TCP ou UDP, et Socket est même construit sur d'autres protocoles, tels que IPX/SPX, DECNet, etc. Lors de la création d'un nouveau Socket, vous pouvez spécifier le type de Socket à créer. Bind() est utilisé pour se lier à l'adresse du serveur. Si un hôte n'a qu'une seule adresse IP, le rôle de liaison est en fait relativement redondant. Listen() commence à surveiller le réseau, Accept() est utilisé pour accepter la connexion et sa valeur de retour est le Socket qui maintient le contact avec le client.
Dans Delphi, Socket dans Windows est effectivement encapsulé. En Delphi, selon leur lien d’héritage, ils peuvent être divisés en deux catégories :
1. TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TServerSocket
TComponent--TAbstractSocket--TCustomSocket--TClientSocket
2. Héritez directement de TObject :
TObject--TCustomWinSocket--TServerWinSocket
TObject--TCustomWinSocket--TClientWinSocket
TObject--TCustomWinSocket--TServerClientWinSocket
On peut voir que le premier type est basé sur TCustomSocket et le deuxième type est basé sur TCustomWinSocket. Le premier type est construit sur TComponet et le deuxième type est construit directement sur TObject. Par conséquent, si l'utilisateur connaît très bien Socket et souhaite écrire un programme console, il peut utiliser la classe TCustomWinScoket.
Comme le montrent les mêmes utilisations, ils sont tous implémentés dans ScktComp.pas, et schtComp.pas contient le fichier winsock.pas Si vous continuez à approfondir le fichier winsock, vous pouvez trouver toutes les méthodes de base de Windows Socket.
En fait, si vous comprenez le cadre d'application Socket standard, vous serez à l'aise avec Delphi pour écrire des applications Socket ; cela ne signifie pas que vous devez comprendre les fonctions standard d'un Socket complexe, et ce n'est pas nécessaire, car Delphi l'a déjà fait. pour vous. C'est bien encapsulé, ce qui est la force de Delphi. Il vous suffit de comprendre un peu le framework de base.
C'est ma compréhension des applications Socket dans Delphi. J'espère que vous pourrez me corriger si j'ai des lacunes. En même temps, je suis également heureux de répondre aux questions sur Socket dans Delphi.