Autor Beitrag
noctua
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: Do 04.11.04 20:29 
ich hab ein kleiners problem mit meinem chatpinger

ich habe das jetzt so gemacht das der client nach dem einloggen einen ping sendet (das bedeutet er möchte die liste mit allen namen die es im chat gibt). wenn der server den Ping empfängt sendet er an alle clients nochmal einen Ping. wenn der client jetzt einen ping empfängt dan senden alle clients ihren nick mit einem 'pong' davorstehend. wenn der server jetzt diesen 'pong' empfängt sendet er diesen (den pong mit nick "pongNICK") nun wieder an alle clients und diese legen jetzt den angehängten Nick in ihr Memo2.


also hier sendet der client seinen ping
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure PingSenden(ping: string);
begin
  SendText('ping' + ping);                     //die procedur um den ping zu senden
end;


procedure TForm1.verbinden1Click(Sender: TObject);
  var i : integer;
begin
  client.Active := true;                 // der client geht online

    statusbar1.Panels[1].Text := 'paswortabfrage';
        for i := 1 to 100000 do                        //der client wartet ne kleine weile
        Application.ProcessMessages;

  PingSenden(uUserverbindung.Userverbindung.Edit1.Text);          // der ping wird gesendet (mit Nick anhang)

end;



hier empfängt der server den ping
ausblenden 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:
procedure IfTypmsgPing(text: string; i :integer);
begin
    for i:=0 to Form1.Server.Socket.ActiveConnections-1 do
      begin
        Form1.Server.Socket.Connections[i].SendText(text);        //senden des pinges mit Nickanhang
      end;

end;

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
  var msg, typmsg: string;
  var i: integer;
begin
  msg := Socket.ReceiveText;
  typmsg := msg[1]+msg[2]+msg[3]+msg[4];            //hier steht der anfang / also 'ping'


  if typmsg = 'ping' then        //guckt ob es ein ping ist
  IfTypmsgPing(msg,0);




end;




nun bekommt der client den ping
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure PingEmpfangen(ping: string);
begin
  sendText('pong' + uUserverbindung.Userverbindung.Edit1.Text);     //nun wird der pong mit Nick anhang gesendet
  form1.Memo2.Text := '';                    // der bereich wo die Nick's hin kommen wird leehr gemacht da neue kommen
end;

procedure TForm1.clientRead(Sender: TObject; Socket: TCustomWinSocket);
  var msg, typmsg: string;
begin
  msg := Socket.ReceiveText;
  typmsg := msg[1]+msg[2]+msg[3]+msg[4];

  if typmsg = 'ping' then        
  begin
  PingEmpfangen(msg);
  end;

end;



nun bekommt der server den pong
ausblenden 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:
procedure IfTypmsgPong(text: string; i :integer);
begin

    for i:=0 to Form1.Server.Socket.ActiveConnections-1 do
      begin
        Form1.Server.Socket.Connections[i].SendText(text);      //sendet den pong an alle klients
      end;

end;

procedure TForm1.ServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var msg, typmsg, arria: string;
  var i: integer;
begin
  msg := Socket.ReceiveText;
  typmsg := msg[1]+msg[2]+msg[3]+msg[4];


  if typmsg = 'pong' then        //abfrage nach dem MSGtypen / wenn userliste
  IfTypmsgPong(msg,0);


end;


der client stellt alle nicks rein
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure PongEmpfangen(pong: string);
begin
  Delete(pong, 1, 4);
  Form1.Memo2.Lines.Add(pong);            //der nick wird ins Memo2 gepackt
end;


procedure TForm1.clientRead(Sender: TObject; Socket: TCustomWinSocket);
  var msg, typmsg: string;
begin
  msg := Socket.ReceiveText;
  typmsg := msg[1]+msg[2]+msg[3]+msg[4];

  if typmsg = 'pong' then        //abfrage nach dem MSGtypen / wenn Ping /userliste
  begin
    PongEmpfangen(msg);
  end;

end;


nach deisem ganzen code gewirrwar hoffe ich blickt noch jemand durch,

naja auf jeden fall ist ist das problem das der client, der sich als letztes einloggt nicht alle Nicks bekommt sondern nur seinen

vieleicht kann mir einer sagen wie ich das besser machen kann .... danke


sry aber ich wusste nicht ob ich jetzt einen neuen thread aufmachen sollte oder in den alten schreiben, aber da mir ma gesagt wurde das ich für jede frege nen neuen amchen soll hab ichs gemacht :D

_________________
Am ende sterben eh alle ................
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 04.11.04 20:59 
noctua hat folgendes geschrieben:
nach dem einloggen einen ping sendet (das bedeutet er möchte die liste mit allen namen die es im chat gibt). wenn der server den Ping empfängt sendet er an alle clients nochmal einen Ping. wenn der client jetzt einen ping empfängt dan senden alle clients ihren nick mit einem 'pong' davorstehend. wenn der server jetzt diesen 'pong' empfängt sendet er diesen (den pong mit nick "pongNICK")

