| Autor |
Beitrag |
DarkLord05
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Mo 09.05.05 13:52
Hi, bin jetzt schon länger ma überlegen und ausprobieren, komm aber nicht drauf.
Wie erstelle ich mit den Sockets (ServerSocket und ClientSocket) einen Chat wo ALLE miteinander reden können?
Bei meinem können immer nur zwei Leute miteinander reden. BZW. alle mit dem Server.
(PS: Kann mir einer mal den DIREKTLINK zu der Deutschen Online-Hilfe schicken. Ich habe leider nur die Englische und find die Deutsche nicht.)
Danke schon mal...
|
|
xasx
      
Beiträge: 34
WinXP Pro, Win 2k3 ServEnt
D2k5 PE, VS 2005
|
Verfasst: Mo 09.05.05 13:55
Naja, einfach überall noch listenen und dann vom server aus die nachrichten über den entsprechenden port rumschicken.
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Mo 09.05.05 15:36
Danke... probier es gleich aus.
// EDIT
Habe das gerade mal versucht... aber irgendie wusste ich nicht genau was ich zum beispiel bei OnListen hinschreiben soll.
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Do 12.05.05 14:34
Kann mir dabei keiner helfen? Gibts hier denn keinen der sich in diesem Thema Profi nennen kann?
Bitte helfen...
PS: MUSS man den Server OPEN machen? Bei mri geht das auch so und wenn ich OPEN mache geht das oft nicht?!
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 12.05.05 22:41
Moin!
Du brauchst ein Protokoll, also eine Art "Kommunikationsvorschrift", auf deren Basis sich die Clients mit dem Server unterhalten. Beispiel:
Client: "He, Server! Moin, ich soll dir von meinem Benutzer sagen, er heißt 'Hermann'."
Server: "Alles klar, an alle: 'Hermann' hat den Chat betreten!"
Client: "Mein User, dieser 'Hermann', meint, dass 'Hello World!' ne total wichtige Nachricht wäre."
Server: "OK, wenn er´s sagt... An alle: 'Hermann' sagt 'Hello World!'"
Das ist jetzt zwar etwas sehr Otto-mäßig gehalten, trifft aber den Kern der Sache. Oder etwas "professioneller" ausgedrückt: du darfst nicht nur die Texte selbst übertragen, sondern auch Steuerinformationen, was denn sonst noch so passiert. Ach ja, und dass mit dem OnListen vergiss mal wieder; das läuft (fast) alles im OnRead-Event ab.
Für genauere Hilfe bräuchte ich dann schon etwas Code und konkrete Fragen, sonnst kann ich das Programm ja gleich selbst schreiben...
cu
Narses
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Fr 13.05.05 14:11
Es ist ja nicht so als hätte ich nix^^
Habe mein jetziges Programm mal in den Anhang gesteckt...
Ich brauch halt NUR wissen wie man die Nachrichten an alle schicken kann... das Problem ist ja auch bekannt... nur leider habe ich nirgends gesehen wie genau das für MEHR als 2 User geht...
Einloggen, um Attachments anzusehen!
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 13.05.05 14:36
du erwartest aber nicht im ernst, dass sich irgendjemand deine exe runterlädt und startet ? 
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
der_zaehe
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: Fr 13.05.05 14:37
ich nehm mal an, du hast bis jetzt einen benutzer den server erstellen lassen, der andere hat per client verbunden. jetzt musst du es so machen, das alle einen client haben, der server nur als vermittlung dient. des weiteren benötigst du, wie einer meiner vorredner dir schon gesagt hat, dringend ein protokoll.
die vermittlung würde dann so aussehen:
client sendet nachricht.
server empfängt sie, wenn es normaler chat ist wird sie an die betreffenden clients weitergesendet.
clients empfangen die nachricht.
_________________ [inspirationslos]
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Fr 13.05.05 14:46
@ retnyg
Warum... ist ja nur ein Chat?! Ich habe KEINEN hintergedanken....
@ der_zaehe
Wenn du es nich angucken willst sage ich es eben^^:
Ein Programm mit Knopf um das Prog zum Server oder zum Client zu machen...
Wenn man Server ist muss man den anderen eben die IP des eig. PCs geben (steht auch im Prog.). Der Client muss die IP eingeben und kann dann zu einem Server Connecten.
Wie meint ihr das mit Protokollen? TCP/IP ist doch ein Protokoll. Wird das nicht duch Server / Client Socket verwendet?
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 13.05.05 14:54
DarkLord05 hat folgendes geschrieben: | @ retnyg
Warum... ist ja nur ein Chat?! Ich habe KEINEN hintergedanken....
|
wer garantiert mir dafür ? und wie soll ich dir ohne source beim testen helfen können ?
das nächste mal poste lieber deine .dpr, .dfm, und.pas datei. dann kann man sich das angucken.
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Fr 13.05.05 15:08
Ähhm... ich habe nicht nur 5 min daran gearbeitet und jetzt soll ich meine ganze Source veröffentlichen....??? Ich weiß ja das ICH hilfe will...
PS: Falls du meinst das ich Viren oder sonst was hier "veröfentlichen" will, da liegts du auf jeden Fall falsch. Ich möchte ja in diesem Forum noch länger bleiben um zu helfen oder wie in diesem Fall um Hilfe zu bekommen. Und ihr öffnet ja auch die Daten die bei "Projekt veröffentlichen" drin sind. Und wenn es nur daran liegt das es EXE ist anstatt *.Zip oder *.RAR dann kann ich es auch Zippen... o.ä.
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Fr 13.05.05 15:21
|
|
der_zaehe
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: Fr 13.05.05 15:39
DarkLord05 hat folgendes geschrieben: |
@ der_zaehe
Wenn du es nich angucken willst sage ich es eben^^:
|
??Hä??
was will mir das sagen??
DarkLord05 hat folgendes geschrieben: | | Ähhm... ich habe nicht nur 5 min daran gearbeitet und jetzt soll ich meine ganze Source veröffentlichen....??? Ich weiß ja das ICH hilfe will... |
wird dir schon niemand deinen quelltext mopsen und illegal für seine zwecke weiterverarbeiten
mit protokoll ist nicht das transferprotokoll gemeint. ich habe schon so einen chat geschrieben, hab genauso angefangen wie du und mich dann schritt für schritt hochgearbeitet. (momentan bin ich bei der datenbankgestützten version, inklusice irc-mässigen channels, privat-chat, icq-ähnlicher benuterliste ... und all son zeug)
das protokoll könnte z.B. so aussehen:
normaler chat: Client:+#1+<Text>+#1+<Herkunfts-Channel>+#1+<Sender>+#1+<Text> (wird an betreffende Clients weitergeleitet
anmeldung: Client:+#1+Anmeldung+#1+<Benutzername>+#1+<Passwort>
nickname ändern: Client:+#1+NeuerNick+#1+<Benutzername>+#1+<NeuerBenutzername>
...
//edit: ich habe #1 verwendet, um den string anhand dieses trennzeichens zur zerlegen und zu verarbeiten.
wie das protokoll dann im detail aussieht, ist natürlich vollkommen dir überlassen
hier ist die OnClientRead-Prozedur des servers der letzten version meines chats:
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: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83:
| procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var TextRcv : TStringList; i : Integer; begin try TextRcv := TStringList.Create; TextRcv := self.Split(Socket.ReceiveText,#1); if TextRcv[1] = '!JoinChannel' then begin if NOT ChannelListe.FindChannel(TextRcv.Strings[2]) then begin ChannelListe.AddChannel(TextRcv[2]); ChannelListe.AddUser(TextRcv.Strings[2],TextRcv.Strings[3],'Protected',Socket); end else ChannelListe.AddUser(TextRcv.Strings[2],TextRcv.Strings[3],'Normal',Socket); end; if TextRcv[1] = '!ChangeUsername' then begin for i := 4 to TextRcv.Count-1 do begin ChannelListe.RefreshUserlist(TextRcv[i],TextRcv[2],TextRcv[3]); end; end; if TextRcv[1] = '!ChangeUserrights' then begin if ((((ChannelListe.GetUserRights(TextRcv[2],TextRcv[3]) = 'Admin') OR (ChannelListe.GetUserRights(TextRcv[2],TextRcv[3]) = 'Protected')) AND (TextRcv[5] <> 'Globaladmin') AND (TextRcv[3] <> TextRcv[4])) OR ((ChannelListe.GetUserRights(TextRcv[2],TextRcv[3]) = 'Globaladmin') AND (TextRcv[3] <> TextRcv[4]))) AND (ChannelListe.GetUserRights(TextRcv[2],TextRcv[4]) <> 'Protected') then ChannelListe.ChangeUserRights(TextRcv[2],TextRcv[4],TextRcv[5]) else Socket.SendText('Server:'+#1+'!Rights'+#1+TextRcv[2]+#1+'ChangeUsername'); if (ChannelListe.GetUserRights(TextRcv[2],TextRcv[3]) = 'Globaladmin') AND (TextRcv[3] <> TextRcv[4]) then ChannelListe.ChangeUserRights(TextRcv[2],TextRcv[4],TextRcv[5]) end; if TextRcv[1] = '!Kick' then begin if ((ChannelListe.GetUserRights(TextRcv[2],TextRcv[3]) = 'Protected') OR (ChannelListe.GetUserRights(TextRcv[2],TextRcv[3]) = 'Admin') OR (ChannelListe.GetUserRights(TextRcv[2],TextRcv[3]) = 'Globaladmin')) AND ((ChannelListe.GetUserRights(TextRcv[2],TextRcv[4]) <> 'Globaladmin') OR (ChannelListe.GetUserRights(TextRcv[2],TextRcv[4]) <> 'Protected')) AND (TextRcv[3] <> TextRcv[4]) then ChannelListe.KickUser(TextRcv[2],TextRcv[3],TextRcv[4]) else Socket.SendText('Server:'+#1+'!Rights'+#1+TextRcv[2]+#1+'KickUser') end; if TextRcv[1] = '!Text' then begin if ChannelListe.FindUserInChannel(TextRcv[2],TextRcv[3]) then if ChannelListe.GetUserRights(TextRcv[2],TextRcv[3]) <> 'Mute' then ChannelListe.SendToChannel(TextRcv.Strings[2],self.SetzeZusammen(TextRcv,#1)); end; if TextRcv[1] = '!Close' then begin ChannelListe.DeleteUser(TextRcv.Strings[3],TextRcv.Strings[2]); end; if TextRcv[1] = '!Disconnect' then begin Socket.SendText('Server:'+#1+'!ConfirmDisconnect'); end; if TextRcv[1] = '!ShutdownClients' then begin end; finally TextRcv.Free; end; end; |
die OnRead-Prozedur des Clients:
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: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182:
| procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket); var TextRcv: TStringList; g,Index: Integer; LPrivateForm: TForm2; Aktion : String; label Schleifenende; begin TextRcv := TStringList.Create; try TextRcv := self.Split(Socket.ReceiveText,#1); g := -1; while g < TextRcv.Count-1 do begin inc(g); if (TextRcv[g] = 'Client:') OR (TextRcv[g] = 'Server:') then begin Aktion := ''; goto Schleifenende; end; if TextRcv[g] = '!Text' then begin if FensterListe.IndexOf(TextRcv[g+1]) = -1 then begin LPrivateForm := TForm2.create(Form1); LPrivateForm.Caption := 'ZChat 2.0 - '+TextRcv[2]; LPrivateForm.ChannelName := TextRcv[2]; LPrivateForm.Form1 := self; LPrivateForm.Top := Top+PY; inc(PY,10); LPrivateForm.Left := Left-2*Width-10-LPrivateForm.Left-PX; inc(PX,10); if PY > Screen.Height-LPrivateForm.Height then begin PY := 0; PX := 0; end; LPrivateForm.show; LPrivateForm.MemoEingabe.SetFocus; FensterListe.AddObject(TextRcv[2],LPrivateForm) end; Index := FensterListe.IndexOf(TextRcv[g+1]); TForm2(FensterListe.Objects[Index]).SchreibeChat(TextRcv[g+2],TextRcv[g+3],TRUE); inc(g,3); Aktion := ''; goto Schleifenende; end; if TextRcv[g] = '!Username' then begin ShowMessage('Der Nickname " '+TextRcv[g+1]+' " ist in diesem Channel schon vorhanden'+#13+#10+'oder ein geschütztes Protollschlüsselwort.'); inc(g); Aktion := ''; goto Schleifenende; end; if TextRcv[g] = '!Rights' then begin Index := FensterListe.IndexOf(TextRcv[g+1]); TForm2(FensterListe.Objects[Index]).SchreibeChat('Server','Dazu sind Sie nicht berechtigt!',TRUE); inc(g,2); Aktion := ''; goto Schleifenende; end; if TextRcv[g] = '!Kick' then begin Index := FensterListe.IndexOf(TextRcv[g+1]); TForm2(FensterListe.Objects[Index]).SchreibeChat(TextRcv[g+2],TextRcv[g+3]+' wurde gekickt.',TRUE); if TextRcv[g+3] = LabeledEditNick.Text then begin TForm2(FensterListe.Objects[Index]).Free; FensterListe.Delete(Index); end; inc(g,2); Aktion := ''; goto Schleifenende; end; if TextRcv[g] = '!UserList' then begin if FensterListe.IndexOf(TextRcv[g+1]) = -1 then begin LPrivateForm := TForm2.create(Form1); LPrivateForm.Caption := 'ZChat 2.0 - '+TextRcv[g+1]; LPrivateForm.ChannelName := TextRcv[g+1]; LPrivateForm.Form1 := self; LPrivateForm.Top := Top+PY; inc(PY,10); LPrivateForm.Left := Left-2*Width-10-LPrivateForm.Left-PX; inc(PX,10); if PY > Screen.Height-LPrivateForm.Height then begin PY := 0; PX := 0; end; LPrivateForm.show; LPrivateForm.MemoEingabe.SetFocus; FensterListe.AddObject(LPrivateForm.ChannelName,LPrivateForm) end; Index := FensterListe.IndexOf(TextRcv[g+1]); TForm2(FensterListe.Objects[Index]).ListBoxLeute.Clear; TForm2(FensterListe.Objects[Index]).ListeLeute.Clear; if TextRcv[g+2] = 'Kommt' then begin TForm2(FensterListe.Objects[Index]).SchreibeChat(TextRcv.Strings[g+3],TextRcv.Strings[g+3]+' hat den Channel betreten.',TRUE); inc(g,3); Aktion := 'SchreibeListe'; goto Schleifenende; end; if TextRcv[g+2] = 'Geht' then begin TForm2(FensterListe.Objects[Index]).SchreibeChat(TextRcv.Strings[g+3],TextRcv.Strings[g+3]+' hat den Channel verlassen.',TRUE); inc(g,3); Aktion := 'SchreibeListe'; goto Schleifenende; end; if TextRcv[g+2] = 'Refresh' then begin TForm2(FensterListe.Objects[Index]).SchreibeChat(TextRcv.Strings[g+3],TextRcv.Strings[g+3]+' ist jetzt '+TextRcv.Strings[5]+' .',TRUE); inc(g,4); Aktion := 'SchreibeListe'; goto Schleifenende; end; if TextRcv[g+2] = 'Rights' then begin inc(g,3); Aktion := 'SchreibeListe'; goto Schleifenende; end; end; if TextRcv[g] = '!ConfirmDisconnect' then begin Client.Close; if Server.Active then begin Server.Close; ChannelListe.Free end; goto Schleifenende; end; if Aktion = 'SchreibeListe' then begin if TextRcv[g+1] = 'Normal' then begin TForm2(FensterListe.Objects[Index]).ListBoxLeute.AddItem(TextRcv[g],nil); TForm2(FensterListe.Objects[Index]).ListeLeute.Add(TextRcv[g]) end else if TextRcv[g+1] = 'Admin' then begin TForm2(FensterListe.Objects[Index]).ListBoxLeute.AddItem(TextRcv[g]+' [A]',nil); TForm2(FensterListe.Objects[Index]).ListeLeute.Add(TextRcv[g]) end else if TextRcv[g+1] = 'Protected' then begin TForm2(FensterListe.Objects[Index]).ListBoxLeute.AddItem(TextRcv[g]+' [PA]',nil); TForm2(FensterListe.Objects[Index]).ListeLeute.Add(TextRcv[g]) end else if TextRcv[g+1] = 'Mute' then begin TForm2(FensterListe.Objects[Index]).ListBoxLeute.AddItem(TextRcv[g]+' [M]',nil); TForm2(FensterListe.Objects[Index]).ListeLeute.Add(TextRcv[g]) end else if TextRcv[g+1] = 'Globaladmin' then begin TForm2(FensterListe.Objects[Index]).ListBoxLeute.AddItem(TextRcv[g]+' [-=GA=-]',nil); TForm2(FensterListe.Objects[Index]).ListeLeute.Add(TextRcv[g]) end; inc(g); end; Schleifenende: end; finally TextRcv.Free; end; end; |
_________________ [inspirationslos]
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Fr 13.05.05 18:19
| Zitat: | DarkLord05 hat folgendes geschrieben:
@ der_zaehe
Wenn du es nich angucken willst sage ich es eben^^:
??Hä??
was will mir das sagen?? |
schätze ich hab mich verschrieben^^ lol
Danke für deine Hilfe, werde es mir mal angucken. Das mit dem String zerteilen habe ich mir auch gerade angeguckt^^ da ich ein Feld machen wollte, wo alle benutzer, die beim Server drin sind, stehen.
| Zitat: | | wird dir schon niemand deinen quelltext mopsen und illegal für seine zwecke weiterverarbeiten |
Ob nun legal oder illegal... wenn du dir die Exe anguckst dann weißt du warum^^ Da habe ich schon so viele Pfehler ^^ verbessert und das Programm verändert. Habe auch ein eigenes Optionsmenü (das war mein 1. überhaupt^^).
Wenn es sich mal einer anguckt... würde ich gerne wissen was er davon hält (PN oder E-Mail please)
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Sa 14.05.05 12:03
Was muss ich bei meinem "SENDEN" Button ändern, so das die Nachricht an ALLE Clients geht? Es muss doch sicher hier irgendwo ein kleinen Fehler geben....
Mein bisheriger "SENDEN" Button sah so aus:
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:
| procedure TMainWindow.SendenButtonClick(Sender: TObject); var Nachricht : String; begin
if StatusLabel.Caption = '- CLIENT AKTIV -' then if NachrichtEdit.Text = '' then begin end else begin begin end; ClientSocket.Socket.SendText('(C) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtEdit.Text := ''; if NachrichtEdit.Text= '' then begin NachrichtEdit.Text := ''; end; end;
if StatusLabel.Caption = '- SERVER AKTIV -' then if NachrichtEdit.Text = '' then begin end else begin begin
ServerSocket.Socket.Connections[0].SendText('(S) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtenMemo.Lines.add('(S) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtEdit.Text := ''; if NachrichtEdit.Text = '' then begin NachrichtEdit.Text := ''; end; end; end; end; |
|
|
der_zaehe
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: Sa 14.05.05 14:32
client-seitig musst du gar nichts ändern, nur beim server. ich hab mir jetzt mal probiert deien quelltext durchzulesen, aber du hast ihn so merkwürdog formatiert, das ich nichts gerafft habe
hab ihn dann erst ein mal in eine etwas lesbarere form gebracht:
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:
| procedure TMainWindow.SendenButtonClick(Sender: TObject); var Nachricht : String; begin if StatusLabel.Caption = '- CLIENT AKTIV -' then if NachrichtEdit.Text = '' then begin end else begin begin end; ClientSocket.Socket.SendText('(C) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtEdit.Text := ''; if NachrichtEdit.Text= '' then begin NachrichtEdit.Text := ''; end; end; if StatusLabel.Caption = '- SERVER AKTIV -' then if NachrichtEdit.Text = '' then begin end else begin begin ServerSocket.Socket.Connections[0].SendText('(S) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtenMemo.Lines.add('(S) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtEdit.Text := ''; if NachrichtEdit.Text = '' then begin NachrichtEdit.Text := ''; end; end; end; end; |
ich hoff mal, ich hab ales richtig formatiert. dieser code lässt sich dann auf das hier zusammenkürzen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TMainWindow.SendenButtonClick(Sender: TObject); var Nachricht : String; begin if NachrichtEdit.Text <> '' then begin if StatusLabel.Caption = '- CLIENT AKTIV -' then begin ClientSocket.Socket.SendText('(C) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtEdit.Text := ''; end; if (StatusLabel.Caption = '- SERVER AKTIV -') then begin ServerSocket.Socket.Connections[0].SendText('(S) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtenMemo.Lines.add('(S) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtEdit.Text := ''; end; end; end; |
so ist besser verständlich, was du da eigentlich machst. vorher gab es 2 oder 3 leere begin end blöcke und andere merkwürdige dinge.
was du jetzt verändern musst ist folgendes:
wenn du dein programm als client startest, muss nur ein client erstellt werden. als server brauchst du einen client und einen server. für beide versionen hast du diese sende-prozedur:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TMainWindow.SendenButtonClick(Sender: TObject); var Nachricht : String; begin if NachrichtEdit.Text <> '' then begin ClientSocket.Socket.SendText('(C) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); NachrichtEdit.Text := ''; end; end; |
der server muss jetzt nicht mehr machen, als die eingehende chat-nachrichten an alle clients weiterleiten:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var buffer : String; begin buffer := Socket.ReceiveText; for i := 0 to Server.Socket.ActiveConnections-1 do if Server.Socket.Connections[i].Connected then Server.Socket.Connections[i].SendText(buffer) end; |
wie du siehst: der server selber verschickt nur noch das, was er von den clients bekommt, nichts mehr was du getippt hast.
_________________ [inspirationslos]
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Sa 14.05.05 14:38
Ich finde meinen Quelltex verständlich
Ist halt ansichtssache (und ich habe ihn ja auch geschrieben^^)
Vielen Danke. Werde es sofort ausprobieren und nacher mal sagen ob's geklapp hat *rfg*.
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: Sa 14.05.05 19:15
Titel: Nicht klar...
Also mir ist da eine Sache nicht klar, bzw. habe Probleme /Fehler:
"i" bei deiner Lösung soll Integer sein (wenn ich das richtig verstanden habe...) da es nicht angegeben wurde.
Was ich verstanden habe:
Wenn ich den Server aktiviere muss ich ZUSÄTZLICH einen Client aktivieren.
Problem:
Habe als Adresse des Clients meine eigene genommen (127.0.0.1)
Da beide über den gleichen Socket laufen (müssen) gibt es eine Fehlermeldung.
So kann ich zwar einen Server starten, erhalte aber sofort eine kleine Fehlermeldung:
Asynchronous socket error 10049.
Da der socket ja schon belegt ist.
Wo ist da der Fehler?
Der Client erhält auch alle Nachrichten die er SELBER verschickt.
Aber wenn der Server etwas schreibt passiert rein gar nichts.
Wie soll ich außerdem die Senden Function die du gesagt hast dem Client AUCH geben?
|
|
der_zaehe
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: Sa 14.05.05 20:03
Titel: Re: Nicht klar...
DarkLord05 hat folgendes geschrieben: | Also mir ist da eine Sache nicht klar, bzw. habe Probleme /Fehler:
"i" bei deiner Lösung soll Integer sein (wenn ich das richtig verstanden habe...) da es nicht angegeben wurde. |
jap, hab ich vergessen reinzuschreiben, tschuldigung.
DarkLord05 hat folgendes geschrieben: |
Was ich verstanden habe:
Wenn ich den Server aktiviere muss ich ZUSÄTZLICH einen Client aktivieren. |
rischtisch.
DarkLord05 hat folgendes geschrieben: |
Problem:
Habe als Adresse des Clients meine eigene genommen (127.0.0.1) |
passt doch so weit!
Da beide über den gleichen Socket laufen (müssen) gibt es eine Fehlermeldung.
DarkLord05 hat folgendes geschrieben: |
So kann ich zwar einen Server starten, erhalte aber sofort eine kleine Fehlermeldung:
Asynchronous socket error 10049.
Da der socket ja schon belegt ist.
Wo ist da der Fehler?
|
hier versteh ich dich nicht ganz. wie wärs, wenn du den betreffenden quellcode einfach mal komplett hier reinstellst? dann kann ich das selber durchlesen, testen, und habs ziemlich bald raus, was da net stimmt.
DarkLord05 hat folgendes geschrieben: |
Der Client erhält auch alle Nachrichten die er SELBER verschickt.
|
klar, so ist es gedacht. wär ja blöd, wenn man nur das sieht, was die anderen schreiben, aber nicht man selber.
DarkLord05 hat folgendes geschrieben: |
Aber wenn der Server etwas schreibt passiert rein gar nichts. |
nochmal: der server schreibt rein gar nichts. nur die clients schreiben. der server hat nur die funktion, zwischen den einzelnen clients die brücke herzustellen.
DarkLord05 hat folgendes geschrieben: | Also mir ist da eine Sache nicht klar, bzw. habe Probleme /Fehler:
"i" bei deiner Lösung soll Integer sein (wenn ich das richtig verstanden habe...) da es nicht angegeben wurde. |
jap, hab ich vergessen reinzuschreiben, tschuldigung.
DarkLord05 hat folgendes geschrieben: |
Was ich verstanden habe:
Wenn ich den Server aktiviere muss ich ZUSÄTZLICH einen Client aktivieren. |
rischtisch.
DarkLord05 hat folgendes geschrieben: |
Problem:
Habe als Adresse des Clients meine eigene genommen (127.0.0.1) |
passt doch so weit!
Da beide über den gleichen Socket laufen (müssen) gibt es eine Fehlermeldung.
DarkLord05 hat folgendes geschrieben: |
So kann ich zwar einen Server starten, erhalte aber sofort eine kleine Fehlermeldung:
Asynchronous socket error 10049.
Da der socket ja schon belegt ist.
Wo ist da der Fehler?
|
hier versteh ich dich nicht ganz. wie wärs, wenn du den betreffenden quellcode einfach mal komplett hier reinstellst? dann kann ich das selber durchlesen, testen, und habs ziemlich bald raus, was da net stimmt.
DarkLord05 hat folgendes geschrieben: |
Der Client erhält auch alle Nachrichten die er SELBER verschickt.
|
klar, so ist es gedacht. wär ja blöd, wenn man nur das sieht, was die anderen schreiben, aber nicht man selber.
DarkLord05 hat folgendes geschrieben: |
Aber wenn der Server etwas schreibt passiert rein gar nichts. |
nochmal: der server schreibt rein gar nichts. nur die clients schreiben. der server hat nur die funktion, zwischen den einzelnen clients die brücke herzustellen.[/quote]
DarkLord05 hat folgendes geschrieben: |
Wie soll ich außerdem die Senden Function die du gesagt hast dem Client AUCH geben? |
vielleicht hab ich mich ein bissel missverständlich ausgedrückt: nicht AUCH dem client, NUR dem client. die prozeduren sehen genau so aus, wie ich sie oben hingeschrieben hab (abgesehen natürlich von der fehlenden deklaration von i  )
also: stell mal deinen problembehafteten code hier rein. und: keine sorge, niemand will dir deine arbeit stehlen. hier wirst du geholfen, nicht beklaut.
_________________ [inspirationslos]
|
|
DarkLord05 
      
Beiträge: 449
WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
|
Verfasst: So 15.05.05 09:07
So, hier der Button wenn der Server Aktiviert wird:
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:
| procedure TMainWindow.ServerONButtonClick(Sender: TObject); begin
if ClientON = True then begin ShowMessage ('FEHLER #1: Client ist Aktiv'); end else begin if NickNameEdit.Text = '' then begin ShowMessage ('FEHLER #5: Kein Nickname angegeben'); end else begin ClientSocket1.Active := True; ServerSocket.Active := True; ConnectionEdit.Visible := True; Servererstellen1.Enabled := False; ServerSchlieen1.Enabled := True; IPEdit.Visible := False; SpeedButton2.Visible := False; NickNameEdit.Enabled := False; ServerON := True; end end end; |
Hier nochmal wenn der Server etwas schreibt und wenn der Client etwas schreibt...
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:
| procedure TMainWindow.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); var buffer : String; i : Integer; begin buffer := Socket.ReceiveText; for i := 0 to ServerSocket.Socket.ActiveConnections-1 do if ServerSocket.Socket.Connections[i].Connected then ServerSocket.Socket.Connections[i].SendText(buffer) end;
procedure TMainWindow.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin NachrichtenMemo.Lines.Add(Socket.ReceiveText); if BlinkenON = False then begin end else begin FlashWindow(Application.Handle, True); end; if SoundON = False then begin end else begin if EigSoundON = True then begin SndPlaySound(SoundChar, SND_ASYNC ); end else begin PlaySound(PChar('MsgSound'), hInstance, Snd_Resource Or Snd_Async Or Snd_Nodefault); end end; end; |
Hoffe du kannst den Code "entschlüsseln"
| Zitat: |
DarkLord05 hat folgendes geschrieben:
Also mir ist da eine Sache nicht klar, bzw. habe Probleme /Fehler:
"i" bei deiner Lösung soll Integer sein (wenn ich das richtig verstanden habe...) da es nicht angegeben wurde.
jap, hab ich vergessen reinzuschreiben, tschuldigung. |
Macht ja nix^^
|
|
|