Wir schreiben einen Chat in Delphi. Einen einfachen Chat über DELPHI führen. Voraussetzungen installieren

In diesem Thema möchte ich ausführlich schreiben, wie man den einfachsten ICQ-Chat in Delphi erstellt!

Was wir dafür brauchen:
1.Delphi (7 ist am besten)
2. Installierte TICQ-Komponente.
3. Gerade Arme.

Lass uns anfangen!
Und so erstellen wir ein neues Projekt in Delphi und fügen die TICQ-Komponente in das Formular ein.
Wir werfen Memo1, EDit1,Edit2,button1,ListBox1,ListBox2 auf das Formular.
Erläuterung:
Memo1 – Chatprotokoll
Edit1 – UIN
Edit2 - Passwort
button1 - Verbindung
ListBox1 – Online-Benutzer
ListBox2 – reg. Benutzer

Knopf 1:

Prozedur TForm1.Button1Click(Sender: TObject); begin ICQClient1.UIN:=StrToInt(Edit1.Text); ICQClient1.Password:=Edit2.Text; icqclient1.Login(); Ende;

Das ICQClient1MessageRecv1-Ereignis sollte folgendermaßen aussehen:

Prozedur TForm1.ICQClient1MessageRecv1(Sender: TObject; Msg, UIN: String); begin Memo1.Lines.Add(trim(nick(UIN))+": "+Msg); //log, wenn Msg<>„!“ dann //wenn die Nachricht mit „!“ beginnt Wirf begin if OnLine(UIN) nicht in den Chat<>-1 dann //überprüft, ob der Benutzer im Chat ist Send(Msg,UIN) //wenn im Chat, dann akzeptiert er Nachrichten im Chat sonst wenn Reged(UIN)=-1 dann//überprüft auf Registrierung icqclient1.SendMessage( StrToInt(UIN), „Willkommen im Chat!“ + #13#10 + „Zur Registrierung geben Sie!reg ein<ваш ник>") else begin icqclient1.SendMessage(StrToInt(UIN), "Um den Chat zu betreten, verwenden Sie den Befehl!chat" + #13#10 + "Für Hilfe senden Sie!Hilfe") //Benutzer ist nicht im Chat! Ende ; end else Command( UIN,Msg); //Chat-Befehle! end;

Online-Funktion:

Funktion TForm1.OnLine(UIN:string):integer; var i:integer; begin OnLine:=-1; for i:=0 to ListBox1.Items.Count-1 do if Trim(Copy(ListBox1.Items[i],4,9))=UIN then //UIN length OnLine:=i; Ende;

Nachrichten an den Chat senden:

Prozedur TForm1.Send(Msg,UIN:string); var i2:integer; i:Ganzzahl; Str,Str2:string; begin Str2:=ListBox1.Items; for i:=0 to ListBox1.Items.Count-1 do begin if i2=5 then begin Sleep(2000); i2:=0; Ende; wenn Online(UIN)<>Ich beginne dann mit i2:=i2+1; Str:=ListBox1.Items[i]; if Trim(Copy(Str,1,2))=Trim(Copy(Str2,1,2)) then icqclient1.SendMessage(StrToInt(Copy(ListBox1.Items[i],4,9)), nick(UIN) +": "+Msg); Ende; Ende; Ende;

Nick-Funktion:

Funktion TForm1.nick(UIN:string):string; begin if Reged(UIN)<>-1 then nick:=TRIM(Copy(ListBox2.Items,13,50)) end

Reged-Funktion:

Funktion TForm1.Reged(UIN:string):integer; var i:integer; beginReged:=-1; for i:=0 to ListBox2.Items.Count-1 do if Copy(ListBox2.Items[i],4,9)=UIN then Reged:=i; Ende;

Und schließlich die Befehlsprozedur (Chat-Befehle):

