![]() |
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. |
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:
auf die einzelnen Clientverbindungen zugreifen und Sachen senden.
ServerSocket.Connections[i]
Mit
Delphi-Quellcode:
kannste an jeden Client eine Nachricht senden.
for i:= 0 to ServerSocket.ConnectionsCount-1 do begin
ServerSocket.Connections[i].SendString('blabla'); end; Willst du nur an bestimmte eine senden musst du dir irgendwie merken welche nummer welcher Client ist. Ich machs immer mit ner StringList. |
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! |
Zitat:
|
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? |
Zitat:
naja wie auch immer... Zitat:
|
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:
Wenn's da eine einfachere Methode gibt wäre ich natürlich sehr interesiert diese zu erfahren!
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz