Autor |
Beitrag |
donnerwurscht
Hält's aus hier
Beiträge: 6
D7 Enterprise
|
Verfasst: Do 03.02.05 22:27
Abend zusammen.
Ich probier mich als blutiger Delphi Anfänger momentan an nem Chat aus, der so langsam auch gut funzt..
mein Prob ist nur:
Onlineanzeige des Users!
Also, ich hab da memo1 für die nachrichten usw....
und memo2 als onlineanzeige der User.
gedacht hab ich mir das so. wenn er zu mir connected landet bei mir ja auch in memo1: blabla hat den raum betreten...
mich selber seh ich per memo2.lines......(passiert alles einmalig beim connect vorgang
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| ..... chatmemo1.lines.Add('Du bisch drin das war ja einfach'); DerClient.WriteLn(ChatNick+'>ist neu im Raum'); usermemo2.lines.Add(ChatNick); Button1.Enabled:=false; ....... |
Frage:
Iste es den nicht möglich über IdTCPClient1.WriteLn einmalig beim connect ins memo2 des gegenüber seinen nickname zu schreiben??? muss doch gehn oder????oder mach ichs mir da zu einfach ???
Falls nicht, ist es denn möglich, das mann beim einmaligen anmelden
Delphi-Quelltext 1:
| DerClient.WriteLn(ChatNick+'>ist neu im Raum'); |
irgendwie einfach nur den Nickname in memo2 kopiert???
grübel...
bin online und les alle paar minuten mal nach, weil ich nun wirklich schon seit 5 stunden nur dadran rumknobel...
Ps: ich benutz die indy 9 komponenten
Danke im Voraus..
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Do 03.02.05 22:36
ich habe sowas auch gesucht ich dachte es muss doch möglich sein, variabeln mit
inhalt zu verschicken um den receivetext außeinanderhalten zu können, ich hab das so gemacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.Button1Click(Sender: TObject); begin if n = true then begin if length(nick) <= 0 then nick := 'Gast'; if length(nick) >= 10 then nick := 'Gast'; if pos(':',nick) > 0 then nick := 'Gast'; if edit1.Text <> '' then begin if IsServer then begin for i:= 0 to ServerSocket1.Socket.ActiveConnections - 1 do ServerSocket1.Socket.Connections[i].SendText(nick + ': ' + edit1.text); memo1.Lines.add(''); memo1.lines.add(nick + ': ' + edit1.text); end else ClientSocket1.Socket.SendText(nick + ': ' + edit1.text); edit1.text:= ''; edit1.SetFocus; end; end; n:= false; timer1.Enabled:= true; end; |
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin ClientSocket1.Socket.SendText(nick); end; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin ClientSocket1.Socket.SendText(':'+nick); memo2.text:= ''; end; |
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:
| procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var rtext: string; begin rtext:= socket.ReceiveText; if pos(':', RText) > 0 then begin if pos(':', RText) = 1 then begin delete(RText, 1, 1); for i:= 0 to memo2.lines.count do if memo2.lines[i] = RText then begin memo2.Lines.delete(i-1); memo2.Lines.delete(i-1); end; sleep(10); for i:= 0 to ServerSocket1.Socket.ActiveConnections - 1 do ServerSocket1.Socket.Connections[i].SendText(memo2.text); end else begin memo1.lines.add(''); memo1.Lines.Add(RText); for i:= 0 to ServerSocket1.Socket.ActiveConnections - 1 do ServerSocket1.Socket.Connections[i].SendText(RText); if sound then PlaySound('newmessage',HInstance, snd_ASync or snd_Memory or snd_Resource); end; end else begin memo2.lines.add(''); memo2.lines.add('- ' + RText); sleep(10); for i:= 0 to ServerSocket1.Socket.ActiveConnections - 1 do ServerSocket1.Socket.Connections[i].SendText(memo2.text); end; end; |
ich habe zwar andere komponenten genommen das prinzip ist aber das gleiche.
Memo1 ist das chatfenster, memo2 die online liste
button1 ist der senden button, der timer ist nur für den spam schutz
der client darf dann nur kein ":" in seinem namen haben
der server unterscheidet text der ein ":" enthält, welches nicht an der ersten stelle im string ist (chat nachricht) eine nachricht ohne ":" (der name beim connecten) und ein ":" an der ersten Stelle (name beim disconnecten entfernen)
ich hoffe das hilft dir, wen du noch fragen zum code hast kannst mich gerne fragen,
falls andere hier verbesserungsvorschläge haben ('#0 geht net'), dann auch gerne,
falls code fehlt auch bitte bescheid sagen !!!
MFG
Der Dunkelfürchter
|
|
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 03.02.05 22:49
donnerwurscht hat folgendes geschrieben: | Iste es den nicht möglich über IdTCPClient1.WriteLn einmalig beim connect ins memo2 des gegenüber seinen nickname zu schreiben??? |
Nein, so etwas ist nicht direkt möglich. Solche Sachen werden in der Regel über Commands(Befehle) geregelt, die von einem Client zum anderen geschickt werden und u.U. noch Nutzdaten im Gepäck haben. Beim Empfang eines Commands wird dann entsprechend reagiert. Am Anfang jedes Chats steht eine Command-Liste, die Befehle/Signale wie zum Beispiel folgende enthält:
- *Online gekommen*
Reaktion: Neuen Client in Online-Liste aufnehmen
- *Hier kommt ne Message*
-> Message in Chatfenster anzeigen
- *Gib mal n paar Infos über dich*
-> Infos(Nick, email-Addy, #ICQ) schicken
- *Hier kommen alle Infos über mich*
-> Daten über den Client in Info-Fenster anzeigen
- *Gehe wieder offline*
-> User aus Online-Liste löschen
Du siehst, es entsteht eine richtige Kommunikation zwischen den beiden Clients. Jeder eingehende Befehl verlangt eine Reaktion des Empfängers.
Die Übertragung der Befehle steht nun jedem frei. Oft wird vor jede Message ein Prefix(z.B. 4 Byte groß) gehängt, der das Command repräsentiert. Auf unterstem Level kann man auch immer einen bestimmten Text-Prefix vorhängen, der ganz klar über den Befehl Auskunft gibt. Danach kommen dann, falls notwendig, noch Nutzdaten wie z.B. die Text-Botschaft, die gesendet wird.
Beispiele:
'cmd001_Dies ist eine Text-Message'
'cmd002_email@addy.de_meinNickname_meineICQ'
So weiß der CLient anhand der ersten paar Buchstaben, wie er das Command zu bearbeiten hat.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 03.02.05 22:50
Moin!
Auf die Gefahr hin, mich zu wiederholen, aber was haltet ihr von einem Protokoll? Mit etwas strukturierterem Programmaufbau wäre sicherlich auch einiges mehr rauszuholen... aber über som Zeuch steht man ja drüber, ne
cu
Narses
@Dunkelfürchter: bei dir fürchtet man sich eher vorm Code...
//EDIT: zu spät...
|
|
donnerwurscht 
Hält's aus hier
Beiträge: 6
D7 Enterprise
|
Verfasst: Do 03.02.05 22:52
Titel: seufz funzt wohl bei mir so net...
da ich die indy 9 komponenten habe, funzt das bei mir so net..
bei dir siehts so aus: Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin ClientSocket1.Socket.SendText(nick); end; |
bei mir geht nur so:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.IdTCPClient1Connected(Sender: TObject); begin IdTCPClient1.Socket.send(ChatNick); end; |
da bekomm ich beim kompilieren dann die meldung...nicht genügend wirkliche parameter...
liegt wohl daran, das es bei mir kein sendtext gibt, sondern nur send.... oder liegts an meinem 7 tage delphi wissen???
edit:
kann das sein, das die indy 9 komponenten nicht so dolle dafür sind?? weil irgendwie alle tuts im netz über chats die älteren winsockets benutzen??? sorry für meine doofen fragen, aber den wirklichen durchblick hab ich noch nicht 
|
|
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 03.02.05 22:57
Titel: Re: seufz funzt wohl bei mir so net...
donnerwurscht hat folgendes geschrieben: | oder liegts an meinem 7 tage delphi wissen??? |
Um es mal ganz schmucklos auszudrücken: Ja.
Leg den Chat erstmal in die Ecke, lese ein paar Tutorials, schreibe kleine Übungsprogramme, mache dich mit den Syntax vertraut und versuche dich in einem halben Jahr nochmal daran. Das wär für dich sicherlich das Beste. 
|
|
donnerwurscht 
Hält's aus hier
Beiträge: 6
D7 Enterprise
|
Verfasst: Do 03.02.05 23:07
Oki, ich glaub so wird das nix bei mir...
Mein Chat funzt eigentlich, aber eben die online Anzeige nicht.
Da ich nun wirklich erst seit 7 Tagen weiss das es delphi gibt  möge man mir nachsehen...
Jetzt frag ich einfach mal in die Runde.
Zwecks kompletten Neuaufbau meines Chats...man will ja was lernen, net murksen..
Was er können muss:
Server und Client gleichzeitig--- (so hab ichs momentan)
Lan sowie Internetfähig ( so wies aussieht hab ich das hinbekommen)
ne onlineanzeige solls ham ( funzt bei mir überhaupt nicht)
und ca. 10 leute gleichzeitig sollten miteinander chatten können ( is das bei ner server clientlösung möglich ???
Is die memo Komponente gut als nachrichtenfenster oder gibt es was besseres? wenn ja warum?
is ne memo komponente gut für ne onlineanzeige oder soll ich was anderes nehmen? wenn ja warum?
sind die indy 9 komponenten TIdTCPClient---TIdTCPServer (die verwende ich gerade ) überhaupt das richtige oder gibt es was besseres??? man ahnt schon, wenn ja warum,???
Ich danke auf jedenfall jetzt schon für die Antworten die gepostet wurden, und freue mich natürlich über weitere....
|
|
donnerwurscht 
Hält's aus hier
Beiträge: 6
D7 Enterprise
|
Verfasst: Do 03.02.05 23:16
Titel: Re: seufz funzt wohl bei mir so net...
Elite hat folgendes geschrieben: | donnerwurscht hat folgendes geschrieben: | oder liegts an meinem 7 tage delphi wissen??? |
Um es mal ganz schmucklos auszudrücken: Ja.
Leg den Chat erstmal in die Ecke, lese ein paar Tutorials, schreibe kleine Übungsprogramme, mache dich mit den Syntax vertraut und versuche dich in einem halben Jahr nochmal daran. Das wär für dich sicherlich das Beste.  |
Sorry, aber ich les seit Tagen Tutorials, war in der Bücherei und google wie ein irrer...
aber ich lern nun mal anders wie andere,ich kann mich nur an was festhaken wenns mich interessiert... auf hallo welt hab ich kein bock mehr und wahnsinnig viel freizeit hab ich auch nicht..
Ich denke, wer noch nie vorher programiert hat und dann nach 7 tagen einen zumindest teilweise funktionstüchtigen Chat hinbekommen hat, der hat ein erfolgserlebniss sondergleichen und spornt noch mehr an...
Mein Projekt ist nunmal ein Chat, und an dem werd ich auch bleiben, auch wenns schon milliarden davon gibt...
Macht mir halt Spass..
Ps:
Klug sind die, die schwer verständliches so erklären, das es einem leicht erscheint....
Have a nice day...
|
|
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 03.02.05 23:32
Also ich will dich auf keinen Fall daran hindern, einen Chat zu schreiben, wenn du es hinbekommst. Umso besser für dich. Ich hatte nur wieder den Gedanken im Kopf, dass man nach nur so kurzer Aufwärmphase vielleicht nicht alle Befehle und Code-Konstrukte überschaut, die notwendig sind.
donnerwurscht hat folgendes geschrieben: |
und ca. 10 leute gleichzeitig sollten miteinander chatten können ( is das bei ner server clientlösung möglich ???
|
Jup, du setzt einen Server auf und alle Clients connecten sich zu ihm. Dieser leitet dann alle empfangenen Daten an seine Clients weiter.
donnerwurscht hat folgendes geschrieben: |
Is die memo Komponente gut als nachrichtenfenster oder gibt es was besseres? wenn ja warum?
|
Besser TRichEdit, weil du mit der Farbgebung und ich glaube auch der Formatierung innerhalb des Textes Freiheit hast.
donnerwurscht hat folgendes geschrieben: |
is ne memo komponente gut für ne onlineanzeige oder soll ich was anderes nehmen? wenn ja warum?
|
Etwas listenbasierendes wäre wohl besser. TListBox oder - etwas vielseitiger - TListView sind nicht schlecht.
donnerwurscht hat folgendes geschrieben: |
sind die indy 9 komponenten TIdTCPClient---TIdTCPServer (die verwende ich gerade ) überhaupt das richtige oder gibt es was besseres??? man ahnt schon, wenn ja warum,???
|
Ich meine es gibt schon Indy 10 (schlagt mich, wenn ich mich irre!), aber allgemein gelten die Indies als die perfekte Wahl für die Netzwerkprogrammierung. Man hört selten Gegenteiliges.
|
|
donnerwurscht 
Hält's aus hier
Beiträge: 6
D7 Enterprise
|
Verfasst: Fr 04.02.05 00:11
Titel: sowas nütztg mir schon mehr ;-)
@ elite
mit sowas kann ich schon mehr anfangen...
"""ich hatte nur wieder den Gedanken im Kopf, dass man nach nur so kurzer Aufwärmphase vielleicht nicht alle Befehle und Code-Konstrukte überschaut, die notwendig sind."""
dein Gedanke ist völlig richtig, lol, ich blick net wirklich durch, ist auch kein wunder bei 7 tage abends ein wenig basteln, aber dadurch das ich ständig vor ---unlösbare----  Probleme gestellt werde, entsteht die Notwendigkeit, sich auch tatsächlich damit auseinanderzusetzen.
Und da ich mich in anderen Bereichen viel mit dem www auseinander setze, ist ein Chat natürlich viel lustiger für mich, als nochmal hallo welt zu ömmeln...
Ich schau einfach mich einfach nach Quelltexten mit vielen Kommentaren, und schau mir die genau an, was hat er gemacht, warum, was tuts, was kann man verändern...
so lern ich halt, bin der autodidakt in person............und indy 10 gibbet. hab ich mal in der delphi 2005 trial gesehn...
have a nice day...
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 04.02.05 16:00
ich hab alles mit tserver und clientsocket hinbekommen, aber ich möchte dich nicht mit meinem code erschlagen, der ist lang und unübersichtlich ^^
|
|
donnerwurscht 
Hält's aus hier
Beiträge: 6
D7 Enterprise
|
Verfasst: Sa 05.02.05 16:35
F34r0fTh3D4rk hat folgendes geschrieben: | ich hab alles mit tserver und clientsocket hinbekommen, aber ich möchte dich nicht mit meinem code erschlagen, der ist lang und unübersichtlich ^^ |
Ich versuch, gerade deinen code sinngemäß auf indy 9 umzumünzen, damit ich versteh was da passiert, blick aber noch net wirklich durch, bei indy scheint das anders zu sein....wie dem auch sei, herzlichen dank... ich geh grad nochma das benutzerhandbuch von delphi durch... ich brauch einfach mehr überblick....
|
|
der_zaehe
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: Sa 05.02.05 16:56
donnerwurscht hat folgendes geschrieben: |
is ne memo komponente gut für ne onlineanzeige oder soll ich was anderes nehmen? wenn ja warum?
|
Du willst eine Liste der user haben, die gerade online sind? Ich würde dir da eine ListBox empfehlen ,da sie einen unübersehbaren Listencharakter aufweist
Zur umsetzung:
Wie Narses weiter oben schon meinte: Du brauchst ein Protokoll. Ich bin selber erst vor 2 wochen in dieses forum eingetreten, auch ich hatte ein problem mit meinem ersten, eigenen chat, und auch mir hat narses mehrfach zu einem Protokoll geraten, siehe sein link weiter oben (danke narses für deine vielen mühen  ). Wenn du das eingebaut hast, kannst du dir gedenken über eine benutzerliste machen. Ich habe das problem so gelöst:
1. Wenn ein Client connected, bekommt er eine "Willkommen"-Nachricht und wird nach seinem Nick gefragt
2. Der Client schickt als Antwort seinen Nick.
3. Der Server hat eine Benutzerliste, die er updatet, und dann an alle Clients verschickt.
Näheres zum verschicken der liste:
ich mach das so, das ich in einen string erst das kennwort für die liste an den anfang schreib und danch, mit trennzeichen abgetrennt, die einzelnen namen, die ich dann zu meiner listbox hinzufüge.
ich hab das ganze übrigens nicht mit indy, sondern mir TClientSocket und TServerSocket geschrieben
_________________ [inspirationslos]
|
|
araX
      
Beiträge: 36
Win XP +SP2, Gentoo & Debian
D7 Enterp
|
Verfasst: Sa 05.02.05 17:10
Ich habe vor nem halben Jahr mal einen IRC-Bot geschrieben, und auch da musste ich erst
das IRC-Protokoll 'lernen'.
So ein Protokoll ist nun mal da A und O um eine sinnvolle und
unmißverständliche Kommunikation zwischen Server & Client zu realisieren.
P.S. Ich wollte nur die Aussagen meiner Vorredner untermauern
mfg araX
|
|
der_zaehe
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: Sa 05.02.05 23:24
unter www.delphi-forum.de/...35976&highlight= gibts jetzt mal mein grade eben fertig gewordenes protokoll zu sehn. Es funzt. d.h. ich hab noch keine bugs bemerkt  . So zum Beispiel könnte es dann auch bei dir aussehen.
_________________ [inspirationslos]
|
|
|