Prozedur TForm1.Command(UIN,Msg:string); var i,i1,razdel:integer; Befehl, Schlüssel, Schlüssel2: Zeichenfolge; Str:string; Hilfe: TStrings; begin try section:=0; for i:=1 to Length(Msg) do begin help:= TStringList.Create; help.LoadFromFile("command/help.txt"); //Öffne eine Datei mit Text if (Msg[i]=" ") and (razdel=0) then razdel:=i; Ende; wenn teilen<>0 dann beginnen command:=Copy(Msg,1,razdel-1); key:=Copy(Msg,razdel+1,Length(Msg)); key2:=Copy(Msg,razdel+1,Length(Msg)); end else begin command:=Msg; Schlüssel:=""; Ende; if (command="!chat") oder (command = "!chat") then begin ListBox1.Items.Append(ListBox2.Items); icqclient1.SendMessage(StrToInt(UIN), „Sie sind angemeldet“); Ende; if (command = „!help“) oder (command = „!help“) then begin if OnLine(UIN)<>-1 dann beginnen icqclient1.SendMessage(StrToInt(UIN), help.Text); end else icqclient1.SendMessage(StrToInt(UIN), „Um Befehle zu verwenden, betreten Sie den Chat!“); Ende; //Ende; if (command="!exit") oder (command = "!Exit") oder (command = "!EXIT") then begin ListBox1.Items.Delete(OnLine(UIN)); Ende; if (command="!reg") oder (command="!nick") oder (command="!REG") und (key<>"") then begin if Reged(UIN)<>-1 then icqclient1.SendMessage(StrToInt(UIN), "Sie sind bereits im Chat registriert!:)") else if (Length(Trim(key))>15) then icqclient1.SendMessage(StrToInt(UIN), "Nickname too long , Es muss mehr als 3 und weniger als 15 Zeichen lang sein und darf keine Leerzeichen enthalten") 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;

Einige Leser könnten beim Blick auf den Titel des Abschnitts empört sein und fragen: „Was hat X-Coding mit einem einfachen Chat zu tun?“ Grundsätzlich besteht kein Zusammenhang. Chat ist ein einfaches Programm, das mit dem Netzwerk funktioniert. Ich weiß, dass man nicht alles unter einen Hut bringen kann, und wenn ein Dienstprogramm das Netzwerk nutzt, heißt das nicht, dass es sich um einen Hacker handelt. Dennoch werde ich hier die Erstellung des Chats beschreiben, da wir ihn auf einem grundlegend anderen Protokoll als üblich aufbauen werden. Auf jeden Fall wird dieses Wissen nicht überflüssig sein.

Aber über den Chat reden wir etwas später, aber jetzt ein wenig Theorie.

Derzeit gibt es zwei Hauptprotokolle: TCP und UDP. Zuvor war noch IPX weit verbreitet, das von Novell verwendet wurde. Aber im Moment zieht es weg, und so ein Tier sieht man selten mehr. Nur auf älteren Systemen ist IPX zu sehen. Die meisten anderen Ihnen bekannten Protokolle (FTP, HTTP, POP3, SMTP usw.) laufen auf TCP oder UDP.

Was bedeutet es: „auf einem anderen Protokoll“? TCP implementiert die Grundfunktionen für die Arbeit mit einem Netzwerk. Es kann eine Verbindung mit einem entfernten Computer herstellen, Daten senden und empfangen und prüfen, ob der Server gesendete Pakete korrekt empfangen hat. Nehmen wir an, wir möchten ein Dateiübertragungsprotokoll (FTP) erstellen. Dazu nehmen wir TCP, statten es mit den von uns benötigten Fähigkeiten aus und signieren es. Es stellt sich also heraus, dass FTP (zusätzlich zum) TCP-Protokoll funktioniert. Wenn wir FTP von Grund auf erstellen möchten, müssen wir die Funktionen für den Verbindungsaufbau und die Datenübertragung neu implementieren. Sie müssen also nur die Daten in einem speziellen Format (FTP-Protokoll) aufbereiten und an das TCP-Protokoll übergeben, das selbst eine Verbindung aufbaut und diese Daten dorthin sendet, wo sie benötigt werden.

