Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Serverprogramm - Frage wegen multiplen clients (https://www.delphipraxis.net/2273-serverprogramm-frage-wegen-multiplen-clients.html)

cyborg 15. Jan 2003 17:09


Serverprogramm - Frage wegen multiplen clients
 
Hallo!

Meine Frage ist vielleicht schon mal aufgetaucht, aber irgendwie hab ich nichts dazu gefunden.

Wo ich Schwierigkeiten habe ist einfach das Denk-Konstrukt bei Serverprogrammen.

ICh will mal zusammenfassen:
mehrere Clients binden an ein Serverprogramm per TCP/IP Prot.
im Serverprogramm läuft für jeden client ein einzelner Thread, nicht wahr? meistens laufen sogar mehrere pro client.

Daten werden vom client an den server und umgekehrt gesandt.

mein Problem ist: wie konstruiere ich das Serverprogramm?
wie können die einzelnen threads miteinander interagieren?

beispiel: ich baue ein spiel, wo mehrere clients andocken. alle berechnungen macht der server, er sendet an die clients, was er berechnet hat und diese stellen es dar.
die clients wiederum senden eigene aktionen an den server.
zusätzlich ist aber wichtig, dass nicht jeder client alle informationen bekommen muss.
sagen wir konkret: das spiel besteht aus punkten, die auf einer riesen fläche hin und her wandern können. der client empfängt vom server nur jene punkte die innerhalb eines sichtradiusses sind (also wo die koordinaten nicht zu grosse unterschiede haben)

ich hoffe ich kann ausdrücken was für mich die schwierigkeit darstellt: es muss sozusagen ein hauptprogramm geben, mit einer "datenbank" der ereignisse (positionen aller clients z.B.).
ich frage mich auch, wie ich an alle clients senden soll... per timer?

worm es mir geht:
ich will einen server machen, sozusagen ein grundgerüst, und das auch verstehen. der server soll unterstützen dass mehrere clients andocken und informationen nicht nur austauschen, sondern auch vom server generierte informationen bekommen (also der server macht von selbst auch was, es basiert nicht alles auf Sende- und Empfange- Ereignissen)

wenn einmal sowas steht, kann man diesen server so verändern wie man will, man kann daraus zB einen chat machen oder was weiss ich...

jeder, der links, beispiele, erklärungen oder sonstwas für mich in diese richtung hat, solle es bitte posten, ich wäre dankbar.

MadMason 15. Jan 2003 17:33

Erstmal herzlich willkommen im DF

um die ganze Sache mit den Threads musst du dich eigentlich nicht kümmern, macht alles TServerSocket.
Die einzelnen TClientSockets verbinden sich mit dem Server, du kannst dann über
Delphi-Quellcode:
ServerSocket.Connections[i]
auf die einzelnen Clientverbindungen zugreifen und Sachen senden.
Mit
Delphi-Quellcode:
 for i:= 0 to ServerSocket.ConnectionsCount-1 do begin
ServerSocket.Connections[i].SendString('blabla');
end;
kannste an jeden Client eine Nachricht senden.
Willst du nur an bestimmte eine senden musst du dir irgendwie merken welche nummer welcher Client ist.
Ich machs immer mit ner StringList.

cyborg 15. Jan 2003 17:42

verstehe!

aber wenn die clients was senden, das muss ich irgendwo abspeichern nicht wahr?
wenn aber nun 2 clients gleichzeitig eine variable ändern habe ich ein problem!

Chewie 15. Jan 2003 17:50

Zitat:

Zitat von cyborg
wenn aber nun 2 clients gleichzeitig eine variable ändern habe ich ein problem!

Solange du keine zwei CPUs hast, eigentlich nicht. Der Server kann nicht gleichzeitig zwei Befehle abarbeiten, da der Prozessor nur eine Sache zur selben Zeit machen kann. Parallel laufende Threads sind nicht wirklich gleichzeitig.

cyborg 15. Jan 2003 19:07

sicher? moderne CPUs können teilweise zwei dinge gleichzeitig berechnen...!

naja wie auch immer...

das versenden der daten würde ich also in einem timer machen, nicht wahr?

der timer sendet an alle clients neue informationen...

oder wie?

Chewie 15. Jan 2003 19:10

Zitat:

Zitat von cyborg
sicher? moderne CPUs können teilweise zwei dinge gleichzeitig berechnen...!

Falls du auf die Hyperthreading-Technologie anspielst: Nein, sie nutzt nur Freiräume besser aus.

naja wie auch immer...

Zitat:

Zitat von cyborg
das versenden der daten würde ich also in einem timer machen, nicht wahr?

der timer sendet an alle clients neue informationen...

oder wie?

Wie du das machst, bleibt dir überlassen. Ein Timer ist gut, wenn du in immer regelmäßigen Abständen Daten senden willst. Falls du aber Daten in Echtzeit direkt nach Eintritt eines Ereignis senden willst, ist ein Timer weniger geeignet.

magicshadow 28. Apr 2003 18:10

Noch was von mir!

Ich würde mir an deiner stelle die SocketHandle eigenschaft der connection merken, da wenn sich client 2 connected und danach client 1 deconnected die connections[i] variable verändert, die SocketHandle eigenschaft bleibt jedoch gleich!
Auserdem kann man damit einfach beim ClientRead herrausfinden, welcher Client einem was geschickt hat (einfach socket.SocketHandle und alle Serversocket1.socket.connections[i].SocketHandle vergleichen)
BSP.:
Code:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i:byte;
    a:string;
begin
for i:=0 to serversocket1.socket.activeconnections-1 do if socket.sockethandle = serversocket1.socket.connections[i].SocketHandle then showmessage(inttostr(i));
a:=socket.receivetext;
end;
end;
Wenn's da eine einfachere Methode gibt wäre ich natürlich sehr interesiert diese zu erfahren!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz