Autor |
Beitrag |
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 21.09.06 23:44
Moin!
Es gibt eine neue Version: V4.00-Milestone-Edition- vom 22.09.2006!
Es ist fast alles neu! Da dieses Tutorial sich konkret an Anfänger in Sachen Netzwerk richtet, waren die Vorgängerversionen (leider ) schon mit viel zu viel Detailproblemen und deren ausufernden Lösungen vollgestopft. Das hatte natürlich den gegenteiligen Effekt, wie beabsichtigt: Abschreckung, statt leicher Einstieg. Deshalb wieder back-to-the-roots, nur das notwendigste in Kürze, aber mit Würze! Also, wer bisher von den Vorgängerversionen eher abgeschreckt war, sollte nochmal reinschauen, das ganze Thema ist jetzt sehr viel einfacher präsentiert und garantiert einen weiteren Blick wert!
Für die schon etwas fortgeschritteneren Leser, die jetzt spezielle Themen (wie den Binärdatentransfer) vermissen: Es geht nichts aus den Vorgängerversionen verloren, ich werde die jetzt fehlenden Teile im zweiten Teil - ebenfalls in verbesserter Form - wieder präsentieren. Noch etwas Geduld, bitte.
Details und Download - wie immer - im ersten Beitrag des Threads.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Zuletzt bearbeitet von Narses am Do 19.10.06 22:43, insgesamt 1-mal bearbeitet
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 13.10.06 13:01
Moin!
Der angekündigte, 2. Teil des Tutorials ist jetzt fertig.
Viel Erfolg damit.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
freddiiii
Hält's aus hier
Beiträge: 2
|
Verfasst: Di 24.10.06 07:43
Hervorangendes Tutorial
Hat bisher gut bei meinen Anfängerproblemen geholfen un wird auch nochn paar offene Fragen klären denk ich mal!
Einfach top..
Und hingegen vieler anderen Leute is Narses auch noch sehr hilfsbereit gegenüber Anfängern die weitergehende Fragen haben oder Tips brauchn
fred
|
|
-Pl-
Beiträge: 22
Win XP, Win Vista
Delphi 7
|
Verfasst: Di 30.01.07 13:19
Da hammer den Thread ja ..
Einfach super Tutorial ! Habe jetzt auch nochmal die neue Version durchgelesen, frei nach dem Motto, doppelt hält besser und kann das Tutorial einfach nur weiterempfehlen. Vorallem für diejenigen unter euch die noch nicht so die Erfahrung mit Internet/LAN bei Delphi haben. Super Einführung und Erklärung und man kann selber immernoch sehr gut drauf aufbauen und sich neue Dinge dazu überlegen, nicht zuletzt durch die immer wieder eingefügten Denkanstöße in diese Richtung.
Nochmal vielen Dank Narses !
|
|
catweasel
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: Mi 16.05.07 14:43
Hi,
wow. Wirklich tolles tut...
Mir is nur auf die schnelle ein kleiner Typo aufgefallen....
Auf Seite 35 bei Punkt b heisst es : ... ist keiner als die eigene....
... muesste heissen ... "ist kleiner als die eigene".
also nix fuer ungut..
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 19.05.07 21:39
Moin!
catweasel hat folgendes geschrieben: | wow. Wirklich tolles tut |
Danke.
catweasel hat folgendes geschrieben: | ein kleiner Typo aufgefallen |
Habe ich schon korrigiert, aber dafür lohnt (noch) kein Update; trotzdem Danke für den Hinweis.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Hendi48
Beiträge: 271
|
Verfasst: Do 21.06.07 19:57
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 21.06.07 21:20
Moin!
Hendi48 hat folgendes geschrieben: | kann man auch irgendwie den server in der Userliste anzeigen lassen? |
Grundsätzlich kann man eine ganze Menge machen, die Frage ist, wieviel Aufwand das ist. Aber um die Frage kurz zu beantworten: nein, das geht nicht so ohne weiteres. (jedenfalls nicht, ohne den Rahmen des Tutorials oder auch nur eines Beitrags hier zu sprengen)
Der Server ist eben kein Client und hat als solcher nix in der Client-Liste zu suchen; das ist bei anderen Chat-Systemen ja auch nicht anders, oder steht bei dir der ICQ-Server mit in der Kontaktliste...
Hendi48 hat folgendes geschrieben: | Also mein Server heißt nich system sondern ich kann einen namen eingeben (edit1). Wenn ich unter
Delphi-Quelltext 1:
| Clients.AddItem(Socket.RemoteHost,Socket); |
Delphi-Quelltext 1:
| Clients.AddItem(edit1.text,Socket); |
tu, bekomm ich ne access violation und im client kommt alles doppelt |
Das ist ja auch "falsch" (Server ist kein Client und hat in der Liste nix zu suchen), deshalb gibt´s hier korrekterweise Fehlermeldungen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Hendi48
Beiträge: 271
|
Verfasst: Do 21.06.07 22:07
ok stimmt, jetz wo dus sagst
Egal dann geh ich eben auch als Client rein
|
|
jackle32
Beiträge: 183
Erhaltene Danke: 7
Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
|
Verfasst: Fr 17.08.07 22:54
Hallo erst mal,
ich hab mal ein ganz grundsätzliche Frage zu den Sockets. Worin besteht jetzt genau der Unterschied zwischen den T-Socket und den TCP-Socket? Würde der Chat auch laufen wenn ich jetzt einen TCP-Socket her nehm, den den gleichen Namen gebe (also z.B. "ClientSocket1")? Soll heißen sind die Befehle idtentisch oder anders und wenn sich die Sockets unterscheiden, wann nehm ich welchen für was? Zumal ich irgendwo gelesen hab, dass die T-Sockets von Borland als "bugy" eingestuft werden.
Hoffe ich bin im richten Thread und auf baldige Antwort
Gruß
Jack
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 19.08.07 23:12
Moin!
jackle32 hat folgendes geschrieben: | Worin besteht jetzt genau der Unterschied zwischen den T-Socket und den TCP-Socket? |
Es sind gänzlich unterschiedliche Komponenten, näheres verrät dir die Delphi-Online-Hilfe.
jackle32 hat folgendes geschrieben: | Würde der Chat auch laufen wenn ich jetzt einen TCP-Socket her nehm |
Nein (unter der Annahme, dass du für TClientSocket einen TTCPClient verwenden möchtest).
jackle32 hat folgendes geschrieben: | wenn sich die Sockets unterscheiden, wann nehm ich welchen für was? |
Das mußt du selbst entscheiden, indem du dir beide Komponenten mal intensiv anschaust; ich kann dir dabei leider nicht helfen.
jackle32 hat folgendes geschrieben: | Zumal ich irgendwo gelesen hab, dass die T-Sockets von Borland als "bugy" eingestuft werden. |
Die Socket-Kompos sind etwa genau so bugy, die andere WSA-API-Wrapper auch; man muss sie halt zu nehmen wissen. Sie sind zugegeben "veraltet" (was auch immer das nun genau bedeuten mag ) und bieten keine höhere (Standard-)Protokollunterstützung, wie z.B. die Indy-Komponenten. Zum Einstieg (also zum Lernen) sind diese Komponenten allerdings relativ gut geeignet, weil man eben alles selbst machen muss und so auch viel lernen kann.
Weitere (Grundsatz-)Fragen (zu den Komponenten) aber bitte im Forum stellen; das hier ist die Library und speziell der Thread zu einem ganz konkreten Tutorial - und da hat diese Diskussion eigentlich nix zu suchen (gab übrigens auch schon ein paar Threads zu diesem Thema, einfach mal suchen); ich habe auch nur deshalb (hier) darauf geantwortet, weil du nach einer Ersatzmöglichkeit zum Einsatz im Chat gefragt hast.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
PeterPain
Beiträge: 83
|
Verfasst: Do 29.11.07 23:13
Hi Narses!
Deine Tutorials sind ja mal mehr als genial. Auch wenn ich sie nicht benötige habe ich sie gerne gelesen und möchte gesagt haben, dass ein derartiges Engagement, und das auch noch für lau (oder bezahlt man dich dafür?) wirklich mehr als Vorbildich ist! Weiter so
Gaanz grosses Kino!
Viele grüsse, peter
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 29.11.07 23:32
Moin!
PeterPain hat folgendes geschrieben: | Deine Tutorials sind ja mal mehr als genial. |
Vielen Dank!
PeterPain hat folgendes geschrieben: | oder bezahlt man dich dafür? |
Das tut man zwar, aber nicht hierfür. Ich habe die Tutorials natürlich nicht ausschließlich für´s Forum geschrieben, da gab´s auch noch andere Gründe...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
morvister
Hält's aus hier
Beiträge: 15
XP
Delphi 2005 Prof.
|
Verfasst: Do 31.07.08 22:32
Titel: Meldung im Server-Protokoll: <NICK> hat sich angemeldet
Hallo Narses,
Ich bin relativ unbedarft was Delphi angeht, mit Programmierung an sich kenne ich mich aber aus, leider kaum mit der OOP. Soviel zu meinem Kenntnisstand. Ich interessiere mich für die Techniken, ein netzwerkfähiges Spiel mit relativ geringem Datentransfer zu erstellen und habe mich daher mit Freuden auf dieses wirklich hervorragende Tutorial gestürzt.
Die Chat-Anwendung läuft soweit und ich denke, ich habe das meiste im Großen und Ganzen verstanden. Lediglich das Zusammenspiel der TCmdToken- und der Syntax-Komponente bereiten mir noch etwas Probleme was das Verständnis angeht. Liegt vermutlich an mangelnder Kenntnis über Delphi und seiner Syntax.
Meine eigentliche Frage aber dreht sich um die Nicknamen. Ich wollte ein wenig herumprobieren und hatte die Idee, beim Verbinden eines Clients mit dem Server ins Protokoll des Servers so etwas wie "Neuer Client verbunden: <NICK>" auszugeben.
Meiner Meinung gehört das in die "OnClientConnect"-Methode der Server-Socket-Komponente.
Mein 1. Versuch war das hier:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Clients.AddItem(Socket.RemoteHost,Socket); ReceiveBuffer.Add(''); Log.Lines.Add('Neuer Client verbunden: '+ Socket.RemoteHost); SendUserList; end; | Die Meldung wurde erzeugt, allerdings mit 'localhost' und nicht dem Nicknamen, wie ich es vermutet hatte. Eigentlich ist das auch sehr verständlich, aber ich frage mich, wie du es dann geschafft hast, mit dem 1. Befehl der Procedure den NICK in die Client-Liste einzutragen, wenn in Socket.RemoteHost 'localhost' steht, und nicht etwa der Nick.
Nach diesem Fehlschlag habe ich mich entschlossen, direkt auf die ListBox zu gehen.
Ein Versuch mit der Log.Lines.Add-Zeile wie oben, nur statt Socket.RemoteHost dann
Delphi-Quelltext 1:
| Clients.Items.Strings[Clients.Items.Count-1]); |
Ein weiterer Versuch mit Clients.Items.Strings[Clients.Items.IndexOfObject(Socket)]) statt Socket.Remote in derselben
Zeile.
Immer kommt dabei raus: "localhost"
Aber, wenn selbst in der Liste "localhost" statt des Nicknamens steht, wieso werden dann die Nicks angezeigt?
Mein Programm sieht exakt so aus, wie es gemäß Deines Tutorials aussehen müsste. Ich habe es inkl. des Änderns des Nicks mittels BtnSetNick erfolgreich durchgearbeitet. Da kam mir dann die Idee mit dieser Meldung.
Kannst Du mir helfen?
Sorrry der Quellcode ist etwas unübersichtlich. Ich bin neu hier und hab keine Ahnung, wie man die Quelltexte IDE-konform hier hinein bekommt.
Gruß
morvi
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 31.07.08 22:55
Titel: Re: Meldung im Server-Protokoll: <NICK> hat sich angemeldet
Moin und im Forum!
morvister hat folgendes geschrieben: | Meine eigentliche Frage aber dreht sich um die Nicknamen. Ich wollte ein wenig herumprobieren und hatte die Idee, beim Verbinden eines Clients mit dem Server ins Protokoll des Servers so etwas wie "Neuer Client verbunden: <NICK>" auszugeben.
Meiner Meinung gehört das in die "OnClientConnect"-Methode der Server-Socket-Komponente. |
Grundsätzlich gehörte es wohl vielleicht da hinein, allerdings steht zu diesem Zeitpunkt der Nickname des neuen Clients ja noch gar nicht fest.
morvister hat folgendes geschrieben: | Mein 1. Versuch war das hier:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Clients.AddItem(Socket.RemoteHost,Socket); ReceiveBuffer.Add(''); Log.Lines.Add('Neuer Client verbunden: '+ Socket.RemoteHost); SendUserList; end; | Die Meldung wurde erzeugt, allerdings mit 'localhost' und nicht dem Nicknamen |
Zur Klärung: mit Socket.RemoteHost bekommst du den Hostnamen der Gegenstelle, wenn der Server und der Client auf der gleichen Maschine laufen, also korrekterweise 'localhost'.
morvister hat folgendes geschrieben: | ich frage mich, wie du es dann geschafft hast, mit dem 1. Befehl der Procedure den NICK in die Client-Liste einzutragen, wenn in Socket.RemoteHost 'localhost' steht, und nicht etwa der Nick. |
Des Rätsels Lösung ist hier im Client-Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Execute(const Command: TCmdToken; Data: TStringList); var i: Integer; begin case Command of cmdVER: if (Data.Strings[1] = SRV_APP_ID) then if (Data.Strings[2] = PROTO_VER) then begin Log.Lines.Add(Data.Strings[1]+', PV: '+Data.Strings[2]+'.'+Data.Strings[3]); ClientSocket1.Socket.SendText(Syntax[cmdNICK].Text+#13+Nickname.Text+#13); | Der Nickname wird als "Antwort" auf die Versionskennung des Servers gesendet (das Ganze ist Teil der Connect-Ereigniskette).
morvister hat folgendes geschrieben: | Immer kommt dabei raus: "localhost" |
Ich denke, dir sollte jetzt klar werden, warum.
morvister hat folgendes geschrieben: | Ich bin neu hier und hab keine Ahnung, wie man die Quelltexte IDE-konform hier hinein bekommt. |
Markiere einfach den entsprechenden Abschnitt/Quelltext im Editor und klicke dann auf das '+'-Zeichen neben dem "Delphi" in der Combobox für den Syntaxhighlighter.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
morvister
Hält's aus hier
Beiträge: 15
XP
Delphi 2005 Prof.
|
Verfasst: Do 31.07.08 23:49
Zunächst mal vielen Dank für die schnelle Antwort
Ich habe die Protokoll-VersionsPrüfung bei mir noch gar nicht eingebaut. Ich habe das Tutorial erst bis 4.2 "ändern des Nicknamen im Betrieb" durchgearbeitet und auf dem Stand sieht die OnClientconnect-Prozedur (ohne meine Sonderlocke mit der Meldung übre neue Verbindung, daher auskommentiert quasi so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Clients.AddItem(Socket.RemoteHost,Socket); ReceiveBuffer.Add(''); Clients.Items.Strings[Clients.Items.Count-1]); SendUserList; end; |
Ich bin nun aufgrund des Aufrufs von SendUserList am Ende der Procedure davon ausgegangen, dass die User-Liste zu diesem Zeitpunkt schon aktuell sein muss, und zwar durch Clients.AddItem(Socket.RemoteHost.Socket) sonst würds ja nix bringen, sie durch den Äther zu jagen
Ich hab sicher irgendwo nen Denkfehler oder ich habe die Reihenfolge der Ereignisse noch nicht aufm Schirm...Ich habs so verstanden, dass das OnConnect-Ereignis auf der Client-Seite, welches in meinem Fall so aussieht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin ReceiveBuffer := ''; ConnectionState := mcsOnline; Log.Clear; Log.Lines.Add('Verbunden mit: '+ClientSocket1.Socket.RemoteHost); Socket.SendText('NICK'+#13+Nickname.Text+#13); end; |
das OnClientConnectEreignis auf der Server-Seite auslöst. Wenn dem so wäre, wäre die Info über den Nicknamen auf der Servcerseite vorhanden. Und vorhanden muss sie ja auch sein, wegen des Aufrufs von SendUserList
Kannst Du mir helfen, den Knoten zu lösen?
Gruß
morvi
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 01.08.08 00:01
Moin!
morvister hat folgendes geschrieben: | Ich habe die Protokoll-VersionsPrüfung bei mir noch gar nicht eingebaut. |
OK, ich hab einfach mal den letzten Code-Checkpoint genommen, weil du angedeutet hast, das Tut fertig zu haben.
morvister hat folgendes geschrieben: | Ich bin nun aufgrund des Aufrufs von SendUserList am Ende der Procedure davon ausgegangen, dass die User-Liste zu diesem Zeitpunkt schon aktuell sein muss, und zwar durch Clients.AddItem(Socket.RemoteHost.Socket) sonst würds ja nix bringen, sie durch den Äther zu jagen |
Nein, die Userliste enthält hier noch nicht den Nicknamen und nochmal nein, es bringt eine aktuelle Userliste, allerdings noch ohne den korrekten Nicknamen.
morvister hat folgendes geschrieben: | ich habe die Reihenfolge der Ereignisse noch nicht aufm Schirm... |
Wer auch immer welches Ereignis im TCP-Connecting triggert, der Nickname kommt auf jeden Fall erst im OnReceive rein und wird demzufolge im Execute-Ereignis verarbeitet.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
morvister
Hält's aus hier
Beiträge: 15
XP
Delphi 2005 Prof.
|
Verfasst: Fr 01.08.08 05:51
Moin
Danke, ich denke, diese Aussagen waren zum "Knoten lösen" geeignet
Und sorry für meine irreführenden Aussagen bzgl. des Stands Deines Tuts bei mir...es war wohl schon etwas zu spät
Besten Dank nochmal
|
|
Stinger47
Beiträge: 102
|
Verfasst: Do 20.08.09 13:07
Heyho,
auch von mir erstmal ein großes lob an das tut...für einen einsteiger wie mich in dieser matherie wirklich verständlich geschrieben...
aber irgendetwas will bei mir einfach nicht funktionieren
habe das tut bis zu CC2 durchgearbeitet und soweit alles verstanden nochmal selber nachprogrammiert ohne pdf...
aber eins will einfach nicht
wenn ich mich mit dem client verbinde erscheinen in dem log nur chinesische! zeichen
beim text senden sowohl vom server als auch vom client kommt nur die fehlermeldung "unbekanntest kommando: [wieder chinesische zeichen]"
die userliste wird nicht aktualisiert wieder nur chinesische murks
bei den fertig kompilierten exe-dateien funktioniert es...
compiliere ich deinen code aber neu kommt dort der selbe fehler wie bei mir...
liegt es an meinem delphi?
habe letzten von einem bekannten delphi 2009 bekommen...
habe vista 64 bit
liegt es am delphi?..windows?
Grüßle
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 20.08.09 13:11
Narses arbeitet mit AnsiStrings (in früheren Versionen String); seit D2009 wird für String standardmäßig WideString genommen. Änder alle Vorkommen von String nach AnsiString und probier das nochma ... Ansonsten mal kurzen Source online stellen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|