Wenn Sie mit Delphi aus erster Hand vertraut sind und zumindest ein wenig Verständnis für die OOP-Theorie haben, dann ist Ihnen die Analogie zur objektorientierten Programmierung bereits aufgefallen. Genau nach diesem Prinzip arbeitet das Netzwerk. Das Ganze ist standardisiert, und wenn Sie mehr erfahren möchten, lesen Sie die Dokumentation zum OSI-Modell (Open Systems Interconnection) und seinen sieben Ebenen (hier kann ich sie noch einmal an meine Website senden oder Abschnitt 4.1 dieses Buches lesen). Dieses Thema ist sehr interessant und es ist auf jeden Fall ratsam, den Aufbau der Protokolle zu kennen.

Das UDP-Protokoll ist TCP sehr ähnlich. Es implementiert auch Datenübertragungsfunktionen, stellt jedoch keine Verbindungen her und wahrt nicht die Integrität der übertragenen Daten. Das Protokoll öffnet einfach einen Port, wirft einen Teil der Daten dorthin und kümmert sich nicht einmal darum, ob sie den Empfänger erreichen oder nicht. Daher ist UDP viel schneller als TCP.

Wenn Sie mit diesem Protokoll arbeiten möchten, müssen Sie die Überprüfung der Korrektheit des Datenempfangs selbst durchführen. Um Dateien oder andere große Informationen zu übertragen, müssen Sie daher TCP wählen, denn wenn auch nur ein kleiner Teil der Datei verloren geht, kann dieser nicht wiederhergestellt werden. Nun, für den Chat, den wir heute schreiben werden, wird UDP eine bequemere Option sein. Es ist sehr schnell und sehr effizient für kleine Nachrichtengrößen.

In Delphi eignet sich die Bibliothek gut zum Arbeiten

Ich denke, sie wird bald deine beste Freundin werden.

Die Theorie ist vorbei, fahren wir mit dem Schreiben des Chats fort. Strecken Sie Ihre Finger, Maus, Tastatur und starten Sie Delphi. Jetzt beginnen wir mit meiner Lieblingsbeschäftigung – dem Programmieren. Wir benötigen 3 Komponenten auf dem Formular.

□ Tmeto-Komponente. Es kann nahezu auf die gesamte Form gedehnt werden.

□ Die TEdit-Komponente, in die wir die zu sendende Nachricht schreiben.

□ TTaste, wenn sie gedrückt wird, wird die Nachricht gesendet. In Abb. Abbildung 4.21 zeigt die Form des Zukunftschats.

Um mit Ports arbeiten zu können, benötigen wir die Komponenten idUDPClient (können Daten senden, Abb. 4.22) aus der Registerkarte „Indy Clients“ und idUDPServer (können Daten empfangen, Abb. 4.23) aus der Registerkarte „Meine Server“. Übertragen Sie eine solche Komponente in das Formular.

Abb. 4.22. Eigenschaften der idUDPCient-Komponente

Reis. 4.23. Eigenschaften der idUDPServer-Komponente

Jetzt müssen wir das Protokoll und O R konfigurieren. Als Erstes wählen wir einen beliebigen Port zwischen 1 und 65.000 aus, über den die Kommunikation erfolgen soll. Ich habe mich für 11245 entschieden (Sie können jede andere wählen). Weisen Sie diesen Wert der Port-Eigenschaft der idUDpc-Client-Komponente und der Standard-Port-Eigenschaft der idUDPServer-Komponente zu. Dadurch werden Client und Server gezwungen, auf demselben Port zu laufen, was für eine funktionierende Kommunikation erforderlich ist.

ERINNERN!!! UDP-Protokollports überschneiden sich nicht mit TCP-Ports. Das bedeutet, dass TCP-Port 80 nicht gleich UDP-Port 80 ist.

Jetzt muss der Client (idüDPCilent) die Host-Eigenschaft angeben. Hier wird die IP-Adresse des Computers erfasst, an den Nachrichten gesendet werden. Unser Chat und unsere Nachrichten sollten jedoch von allen Benutzern im Netzwerk empfangen werden, die das Programm gestartet haben. Um Probleme zu vermeiden, empfiehlt es sich daher, BroadcastEnabled für beide Komponenten auf true zu setzen. A Verwenden Sie anstelle einer bestimmten IP-Adresse eine Broadcast-Adresse (eine Adresse, die jeder erhält). Wenn Sie in Ihrem Netzwerk Adressen wie 192.168.100.x verwenden, lautet Ihre Broadcast-Adresse 192.168.100.255 (wir ändern das letzte Oktett in 255).

