Entwickler-Ecke

Internet / Netzwerk - P2P Chat


chickenfigt1989 - Di 16.03.10 16:35
Titel: P2P Chat
Hey Hey
Ich will nen ganz Simplen P2P Chat Programmieren wo alle in einen Raum sind und wen ich auf einen Rechtsklick mache sollte kommen: Inhalt aus Memo senden, Kicken, Bannen.
Das alles sollte aber übers Internet Laufen also nicht nur in Heimnetzwerk bei mir Daheim.
Könnt ihr mir Tipps oder Links geben was ich alles brauch und wie ich sowas Realisiere??
MfG


Marc. - Di 16.03.10 16:39

Jupp, siehe user profile iconNarses Tutorial zu Minimaler LAN/Internet-Chat mit TServer-/TClientSocket [http://www.delphi-library.de/viewtopic.php?t=60744&highlight=lan%20chat%20tutorial]. :zwinker:

Ups, P2P völlig überlesen. :roll:


BenBE - Di 16.03.10 16:58

Das mit dem grundlegenden Tutorial zur Kommunikation untereinander ist schon mal gar nicht so schlecht.

Wenn das läuft, gehst Du weiter, dass du dir mal das Thema DHT und Kademlia anschaust. Von da aus, sollte der Rest recht einfach werden.


chickenfigt1989 - Mi 17.03.10 11:01

Hey
Ich habe Narses Tutorial angefangen, aber ich hänge schon bei dem Termchar Tutorial.
In der Pdf steht es so drin:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
TForm1 = class(TForm)
[...]
procedure ParseBuffer;
function GetCmdToken(const StrToken: String): TCmdToken;
procedure Execute(const Command: TCmdToken; Data: TStringList);
[...]
// Empfangspuffer nach Befehlen durchsuchen und dann ausführen
procedure TForm1.ParseBuffer;
var
Data: TStringList; // zum Zerlegen des Empfangspuffers
Current: TCmdToken; // aktuelles Kommando
OutOfArg: Boolean; // Flag zum Abbrechen der Befehlssuche
begin
Data := TStringList.Create;
try
Data.Text := ReceiveBuffer; // Empfangspufferdaten in Pakete zerlegen
OutOfArg := FALSE; // wir nehmen mal an, es sind genug Argumente da
while ( (Data.Count > 0// solange noch Befehle da sind und
and (NOT OutOfArg) ) do begin // die Argumente dafür reichen
// Befehl erkennen (gross/klein egal)
Current := GetCmdToken(UpperCase(Data.Strings[0]));
// ausreichend Argumente dafür da?
if (Data.Count >= Syntax[Current].ArgCount) then
Execute(Current,Data) // ja, dann bearbeiten
else // nein -> auf neue Daten warten...
OutOfArg := TRUE;
end;
// noch nicht verarbeitete Werte wieder in den Puffer zurück
ReceiveBuffer := Data.Text;
finally
Data.Free;
end;
end;


Bei mir ist es so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

const
// Port, an dem der ServerSocket auf Clients wartet
SERVER_PORT = 6786;
 Syntax: Array[TCmdToken] of TCmdSyntax = (
(Text: ''; ArgCount: 1), // NOP
(Text: 'SAID'; ArgCount: 3), // SAID
(Text: 'USER'; ArgCount: 2), // USER
(Text: ''; ArgCount: 1// ERROR; ist nur ein Dummy-Befehl -> kein Text
);
type
TCmdSyntax = record
Text: ShortString; // Kommando-Text
ArgCount: Integer; // Anzahl der Argumente incl. dem Kommando-Text
end;
// bekannte Kommandos aufzählen
TCmdToken = (
cmdNOP = 0// nichts tun (bis D5 das "= 0" weglassen!)
cmdSAID, // Textnachricht ausgeben
cmdUSER, // neue User-Liste
cmdERROR // Fehler, ungültiger Befehl
);

TCmdSyntax = record
Text: ShortString; // Kommando-Text
ArgCount: Integer; // Anzahl der Argumente incl. dem Kommando-Text
end;

TCmdToken = (
cmdNOP = 0// nichts tun (bis D5 das "= 0" weglassen!)
cmdSAID, // Textnachricht ausgeben
cmdUSER, // neue User-Liste
cmdERROR // Fehler, ungültiger Befehl
);

TMyConState = (
mcsOffline, // nicht verbunden
mcsPending, // Verbindungsstatus ändert sich gerade
mcsOnline // verbunden
);

  TForm1 = class(TForm)


Ich bekomme folgende Fehlermeldungen:
[Error] Unit1.pas(12): Undeclared identifier: 'TCmdToken'
[Error] Unit1.pas(12): Undeclared identifier: 'TCmdSyntax'
[Error] Unit1.pas(12): Data type too large: exceeds 2 GB
[Error] Unit1.pas(13): '(' expected but ':' found
[Error] Unit1.pas(13): '..' expected but ')' found
[Error] Unit1.pas(14): '(' expected but ':' found
[Error] Unit1.pas(14): Identifier redeclared: 'ArgCount'
[Error] Unit1.pas(15): '(' expected but ':' found
[Error] Unit1.pas(15): Identifier redeclared: 'ArgCount'
[Error] Unit1.pas(16): '(' expected but ':' found
[Error] Unit1.pas(16): Identifier redeclared: 'ArgCount'
[Error] Unit1.pas(17): Expression expected but ';' found
[Error] Unit1.pas(19): Identifier redeclared: 'TCmdSyntax'
[Error] Unit1.pas(24): Identifier redeclared: 'TCmdToken'
[Error] Unit1.pas(31): Identifier redeclared: 'TCmdSyntax'
[Error] Unit1.pas(36): Identifier redeclared: 'TCmdToken'
[Error] Unit1.pas(37): Identifier redeclared: 'cmdNOP'
[Error] Unit1.pas(38): Identifier redeclared: 'cmdSAID'
[Error] Unit1.pas(39): Identifier redeclared: 'cmdUSER'
[Error] Unit1.pas(40): Identifier redeclared: 'cmdERROR'
[Error] Unit1.pas(201): ')' expected but identifier 'ArgCount' found
[Error] Unit1.pas(213): Undeclared identifier: 'i'
[Error] Unit1.pas(257): 'DO' expected but identifier 'ArgCount' found
[Fatal Error] Client.dpr(5): Could not compile used unit 'Unit1.pas'


Delete - Mi 17.03.10 11:11

Hast du auch die nötigen Komponenten, Units, Klassen eingebunden? Vergleich mal die Uses-Abschnitte.


chickenfigt1989 - Mi 17.03.10 11:22

Also ich habe in den Tutorial nichts gefunden mit uses hinzufügen :(


Delete - Mi 17.03.10 11:24

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Also ich habe in den Tutorial nichts gefunden mit uses hinzufügen :(

Wie bitte?


Gausi - Mi 17.03.10 11:28

Wie wäre es mal mit etwas Eigeninitiative und/oder Grundlagen lernen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
const
// Port, an dem der ServerSocket auf Clients wartet
SERVER_PORT = 6786;
 Syntax: Array[TCmdTokenof TCmdSyntax = (
(Text: ''; ArgCount: 1), // NOP
(Text: 'SAID'; ArgCount: 3), // SAID
(Text: 'USER'; ArgCount: 2), // USER
(Text: ''; ArgCount: 1// ERROR; ist nur ein Dummy-Befehl -> kein Text
);

type
TCmdSyntax = record
Text: ShortString; // Kommando-Text
ArgCount: Integer; // Anzahl der Argumente incl. dem Kommando-Text
end;
// bekannte Kommandos aufzählen
TCmdToken = // ...


Du verwendest Typen, die du erst später deklarierst.


chickenfigt1989 - Mi 17.03.10 11:30

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Hast du auch die nötigen Komponenten, Units, Klassen eingebunden? Vergleich mal die Uses-Abschnitte.


Aber ich habe mich Streng ans Tutorial gehalten.
Wie deklarier ich die dan richtig?
MfG


Gausi - Mi 17.03.10 11:35

Erst deklarieren, dann benutzen?


ALF - Mi 17.03.10 11:38

user profile iconchickenfigt1989
Weist Du überhaupt was Du da machst! Mehr als C&P und das gleich doppelt und an den falschen stellen kann ich nicht erkennen!

Ich hatte echt gehofft Du steigst neu ein und willst was lernen.
Aber irrtum, Du machst genau so weiter! Schade :(
Gruss Alf


chickenfigt1989 - Mi 17.03.10 11:42

Ja ich Arbeite das Tutorial durch.
Passt es so?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
const
// Port, an dem der ServerSocket auf Clients wartet
SERVER_PORT = 6786;
 type
TCmdSyntax = record
Text: ShortString; // Kommando-Text
ArgCount: Integer; // Anzahl der Argumente incl. dem Kommando-Text
end;
// bekannte Kommandos aufzählen
TCmdToken = // ...

Syntax: Array[TCmdToken] of TCmdSyntax = (
(Text: ''; ArgCount: 1), // NOP
(Text: 'SAID'; ArgCount: 3), // SAID
(Text: 'USER'; ArgCount: 2), // USER
(Text: ''; ArgCount: 1// ERROR; ist nur ein Dummy-Befehl -> kein Text
);


Ich will es ja lernen und ich lies jetzt schon zum Dritten mal des Tutorial durch aber ich Blick da nicht durch. Ich hab mal ein Screenshot von der Betroffenen stelle im Anhang mit angehängt.


Delete - Mi 17.03.10 11:56

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Passt es so?

Woher sollen wir das wissen? Du sitzt doch davor. Drücke F9 und du weißt es.


elundril - Mi 17.03.10 12:18

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Ja ich Arbeite das Tutorial durch.


Sorry, aber Copy und Paste auf den Quelltext im tutorial anwenden ist nicht wirklich lernen. Lernen ist wenn man versteht was man macht und das auch selbst umsetzen könnte.

Außerdem, ich find diese Tutorials sind eher für Fortgeschrittene geeignet, nicht für Einsteiger, denn ich z.B. kenn mich bei den Tutorials auch noch nicht ganz aus, und als Einsteiger würd ich mich nicht gerade bezeichnen.

lg elundril


BenBE - Mi 17.03.10 22:17

Mal abgesehen, dass Tools wie DelForEx eine wahre Wohltat für deinen Quälkot darstellen ;-) (SCNR).

Ganz abgesehen davon, dass das in der Form nicht funktionieren kann. Auch Copy and Paste will gelernt sein.

Vom Meister persönlich [http://www.delphi-forum.de/viewtopic.php?p=474452#474452]:
Psssst: Crashkurs [http://www.christian-stelzmann.de/index_tutorials_crashkurs.html], Crashkurs Reloaded [http://www.christian-stelzmann.de/index_tutorials_crashkurs_reloaded.html]