1. Delphi und Socket
Das Computernetzwerk besteht aus einer Reihe von Netzwerkkommunikationsprotokollen, deren Kernprotokolle die Protokolle TCP/IP und UDP auf der Transportschicht sind. TCP ist verbindungsorientiert und beide kommunizierenden Parteien pflegen einen Pfad, genau wie die aktuelle Telefonleitung. Wenn Sie Telnet verwenden, um sich beim BBS anzumelden, wird das TCP-Protokoll verwendet, und die kommunizierenden Parteien pflegen nicht jeden Anderer Status Wird verwendet, wenn der Browser auf das Internet zugreift. Das HTTP-Protokoll basiert auf dem UDP-Protokoll. Sowohl das TCP- als auch das UDP-Protokoll sind sehr komplex, insbesondere das TCP-Protokoll. Um die Korrektheit und Effektivität der Netzwerkübertragung sicherzustellen, müssen eine Reihe komplexer Fehlerkorrektur- und Sortierprozesse durchgeführt werden.
Socket ist eine Socket-Spezifikation, die auf Transportschichtprotokollen basiert (hauptsächlich TCP und UDP). Sie definiert eine Spezifikation für die Kommunikation zwischen zwei Computern (auch eine Programmierspezifikation). ein „Kanal“, dann sind die beiden Enden dieses „Kanals“ zwei Buchsen. Sockets schirmen die Unterschiede zwischen der zugrunde liegenden Kommunikationssoftware und bestimmten Betriebssystemen ab und ermöglichen die Kommunikation zwischen zwei beliebigen Computern, auf denen TCP-Protokollsoftware installiert und die Socket-Spezifikation implementiert ist.
Die Windows-Socket-Spezifikation (kurz Winsock) erweitert die Socket-Spezifikation von Berkeley und ermöglicht die Kommunikation mit Sockets auf jeder Plattform. In Delphi sollte der zugrunde liegende Socket auch der Windows-Socket sein. Socket verringert die Schwierigkeit, Kommunikationssoftware zwischen Computern zu schreiben, ist aber im Allgemeinen immer noch recht kompliziert (dies wird später ausführlich besprochen). Nachfolgend erklären wir anhand von Beispielen, wie man Socket zum Schreiben von Kommunikationsprogrammen in Delphi verwendet.
2. Verwenden Sie Delphi, um ein Socket-Kommunikationsprogramm zu schreiben.
Das Folgende ist ein einfaches Socket-Kommunikationsprogramm, bei dem Client und Server dasselbe Programm sind. Wenn der Client (Server) einen Text in Memo1 eingibt und die Eingabetaste drückt, kann der Text auf dem Server (Client) angezeigt werden memo2, das Gegenteil gilt auch. Die spezifischen Schritte sind wie folgt:
1. Erstellen Sie ein neues Formular und benennen Sie es beliebig als „chatForm“. Platzieren Sie ein „MainMenu“ (in der Spalte „Standard“) und erstellen Sie die Menüelemente „ListenItem“, „ConnectItem“, „Disconnect“ und „TClientSocket“. Fügen Sie sie zur chatForm hinzu, wobei der Name von TClientSocket auf ClientSocket gesetzt ist. Stellen Sie den Port auf 1025 ein, der Standardwert ist „false“; setzen Sie den Namen von TServerSocket auf „ServerSocket“, setzen Sie den Port auf 1025, der Standardwert „aktiv“ ist „false“ und lassen Sie die anderen unverändert Sonstiges Für Memo2 ist die Farbe von Memo2 auf Grau eingestellt, da es hauptsächlich zur Anzeige der Eingaben der anderen Partei verwendet wird. Nachfolgend erläutern wir den Grund für das Schreiben von Code.
2. Doppelklicken Sie auf ListemItem. Schreiben Sie den folgenden Code:
procedure TChatForm.ListenItemClick(Sender: TObject);
beginnen
ListenItem.Checked := not ListenItem.Checked;
wenn ListenItem.Checked dann
beginnen
ClientSocket.Active := False;
ServerSocket.Active := True;
Ende
anders
beginnen
wenn ServerSocket.Active dann
ServerSocket.Active := False;
Ende;
Ende;
Die Beschreibung dieses Programmsegments lautet wie folgt: Wenn der Benutzer das ListenemItem auswählt, wird das ListenItem invertiert. Wenn es ausgewählt ist, bedeutet dies, dass es sich im Listen-Zustand befindet. Was die Leser verstehen müssen, ist: Listen ist eine proprietäre Methode, wenn Socket bereitgestellt wird als Server. Wenn es sich im Listen-Modus befindet, wird ServerSocket auf den aktiven Status gesetzt; andernfalls wird das Listening abgebrochen und ServerSocket geschlossen. Tatsächlich wählt zunächst nur der Benutzer diesen Menüpunkt aus und zeigt damit an, dass das Programm als Server fungiert. Wenn der Benutzer hingegen ConnectItem auswählt, muss es als Client verwendet werden.
3. Doppelklicken Sie auf ConnectItem und geben Sie den folgenden Code ein.
procedure TChatForm.ConnectItemClick(Sender: TObject);
beginnen
wenn ClientSocket.Active dann ClientSocket.Active := False;
if InputQuery('Computer zum Herstellen einer Verbindung', 'Adressname:', Server) dann
wenn Länge(Server) > 0 dann
mit ClientSocket tun
beginnen
Host := Server;
Aktiv := True;
ListenItem.Checked := False;
Ende;
Ende;
Die Hauptfunktion dieses Programms besteht darin, die Anwendung als Client festzulegen, wenn der Benutzer den Menüpunkt „ConnectItem“ auswählt und ein Eingabefeld angezeigt wird, in das der Benutzer die Adresse des Servers eingeben kann. Aus diesem Grund reparieren wir den ClientSocket-Host nicht zu Beginn, sodass Benutzer dynamisch eine Verbindung zu verschiedenen Servern herstellen können. Was die Leser verstehen müssen, ist, dass die Hostadresse nur ein Attribut ist, das Socket hat, wenn es ein Client ist. Wenn Socket ein Server ist, verwendet er die Adresse „im Allgemeinen“ nicht, da sie an den lokalen Computer gebunden ist.
4. Schreiben Sie den folgenden Code in die Keydown-Methode von Memo1:
procedure TChatForm.Memo1KeyDown(Sender: TObject; var Key: Word;
Schicht: TShiftState);
beginnen
wenn Key = VK_Return dann
wenn IsServer dann
ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1])
anders
ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);
Ende;
Die Funktion dieses Codes ist offensichtlich, das heißt, er beginnt mit dem Senden von Nachrichten. Wenn es sich um einen Server handelt, sendet er nur eine Nachricht an den ersten Client. Da ein Server eine Verbindung zu mehreren Clients herstellen kann und jede Verbindung mit dem Client von einem Socket aufrechterhalten wird, wird im ServerSocket.Socket.Connections-Array der Socket gespeichert das die Verbindung mit dem Kunden aufrechterhält. Im Standard-Socket erhält der serverseitige Socket den Socket, der die Verbindung mit dem Client aufrechterhält, über den Rückgabewert der Methode „accept()“, und die Methoden zum Senden und Empfangen von Nachrichten sind send(sendto) bzw. recv(recvfrom). . Delphi hat diese Kapselung durchgeführt.
5. Eine kurze Einführung in die übrigen Codes.
Prozedur TChatForm.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
beginnen
IsServer := True;
Ende;
Die Accept-Methode von ServerSocket wird abgeschlossen, wenn der Client zum ersten Mal eine Verbindung herstellt. Aufgrund ihrer Parameter kann davon ausgegangen werden, dass sie nach der Standard-Accept-Methode ausgeführt wird. Da es den Parametertyp TCustomWinSocket gibt, sollte dieser der Rückgabewert sein Standard serverseitiger Socket.
procedure TChatForm.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
beginnen
Memo2.Lines.Add(Socket.ReceiveText);
Ende;
Prozedur TChatForm.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
beginnen
Memo2.Lines.Add(Socket.ReceiveText);
Ende;
Diese beiden Codeteile werden von Delphi ausgelöst, wenn die Serverseite und die Clientseite gegenseitig Nachrichten empfangen. Ihre Funktion besteht darin, die empfangenen Nachrichten in Memo2 anzuzeigen. Unter diesen ist der Socket in ClientSocketRead tatsächlich der Socket selbst, und der Socket in ServerSocketClientRead ist tatsächlich ein Socket in ServerSocket.Socket.Connection[]. In Delphi ist der serverseitige Socket jedoch effektiv gekapselt.
Prozedur TChatForm.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
beginnen
Memo2.Lines.Clear;
Ende;
procedure TChatForm.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
beginnen
ListenItemClick(nil);
Ende;
Diese beiden Absätze sind relativ einfach. Unter anderem wird ServerSocketClientConnect ausgelöst, wenn ServerSocket eine neue Verbindung empfängt. ClientSocketDisconnect wird ausgelöst, wenn ClientSocket Disconncet ausgibt.
procedure TChatForm.Exit1Click(Sender: TObject);
beginnen
ServerSocket.Close;
ClientSocket.Close;
Schließen;
Ende;
procedure TChatForm.Disconnect1Click(Sender: TObject);
beginnen
ClientSocket.Active := False;
ServerSocket.Active := True;
Ende;
Der erste Absatz besteht darin, den Antrag zu schließen. Im Standard-Socket muss beim Schließen jedes Sockets die Methode closesocket () aufgerufen werden, andernfalls gibt das System keine Ressourcen frei. Bei ServerSockt.Close und ClientSocket.Close muss die Methode closesocket() systemintern aufgerufen werden.
3. Standard-Socket und Socket in Delphi.
Das Standard-Socket-Anwendungsframework lautet wie folgt:
Serverseite: Socket()[Neuen Socket erstellen]--Bind()[Mit der Serveradresse binden]--Listen()--Accept()--block wait--read()[Nachrichten akzeptieren, in den Fenstern Plattform, die Methode ist send(TCP) oder sendto(UDP)]--Prozessdienstanforderung--Write()[Nachricht senden, auf der Windows-Plattform ist die Methode send(TCP), Oder sendto(UDP).
Die Clientseite ist relativ einfach: Socket()--Connect() [Stellen Sie über einen bestimmten Port eine Verbindung zu einem bestimmten Server her, um eine Verbindung mit dem Server herzustellen]--Write()--Read().
Socket kann auf TCP oder UDP basieren und Socket basiert sogar auf anderen Protokollen wie IPX/SPX, DECNet usw. Beim Erstellen eines neuen Sockets können Sie angeben, welcher Socket-Typ erstellt werden soll. Bind() wird verwendet, um an die Adresse des Servers zu binden. Wenn ein Host nur eine IP-Adresse hat, ist die Rolle der Bindung eigentlich relativ redundant. Listen() beginnt mit der Überwachung des Netzwerks, Accept() wird zum Akzeptieren der Verbindung verwendet und sein Rückgabewert ist der Socket, der den Kontakt mit dem Client aufrechterhält.
In Delphi ist Socket in Windows effektiv gekapselt. In Delphi können sie entsprechend ihrer Vererbungsbeziehung in zwei Kategorien eingeteilt werden:
1. TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TServerSocket
TComponent--TAbstractSocket--TCustomSocket--TClientSocket
2. Direkt von TObject erben:
TObject--TCustomWinSocket--TServerWinSocket
TObject--TCustomWinSocket--TClientWinSocket
TObject--TCustomWinSocket--TServerClientWinSocket
Es ist ersichtlich, dass der erste Typ auf TCustomSocket und der zweite Typ auf TCustomWinSocket basiert. Der erste Typ basiert auf TComponet und der zweite Typ wird direkt auf TObject erstellt. Wenn der Benutzer mit Socket sehr vertraut ist und ein Konsolenprogramm schreiben möchte, kann er daher die Klasse TCustomWinScoket verwenden.
Wie aus den gleichen Verwendungen hervorgeht, sind sie alle in ScktComp.pas implementiert, und schtComp.pas enthält die Datei winsock.pas. Wenn Sie weiter in die Datei winsock eintauchen, können Sie alle grundlegenden Methoden von Windows Socket finden.
Wenn Sie das Standard-Socket-Anwendungsframework verstehen, können Sie mit Delphi problemlos Socket-Anwendungen schreiben. Dies bedeutet jedoch nicht, dass Sie die Standardfunktionen in komplexen Sockets verstehen müssen, und dies ist auch nicht erforderlich, da Delphi dies bereits getan hat Für Sie ist es gut gekapselt, was die Stärke von Delphi ist. Sie müssen nur ein wenig vom Grundgerüst verstehen.
Dies ist mein Verständnis von Socket-Anwendungen in Delphi. Ich hoffe, Sie können mich korrigieren, wenn ich irgendwelche Mängel habe. Gleichzeitig beantworte ich auch gerne Fragen zum Thema Socket in Delphi.