Entwickler-Ecke
Internet / Netzwerk - TServerSocket - Hilfe
Markos - Di 31.12.02 18:40
Titel: TServerSocket - Hilfe
Hi !
Mit meinem Client sende ich folgendes an den Server :
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 - 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 - 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 - 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 :
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 - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!