Autor Beitrag
DarkLord05
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 34

WinXP Pro, Win 2k3 ServEnt
D2k5 PE, VS 2005
BeitragVerfasst: Mo 09.05.05 13:55 
Naja, einfach überall noch listenen und dann vom server aus die nachrichten über den entsprechenden port rumschicken.
DarkLord05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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... :wink:

cu
Narses
DarkLord05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Fr 13.05.05 14:36 
du erwartest aber nicht im ernst, dass sich irgendjemand deine exe runterlädt und startet ? :roll:

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
der_zaehe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Fr 13.05.05 14:54 
user profile iconDarkLord05 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: Fr 13.05.05 15:21 
Ok, hier habe ich dann einen Teil vom Source Code…

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
{ Server: Wenn Client etwas schreint...}
procedure TMainWindow.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
NachrichtenMemo.Lines.Add(Socket.ReceiveText) and ServerSocket.Socket.Connections[0].SendText (Socket.ReceiveText);
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
{ Client: Wenn Server etwas schreibt...}
procedure TMainWindow.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
NachrichtenMemo.Lines.Add(Socket.ReceiveText);
end;
der_zaehe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: Fr 13.05.05 15:39 
user profile iconDarkLord05 hat folgendes geschrieben:

@ der_zaehe
Wenn du es nich angucken willst sage ich es eben^^:


??Hä??
was will mir das sagen??

user profile iconDarkLord05 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 :lol:



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:
ausblenden volle Höhe 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:
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);
    //Client:, !JoinChannel, Channelname, Nickname
    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;
    //Client:, !ChangeUsername, OldUsername, NewUsername, Channel 1, Channel 2, ..., Channel n
    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;
    //Client:, !ChangeUserrights, Channel, Sender, Username, Rights
    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
        //Server:, !Rights, Channelname, ChangeUsername
        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;
    //Client:, !Kick, Channelname, Sender, Username
    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;
    //Client:, !Text, Channelname, Sender, Text
    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;
    //Client:, !Close, Nickname, Channelname
    if TextRcv[1] = '!Close' then
    begin
      ChannelListe.DeleteUser(TextRcv.Strings[3],TextRcv.Strings[2]);
    end;
    //Client:, !Disconnect, Nickname;
    if TextRcv[1] = '!Disconnect' then
    begin
      Socket.SendText('Server:'+#1+'!ConfirmDisconnect');
    end;
    //Client:, !ShutdownClients, Channelname, Nickname
    if TextRcv[1] = '!ShutdownClients' then
    begin
    end;
    //...
  finally
    TextRcv.Free;
  end;
end;


die OnRead-Prozedur des Clients:
ausblenden volle Höhe 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:
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;
      //Client:, !Text, Channelname, Sender, Text
      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;
      //Server:, !Username, Username
      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;
      //Server:, !Rights, Channelname, ChangeUsername/KickUser
      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;
      //Server:, !Kick, Channelname, Sender, Username
      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;
      //Server:, !UserList, Channelname, Kommt/Geht/Refresh, Benutzername/AlterBenutzername,NeuerBenutzername , Benutzer 1,Benutzer 2,...,Benutzer n
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: 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:

ausblenden volle Höhe 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:
procedure TMainWindow.SendenButtonClick(Sender: TObject);
var Nachricht : String;
begin
{ Client }
if StatusLabel.Caption = '- CLIENT AKTIV -'
  then { AB HIER ÄNDERUNG #1}
  if NachrichtEdit.Text = ''
    then
     begin
      end
    else
     begin
        begin { BIS HIER #1}
end;
      ClientSocket.Socket.SendText('(C) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text);
     { NachrichtenMemo.Lines.add('(C) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text); }
      NachrichtEdit.Text := '';
        if NachrichtEdit.Text= '' then
            begin
              NachrichtEdit.Text := '';
            end;
end;
{ Server }
if StatusLabel.Caption = '- SERVER AKTIV -'
  then { AB HIER ÄNDERUNG #1}
   if NachrichtEdit.Text = ''
    then begin
      end else begin
       begin { BIS HIER #1}

    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{ LÖSCHEN #1}
  end;
end;
der_zaehe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: 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:
ausblenden volle Höhe 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:
procedure TMainWindow.SendenButtonClick(Sender: TObject);
var Nachricht : String;
begin
  { Client }
  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;
  { Server }
  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:
ausblenden 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
    { Client }
    if StatusLabel.Caption = '- CLIENT AKTIV -' then
    begin
      ClientSocket.Socket.SendText('(C) ' + NickNameEdit.Text + ': ' + NachrichtEdit.Text);
      NachrichtEdit.Text := '';
    end;
    { Server }
    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:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: Sa 14.05.05 14:38 
Ich finde meinen Quelltex verständlich :D
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: Sa 14.05.05 20:03 
Titel: Re: Nicht klar...
user profile iconDarkLord05 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.

user profile iconDarkLord05 hat folgendes geschrieben:

Was ich verstanden habe:
Wenn ich den Server aktiviere muss ich ZUSÄTZLICH einen Client aktivieren.
rischtisch.

user profile iconDarkLord05 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.

user profile iconDarkLord05 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.

user profile iconDarkLord05 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.


user profile iconDarkLord05 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.

user profile iconDarkLord05 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.

user profile iconDarkLord05 hat folgendes geschrieben:

Was ich verstanden habe:
Wenn ich den Server aktiviere muss ich ZUSÄTZLICH einen Client aktivieren.
rischtisch.

user profile iconDarkLord05 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.

user profile iconDarkLord05 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.

user profile iconDarkLord05 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.


user profile iconDarkLord05 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]

user profile iconDarkLord05 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
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++
BeitragVerfasst: So 15.05.05 09:07 
So, hier der Button wenn der Server Aktiviert wird:

ausblenden 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...

ausblenden volle Höhe 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:
{ Server: Wenn Client etwas schreibt...}
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;


{ Client: Wenn Server etwas schreint...}
procedure TMainWindow.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
NachrichtenMemo.Lines.Add(Socket.ReceiveText);
  {blinken}
  if BlinkenON = False then begin end else begin
    FlashWindow(Application.Handle, True);
  end;
  {sound}
  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" :D

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^^