Die Vorbereitungen sind abgeschlossen, Sie können programmieren.

Erstellen Sie einen Button-Event-Handler und schreiben Sie dort den folgenden Code:

Prozedur TForml.ButtonlClick(Sender: TObject); begin IdUDPClientl.Send(Editl.Text); Ende;

Es gibt nur eine Zeile, die den Inhalt der Eingabezeile (Komponente) über einen UDP-Client sendet

Jetzt müssen wir dem UDP-Server beibringen, diese Informationen zu empfangen. Erstellen Sie dazu einen OnUDPRead-Ereignishandler FÜR die idUDPServer-Komponente. Schreiben Sie Folgendes hinein:

Prozedur TForml. IdODPServerlüDPRead(Sender: TObject; ÄEata: TStream; ABrnding: TIdSocketHandle);

var StringFormatedStream: TStringStream; s:String; begin //Initialisierung

StringFormatedStream: = TStringStream.Create(""); //Kopieren von einem einfachen Stream in einen String StringFormatedStream.CopyFrom(AData, AData.Size);

//Die empfangene Nachricht ausgeben

Memol.Lines.Add(ABinding.PeerIP+" "+StringFormatedStream.DataString);

ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s , Länge(n)); //Den String-Stream freigeben StringFormatedStream.Free; Ende;

Die Event-Handler-Prozedur verfügt über drei Parameter. Der erste ist in allen Handlern vorhanden und enthält nichts Interessantes für uns. Beim zweiten handelt es sich um Daten, die vom Netzwerk empfangen werden. Drittens speichert es Informationen darüber, woher die Daten stammen.

Die empfangenen Daten werden also im zweiten Parameter gespeichert. Sie kommen als einfacher unformatierter TStream zu uns. Um die Arbeit mit Daten komfortabler zu gestalten, ist es besser, sie in einen String-Stream zu übertragen. Halten Sie das für unpraktisch? Was passiert, wenn Sie keinen Text, sondern ein Bild übergeben und die Komponente es in Text formatiert? Jetzt wird das nicht mehr unbequem sein, sondern eine völlige Enttäuschung!

Sehen Sie, wie einfach alles in Text umgewandelt wird. Der Handler deklariert eine Variable StringFormatedStream vom Typ TStringStream (String-Stream). Die erste Codezeile initialisiert es. Die zweite Zeile kopiert Daten von einem einfachen Rohdatenstrom in einen Zeichenfolgendatenstrom. Alle!!! Jetzt befindet sich der übergebene Text in der Datastring-Eigenschaft des StringFormatedStream. DANACH können Sie dieses Ergebnis gerne in der Memo-Komponente AUSGEBEN.


Abb.4.24. Chat in Aktion

Aber wir schreiben einen Chat und es wäre wünschenswert, Informationen darüber anzuzeigen, wer diesen Text gesendet hat. Beispielsweise wird die IP-Adresse des Datensenders angezeigt, die sich in der repe-Eigenschaft des dritten ABinding-Parameters befindet. Aber das ist nur ein Beispiel und in einem echten Programm wird es hässlich aussehen. Worüber spricht Herr 192.168.100.x? Oder vielleicht ist es sogar die Dame, die spricht. Daher können Sie den Namen des Absenders direkt in den Sendetext einfügen. Der Code ändert sich wie folgt:

IdUDPClisntl. Send("Geben Sie hier den Namen des Absenders ein" Editl.Text); Sie können dem Benutzer erlauben, einen Namen in einer separaten Edit2-Eingabezeile einzugeben. In diesem Fall sieht der Code so aus; IdUDPClisntl.Send(Edit2.Text+" "+Editl.Text);

Auf der CD im Verzeichnis \Examples\Chapter 4\Chat finden Sie ein Beispiel dieses Programms.

neuer Spieler 4. Juli 2012 um 18:26 Uhr

Wir schreiben unser Fahrrad in Delphi

  • Abstellraum *

