Autor Beitrag
Markos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Di 31.12.02 18:40 
Hi !

Mit meinem Client sende ich folgendes an den Server :
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
   if TestClientSocket.Active then
      begin
        memReceive.Lines.Append(Edit2.Text + ': ' + memSend.Text);
        TestClientSocket.Socket.SendText('KOMMANDO1');      
        TestClientSocket.Socket.SendText(Edit2.Text);        // NAME
        TestClientSocket.Socket.SendText(Edit3.Text');       // Anzahl Points
        TestClientSocket.Socket.SendText(Edit4.Text');       // Anzahl Player
        TesttClientSocket.Socket.SendText('END');
      end;

Wie kann ich nun in der Server Applikation das realisieren das er :

a) Kommando01 bis END liest
b) mehrere Anfragen können gleichzeit vom Client kommen, somit muss der TServerSocket z.b. 20 Anfragen wie oben beschrieben gleichzeitig bearbeiten.

Unter der Lasche Indy Misc gibt es die Komponente IdThreadMgrDefault. Diese kann man mit dem IdTCPServer im Objektmanager mit ThreadMgr verbinden. Wie ich das nun löse mit den gleichzeitigen empfangen von Daten von mehreren Clients weiß ich aber nicht.

Bin für jeden Tip dankbar. Es gibt da die Möglichkeit etwas mit Threading zu machen. Vielleicht kann mir das jemand genauer erklären und wie man das im TServerSocket.OnClientRead ?!? einfügen kann. Danke.

Gruß
Markos
Markos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Di 31.12.02 18:43 
Titel: TServerSocket - HILFE [Nachtrag]
Mir ist aufgefallen das bei der Übertragung zum "HOST" auch mal Zeilen verloren gehen wenn man z.B 4 Zeilen sendet. Statt :

KOMMANDO1
1000
10
END

kommt auch mal folgendes

KOMMANDO1
1000

Der Rest fehlt dann :( Vielleicht hat dafür jemand auch eine Lösung. Leider gibt es zu dieser Thematik keine richtigen Tutorials oder FAQ's.
patmann2001
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: Do 02.01.03 22:24 
Hi
Warum da was fehlt, kann ich Dir leider auch nicht sagen, aber warum sendest Du 4 mal etwas, was auch in eine Zeile passen würde?
Sende doch eine Zusammengesetzten String und verwende Trennzeichen. Der Server kann das dann doch einfach durchparsen. Dann geht auch nichts verloren. Wenn Du dann noch ein Application.Processmessages anfügst, dann kann es auch nicht so einfach passieren, das Du mehrere Packte in einander schreibst.

cu Patmann
Markos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Fr 03.01.03 20:48 
Hi Patmann2001,

danke für den Tip. Dies habe ich nun eingebaut. Ein TTimer sendet alle 50ms, wenn sich der Char auf der Map X oder Y Koordinate geändert hat folgendes an den Server :

CHROS|30044|400|200|

1. KOMMAND CHAR POSITION FÜR DEN HOST
2. REGISTATRIONSNUMMER EINMALIG
3. POSITION X
4. POSITION Y

Ich erhalte folgende Fehlermeldung ab und zu als Popup:

Access Violation at address 0040430A in module "antalia_host.exe", Write of address 00472EF4.

Ich kann den Timer auch auf 1000 ms einstellen, trotzdem generiert der Host diese sporadisch.

Der Source Code im Client sieht wie folgt aus :

ausblenden volle Höhe 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:
procedure TForm1.PositionTimerTimer(Sender: TObject);
var WriteText : String;
begin
  IF playerpossendx = player.position.X THEN
  BEGIN
    IF playerpossendy = player.position.Y THEN
    BEGIN
      EXIT;
    END
    ELSE
    BEGIN
    //Senden der Position des eigenen Chars
    if ChatClientSocket.Active then
      begin
        WriteText:='CHRPOS'+'|'+Edit3.Text+'|'+IntToStr(mapfilex)+IntToStr(mapfiley)+
        '.map'+'|'+IntToStr(player.position.x)+'|'+IntToStr(player.position.y)+'|'+'END'+'|'+#13#10;
        ChatClientSocket.Socket.SendText(WriteText);
        Application.Processmessages;
        playerpossendx:=player.position.x;
        playerpossendy:=player.position.y;
      end;
    END;
  END;

  IF playerpossendy = player.position.y THEN
  BEGIN
    IF playerpossendx = player.position.x THEN
    BEGIN
      EXIT;
    END
    ELSE
    BEGIN
    //Senden der Position des eigenen Chars
    if ChatClientSocket.Active then
      begin
        WriteText:='CHRPOS'+'|'+Edit3.Text+'|'+IntToStr(mapfilex)+IntToStr(mapfiley)+
        '.map'+'|'+IntToStr(player.position.x)+'|'+IntToStr(player.position.y)+'|'+'END'+'|'+#13#10;
        ChatClientSocket.Socket.SendText(WriteText);
        Application.Processmessages;
        playerpossendx:=player.position.x;
        playerpossendy:=player.position.y;
      end;
    END;
  END;

end;


Das Interessant daran ist das der HOST die Fehlermeldung nur generiert, wenn ich beim Client die Cursortaste egal welche z.b. links für 10-15 sek. gedrückt halte. Dann kommt der Host mit der Verarbeitung anscheind nicht klar... Vielleicht kannst Du mir oder jeamand anders weiterhelfen.

Bisher bin ich mit dieser Art der Kommunikation zwischen Client und HOST nicht zufrieden, bzw. ich programmiere es anscheind nicht richtig.
patmann2001
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: So 12.01.03 13:16 
Ist ja ganz nett und an der Absendung kann es auch nicht liegen, was macht denn der Server damit??? Könnte es sein, das dein ServerSocket1.Recivetext überläuft? Oder bist Du mit der Verwaltung der Daten im Server nicht schnell genung. Bekommt Dein Client zwischenzeitlich anweisungen vom Server und die Kolliediren dann mit dem aktuellen Daten im Client.
Ich kann das leider so nicht richtig beantworten. Das Problem ist immer man muss beide Programme sowohl Server als auch Client nebeneinander debuggen um solche Fehler aufdecken zu können.

cu Patmann