Einzelnen Beitrag anzeigen

mamble

Registriert seit: 1. Dez 2010
8 Beiträge
 
#4

AW: TSocket - Online Spiel Kommunikation

  Alt 19. Mär 2012, 15:08

Lösung des Problemes - reagiere auf den Resultwert von der Sendefunktion.
Lege selbst (am besten einen) Queue Puffer an, dem du Datensätze draufpusht und der seperat abgearbeitet wird - per Sendebefehl wird solange gesendet, bis alle Datenabgerbeitet werden; und der Datenpointer wird natürlich um die Anzahl der Bytes, die geschickt wurden, inkrementiert.
Okay, das Problem das du eben beschrieben hast, das hab' ich verstanden, allerdings verstehe ich die Lösung nicht ^^ bzw. wie ich das angehen soll, mit so etwas habe ich mich noch nie befasst.

Zu deinem Geschwindigkeitsproblem - ich weiß nicht, wie du das ganze nun wirklich gelöst hast, aber, sofern der Server schnell ist, sollte es da eig. keine Probleme geben. Evt. würde ich mir überlegen, von TCP auf UDP zu wechseln, sofern du das nicht bereits hast!
Ich habe keinen echten Server, sondern eine Serverapplikation. (und diese führe ich mit dem client lokal aus)
Ja, glaube das ich TCP habe ^^ TSocket ist doch Standardmäßig TCP...oder nicht
Warum sollte ich von TCP auf UDP wechseln? ..und wie?


Mit Indy (oder Synapse) als TCP/IP Socketbibliothek erreiche ich lokal auf einem alten Notebook zwischen fünf- und zwanzigtausend Nachrichten (pro Sekunde). So schnell kann man nicht tippen

An TCP kann es eigentlich nicht liegen, eher ist etwas im Code ineffizient.
Leider kann ich nicht gut mit Indy, ich weiß nicht wie ich da das realisieren kann, was ich mit TSocket bereits habe.

Das da etwas am Code ineffizient ist kann gut sein... hab nen sehr chaotischen style..

Hier das wichtigste:

Durch Mausklick aus Komponente sendet CLIENTapp an SERVERapp
ClientSocket1.Socket.SendText(Aktion); <- Clientapp

Und bei der Serverapp im ClientRead folgendes:

Delphi-Quellcode:
procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var DieAktion:string;
    i: Integer;
begin
    DieAktion:=Socket.ReceiveText;
    Memo1.Lines.add(DieAktion);
    For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
    begin
       with ServerSocket1.Socket.Connections [I] do
       if (Connected) then SendText(Text);
   end;
end;
Was mir persönlich jetzt an der ClientRead Prozedur aufgefallen ist, ist die suboptimale Lösung des Senden an alle aktiven Verbindungen... aber was besseres ist mir nicht eingefallen.


Jede Hilfe ist willkommen
  Mit Zitat antworten Zitat