Findest du das nicht geringfügig umständlich? :roll:
Warum sendet der Client nicht direkt nach dem Einloggen einmal seine eigenen Daten an den Server, woraufhin der Server gleich alle Clients auf den neuesten Stand der Dinge bringt?
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: Do 04.11.04 21:06 
naja weil das nich wirklich so gehen kan (hab auch dran gedacht) aber wen der gleich seienn nick sendet dan haben zwar alle jetzt seinen nick angehängt aber wenn jetzt einer aus der mitte verscvhwidet kann man den nicht einzelnd wegnehmen also muss man die ganze liste auf einmal erneuern.

_________________
Am ende sterben eh alle ................
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 04.11.04 22:17 
noctua hat folgendes geschrieben:
aber wenn jetzt einer aus der mitte verscvhwidet kann man den nicht einzelnd wegnehmen also muss man die ganze liste auf einmal erneuern.

Also erstmal ging es ja nur um das Hinzufügen von Clients. Das ist mit genannter Methode gut möglich. Aber wo siehst du jetzt in deinem Einwand das Problem? Es ist doch nur wichtig, dass auf dem Server die korrekte, aktuelle Liste liegt. Sobald sich etwas an der Liste ändert (neuer Client, Client disconnected etc..) wird einfach die komplette Liste an alle (noch) aktiven Clients gesendet. So what?
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: Do 04.11.04 23:08 
naja ok klingt gut aber wie soll ich den alle Nicks auf einmal senden b.z.w wie soll ich sie auffangen? also in arrays das is klar aber wie gehts das mit der zeit so das er so lange wartet bis er alle hat bis er anfängt zu senden.

_________________
Am ende sterben eh alle ................
endeffects
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Fr 05.11.04 13:33 
hmm, also sofern du hier mit einem standart ping arbeitest,
möchte ich dir zu bedenken geben das möglicherweise
diese pings nicht von jedem user beantwortet werden,
bei vielen router gibt es die funktion auf ping anfragen
nicht zu antworten, sollte das also auf die arbeitsweise
deiner client/server konstruktion zutreffen solltest
du dir evtl einen anderen weg ausdenken dies zu realisieren
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: Fr 05.11.04 14:00 
hmm ... naja aber ich habe den chat ja auf meinem rechner getestet und einen text kann ich ja senden also müsste doch auch der ping gehen is ja auch nur ein text, aber er will nich :'(
das problem is ja das es funktioniert aber eben der typ der sich einloggt nur seinen nick bekommt und nicht die der anderen (wobei die, die länger eingeloggt sind alle bekommen)


ich komm einfach nicht weiter :'( wo is den mein fehler?

_________________
Am ende sterben eh alle ................
endeffects
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Fr 05.11.04 14:32 
ich versteh nicht so ganz warum du die userverwaltung nicht dem server überläßt,
dieser sendet in regelmäßigen ein kommando/string ("ping") auf das der client antworten muss,
jeder der sich einwählt bekommt vom server die aktuelle userlist, wenn nun ein
user auf den "ping" nicht reagiert wird die userliste auf dem server aktualisiert
und der server sendet den namen des nutzers der den chat verlassen hat an alle clients,
die dann ihrerseits ihre listen aktualisieren
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 05.11.04 14:37 
Genau so (bzw. so ähnlich) sehe ich das auch. Dein System ist einfach zu umständlich und fehlernafällig, Noctua. Am besten ist es gerade bei Netzwerkkommunikation vorher haargenau zu überlegen, wie man alles mit möglichst wenig Signalen bewerkstelligt. Und das funzt auf jeden Fall besser, wenn du es so machst wie endeffects und ich es vorschlagen.
endeffects
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Fr 05.11.04 14:47 
ergänzend möchte ich noch erwähnen das du mit deiner methode
türen und toren öffnest für einen möglichen angreifer,
der dein chatnetzwerk zum absturz bringen kann (ping-floods)
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: Fr 05.11.04 15:06 
hmm .... naja ok ich glaub ihr habt mich überzeugt. naja ich werd es ma probieren. aber wie mach ich das mit dem speichern der Nicks auf dem server?

ich dachte das ich n array mache und wenn sich einer einloggt wird sein nick im array angehängt und die liste wird dan bei jeder acctualisierung an alle gesendet .

jetzt weiss ich aber nicht was ich machen soll wen jetzt einer aus der mitte verschindet dan is da doch ein lehres feld und wenn ich die lehren felder immer ignoriere und die neuen einfach anhänge wird das array ja RIESIG ... habt ihr da vieleicht auch ne idee? weill sonnst find ich habt ihr mich voll überzeugt, danke für die idee :D

_________________
Am ende sterben eh alle ................
endeffects
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Fr 05.11.04 16:04 
naja, ich weiß ja nicht welche Dimensionen das annehmen soll,
aber anfänglich sollte eine Stringliste genügen die keine doppelten
Einträge zuläßt, damit ist es relativ simpel Einträge hinzuzufügen
oder zu entfernen

es ist übrigends nicht notwendig ständig die liste komplett an alle
Clients zu übertragen, wenn du den clients aus chat x darüber informierst
das user z den chat betreten bzw verlassen hat sollte das ausreichen,
das spart nicht nur traffic sondern macht es dir einfacher den entsprechenden
Client über die Veränderung zu informieren