Guten Tag, Habrauser. Ich bin ehrlich, ich liebe die Delphi-Sprache und ich denke, dass sie zu Unrecht in Vergessenheit geraten ist. Und in diesem Thema möchte ich meine Erfahrungen beim Schreiben eines Chats mit Ihnen teilen. Das ist keine sehr komplizierte Angelegenheit, aber sehr, sehr lustig.

Einführung.

Um diesen Chat zu schreiben, habe ich die IDE Borland Delphi 7 Lite-Assembly verwendet. Alle benötigten Bibliotheken waren bereits enthalten.

Teil I. Schreiben der Schnittstelle.

Eigentlich ist dieser Teil der einfachste. Zuerst müssen wir darüber nachdenken, wie unser Chat funktionieren soll. Ich entschied mich dafür, den Port, die Serveradresse und den Spitznamen manuell auszuwählen. Im Prinzip können Sie den Port selbst auswählen und im Quellcode angeben, aber auf diese Weise können wir so viele Kopien des Programms im Servermodus ausführen, wie wir möchten, bis uns die Ports ausgehen. Wir erstellen also vier Eingabefelder, ein Element vom Typ „Memo“ und drei Schaltflächen. Vergessen Sie nicht, zwei Sockets hinzuzufügen, Server und Client. Wir schreiben Text auf Schaltflächen. Programmname, Symbol. Usw. Damit ist der erste Teil abgeschlossen.

Teil 2. Internalitäten.

Im Prinzip gibt es hier nicht viel Arbeit, aber es ist alles wichtig. Zuerst schreiben wir den Code für die Schaltflächen. Es befindet sich unten.

Prozedur TForm1. Button1Click(Sender: TObject);
beginnen
Taste2. Aktiviert: = false; // Deaktiviere die Server-Schaltfläche
Steckdose. Adresse := edit1. Text ;
Steckdose. Port: = StrtoInt(edit2.Text); //Notieren Sie den Port und die IP
Steckdose. Aktiv: = wahr; //Socket aktivieren
Steckdose. Offen ; // Öffne es
Taste3. aktiviert := true ; //Senden-Button entsperren
Ende ;

Und ungefähr das Gleiche gilt für alle anderen Tasten.

Für die Eingabefelder benötigen Sie nichts.

Unabhängig davon möchte ich darüber nachdenken, den Code für die Schaltfläche „Nachricht senden“ zu schreiben, da dieser sehr wichtig ist.

Prozedur TForm1. Button3Click(Sender: TObject);
var f: Ganzzahl ; heute: TdateTime;
beginnen
heute : = jetzt ; //Finde die Zeit heraus
s1:=edit4. Text ; //Bilden Sie eine Zeile mit Nickname und Sendezeit
s2:=edit3. Text ;
s3: = "[" + s2+ "] (" + TimetoStr(today) + ") :" + s1; //Alles zusammenkleben
ifclsocket. aktiv = dann wahr
ClSocket. Steckdose. SendText(s3) //Sende einen String an den Server
anders
beginnen
für f: = 0 bis SrSocket. Steckdose. ActiveConnections – 1 tun //Im Namen des Servers an alle Clients senden
beginnen
Steckdose. Steckdose. Verbindungen[f]. SendText(s3);
Ende ;
Notiz1. Linien. add(s3); // Notieren Sie sich den Chattermin
Ende ;
edit4. Text : = "" ;
Ende ;

Und schließlich schreiben wir den Verbindungs-/Trennungs-/Empfangscode. Dabei ist es wichtig, nicht zu vergessen, Ereignisse mit Prozeduren zu verknüpfen.

Prozedur TForm1. SrsocketClientRead(Sender: TObject;

var i: Ganzzahl ;
beginnen
Empfangen: = Socket. Empfangstext(); //Übertrage den empfangenen Text in eine Variable
für i: = 0 bis SrSocket. Steckdose. ActiveConnections – 1 tun //Senden Sie die empfangenen Informationen an alle verbundenen Clients
Steckdose. Steckdose. Verbindungen[i]. SendText(Received);
Memo1. Linien. add (Received) ; //Schreiben Sie es für uns selbst auf
Ende ;

Prozedur TForm1. SrSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
beginnen
Notiz1. Linien. Hinzufügen ( „Der Client hat die Verbindung getrennt“) ; //Einfach den Server benachrichtigen
Ende ;

Prozedur TForm1. SrSocketClientConnect (Sender: TObject; Socket: TCustomWinSocket) ;
beginnen
Notiz1. Linien. Hinzufügen ( „Der Kunde hat eine Verbindung hergestellt“) ;
Ende ;

Teil 3. Abschlusstests.

Dieser Teil ist der kürzeste. Fügen Sie in den Projekteinstellungen einen Namen, eine Version und einen Build hinzu und zeichnen Sie ein Symbol.

Außerdem habe ich nach einigem Suchen im Internet diesen Code zur Angabe der IP-Adresse gefunden und in meinen Chat eingefügt.

Funktion GetLocalIP: String ;
const WSVer = $101 ;
var
wsaData: TWSAData;
P:PHostEnt;
Buf: Array [ 0.. 127] von Char ;
beginnen
Ergebnis: = "" ;
Wenn WSAStartup(WSVer, wsaData) = 0, dann beginnen //Ich möchte hier nichts kommentieren, weil... Ich bin mir nicht ganz sicher, wie es funktioniert
Wenn GetHostName(@ Buf, 128) = 0, dann beginnen
P : = GetHostByName(@Buf) ;
wenn P<>dann null
Ergebnis: = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
Ende ;
WSACleanup;
Ende ;
Ende ;

Eigentlich ist das der gesamte Chat. Wie Sie sehen, ist das Schreiben sehr einfach. Und ich bin Ihnen einfach dankbar, dass Sie diesen Beitrag respektieren.

Einen erfolgreichen Tag!

Schlagworte: Delphi, Programmierung

Guten Tag, Habrauser. Ich bin ehrlich, ich liebe die Delphi-Sprache und ich denke, dass sie zu Unrecht in Vergessenheit geraten ist. Und in diesem Thema möchte ich meine Erfahrungen beim Schreiben eines Chats mit Ihnen teilen. Das ist keine sehr komplizierte Angelegenheit, aber sehr, sehr lustig.

Einführung.

Um diesen Chat zu schreiben, habe ich die IDE Borland Delphi 7 Lite-Assembly verwendet. Alle benötigten Bibliotheken waren bereits enthalten.

Teil I. Schreiben der Schnittstelle.

Eigentlich ist dieser Teil der einfachste. Zuerst müssen wir darüber nachdenken, wie unser Chat funktionieren soll. Ich entschied mich dafür, den Port, die Serveradresse und den Spitznamen manuell auszuwählen. Im Prinzip können Sie den Port selbst auswählen und im Quellcode angeben, aber auf diese Weise können wir so viele Kopien des Programms im Servermodus ausführen, wie wir möchten, bis uns die Ports ausgehen. Wir erstellen also vier Eingabefelder, ein Element vom Typ „Memo“ und drei Schaltflächen. Vergessen Sie nicht, zwei Sockets hinzuzufügen, Server und Client. Wir schreiben Text auf Schaltflächen. Programmname, Symbol. Usw. Damit ist der erste Teil abgeschlossen.

Teil 2. Internalitäten.

Im Prinzip gibt es hier nicht viel Arbeit, aber es ist alles wichtig. Zuerst schreiben wir den Code für die Schaltflächen. Es befindet sich unten.

Prozedur TForm1. Button1Click(Sender: TObject);
beginnen
Taste2. Aktiviert: = false; // Deaktiviere die Server-Schaltfläche
Steckdose. Adresse := edit1. Text ;
Steckdose. Port: = StrtoInt(edit2.Text); //Notieren Sie den Port und die IP
Steckdose. Aktiv: = wahr; //Socket aktivieren
Steckdose. Offen ; // Öffne es
Taste3. aktiviert := true ; //Senden-Button entsperren
Ende ;

Und ungefähr das Gleiche gilt für alle anderen Tasten.

Für die Eingabefelder benötigen Sie nichts.

Unabhängig davon möchte ich darüber nachdenken, den Code für die Schaltfläche „Nachricht senden“ zu schreiben, da dieser sehr wichtig ist.

Prozedur TForm1. Button3Click(Sender: TObject);
var f: Ganzzahl ; heute: TdateTime;
beginnen
heute : = jetzt ; //Finde die Zeit heraus
s1:=edit4. Text ; //Bilden Sie eine Zeile mit Nickname und Sendezeit
s2:=edit3. Text ;
s3: = "[" + s2+ "] (" + TimetoStr(today) + ") :" + s1; //Alles zusammenkleben
ifclsocket. aktiv = dann wahr
ClSocket. Steckdose. SendText(s3) //Sende einen String an den Server
anders
beginnen
für f: = 0 bis SrSocket. Steckdose. ActiveConnections – 1 tun //Im Namen des Servers an alle Clients senden
beginnen
Steckdose. Steckdose. Verbindungen[f]. SendText(s3);
Ende ;
Notiz1. Linien. add(s3); // Notieren Sie sich den Chattermin
Ende ;
edit4. Text : = "" ;
Ende ;

Und schließlich schreiben wir den Verbindungs-/Trennungs-/Empfangscode. Dabei ist es wichtig, nicht zu vergessen, Ereignisse mit Prozeduren zu verknüpfen.

Prozedur TForm1. SrsocketClientRead(Sender: TObject;

var i: Ganzzahl ;
beginnen
Empfangen: = Socket. Empfangstext(); //Übertrage den empfangenen Text in eine Variable
für i: = 0 bis SrSocket. Steckdose. ActiveConnections – 1 tun //Senden Sie die empfangenen Informationen an alle verbundenen Clients
Steckdose. Steckdose. Verbindungen[i]. SendText(Received);
Memo1. Linien. add (Received) ; //Schreiben Sie es für uns selbst auf
Ende ;

Prozedur TForm1. SrSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
beginnen
Notiz1. Linien. Hinzufügen ( „Der Client hat die Verbindung getrennt“) ; //Einfach den Server benachrichtigen
Ende ;

Prozedur TForm1. SrSocketClientConnect (Sender: TObject; Socket: TCustomWinSocket) ;
beginnen
Notiz1. Linien. Hinzufügen ( „Der Kunde hat eine Verbindung hergestellt“) ;
Ende ;

Teil 3. Abschlusstests.

Dieser Teil ist der kürzeste. Fügen Sie in den Projekteinstellungen einen Namen, eine Version und einen Build hinzu und zeichnen Sie ein Symbol.

Außerdem habe ich nach einigem Suchen im Internet diesen Code zur Angabe der IP-Adresse gefunden und in meinen Chat eingefügt.

Funktion GetLocalIP: String ;
const WSVer = $101 ;
var
wsaData: TWSAData;
P:PHostEnt;
Buf: Array [ 0.. 127] von Char ;
beginnen
Ergebnis: = "" ;
Wenn WSAStartup(WSVer, wsaData) = 0, dann beginnen //Ich möchte hier nichts kommentieren, weil... Ich bin mir nicht ganz sicher, wie es funktioniert
Wenn GetHostName(@ Buf, 128) = 0, dann beginnen
P : = GetHostByName(@Buf) ;
wenn P<>dann null
Ergebnis: = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
Ende ;
WSACleanup;
Ende ;
Ende ;

Eigentlich ist das der gesamte Chat. Wie Sie sehen, ist das Schreiben sehr einfach. Und ich bin Ihnen einfach dankbar, dass Sie diesen Beitrag respektieren.

Einen erfolgreichen Tag!

Schlagworte: Delphi, Programmierung


Ich denke, die Idee, einen eigenen (Unternehmens-)Chat zu erstellen, ist Ihnen schon mehr als einmal gekommen. Die gleiche Idee kam mir und wie immer begann ich, im Internet nach Informationen zu suchen, aber ich fand nichts Gutes. Alles beschreibt irgendwie nicht vollständig, wie das gemacht werden kann.

Und ich habe mir selbst versprochen, dass ich, sobald ich es studiere, vollständige Informationen zu diesem Thema veröffentlichen werde. Ich habe meinen Chat über Steckdosen geführt. Sie können damit sowohl über das Internet als auch über ein lokales Netzwerk kommunizieren. Dazu müssen Sie lediglich die IP-Adresse kennen. Programmiert in Delphi7.

Voraussetzungen installieren

Da ich es auf Delphi7 gemacht habe, waren die Komponenten, die ich brauchte, standardmäßig nicht vorhanden. ( ServerSocket1, ClientSocket1).
Dazu müssen Sie Socket-Komponenten hinzufügen.

Gehen Sie zum Menü Komponente -> Pakete installieren... -> Hinzufügen -> dclsockets70.bpl

Und wir geben den Pfad zum Paket mit Komponenten an, es befindet sich im Delphi-Stammordner im Bin-Paket. Ich hatte es in:

C:\Programme\Borland\Delphi7\Bin\dclsockets70.bpl

Nach dieser Hinzufügung sollten diese Komponenten auf Ihrer Registerkarte „Internet“ angezeigt werden.

Komponenten platzieren und Code schreiben

Ich habe dem Formular die folgenden Elemente hinzugefügt: ServerSocket1, ClientSocket1, Edit1 (für Chat), Edit2 (für die Server-IP-Adresse), Memo1 zum Anzeigen einer Nachricht und 3 Schaltflächen.

Um einen Server zu erstellen, schreiben Sie Folgendes in das Ereignis in der Schaltfläche:

Funktion GetLocalIP: Zeichenfolge;
const WSVer = $101;
var
wsaData: TWSAData;
P:PHostEnt;
Buff: Array von Verkohlen;
beginnen
Ergebnis:= "";
Wenn WSAStartup(WSVer, wsaData) = 0 dann fang an
Wenn GetHostName(@Buf, 128) = 0 dann fang an
P:= GetHostByName(@Buf);
Wenn P<> dann null
Ergebnis:= iNet_ntoa(PInAddr(p^.h_addr_list^)^);
Ende;
WSACleanup;
Ende;
Ende;

Verfahren TForm1.Button3Click(Sender: TObject);
beginnen
ServerSocket1.Port:=65000; // Port Ihres Servers, legen Sie einen beliebigen fest
ServerSocket1.Active:=True; // den Server aktivieren
ServerSocket1.Open; //Start
ShowMessage("Ihre IP: "+GetLocalIP); //Wir geben unsere IP-Adresse weiter, damit sich der Client mit uns verbinden kann
Ende;

Sobald der Server eingeschaltet ist, kann der Client eine Verbindung zum Server herstellen.
Dazu gibt er in Edit2 die IP-Adresse des Servers ein und drückt den Connect-Button:

Verfahren TForm1.Button2Click(Sender: TObject);
beginnen
ClientSocket1.Address:=Edit2.Text; // Server IP Adresse
ClientSocket1.Port:=65000; //sein Port
ClientSocket1.Active:=True; //den Client aktivieren
ClientSocket1.Open; //Start
Ende;

Aufmerksamkeit: Der Client kann nur eine Nachricht senden und der Server wiederum kann empfangen. Für die bidirektionale Kommunikation aktivieren Sie Client und Server in zwei Programmen an verschiedenen Enden des Netzwerks.

Um eine Nachricht zu lesen, muss der Server auf den Empfang der Nachricht warten ... hier ist sie

Verfahren TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
beginnen
memo1.Lines.add(Socket.RemoteAddress+": ");
memo1.Lines.add(Socket.ReceiveText);
StatusBar1.Panels.Items.Text:=Socket.RemoteAddress;
Ende;

Um die Nachricht zu senden, habe ich zwei Verfahren geschrieben. Hier sind sie:

Verfahren TForm1.SendMes(Text: Zeichenfolge);
beginnen
Wenn form1.ServerSocket1.Active Dann
Wenn form1.ServerSocket1.Socket.ActiveConnections>0 Dann
form1.ServerSocket1.Socket.Connections.SendText(Text);

Wenn form1.ClientSocket1.Active Dann
form1.ClientSocket1.Socket.SendText(Text);
Ende; Verfahren TForm1.Button1Click(Sender: TObject);
beginnen
SendMes(Edit1.Text);
memo1.Lines.add(GetLocalIP+": ");
memo1.Lines.add(Edit1.Text);
Ende;

gastroguru 2017