AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Serverprogramm - Frage wegen multiplen clients
Thema durchsuchen
Ansicht
Themen-Optionen

Serverprogramm - Frage wegen multiplen clients

Ein Thema von cyborg · begonnen am 15. Jan 2003 · letzter Beitrag vom 28. Apr 2003
Antwort Antwort
cyborg

Registriert seit: 15. Jan 2003
24 Beiträge
 
Delphi 7 Personal
 
#1

Serverprogramm - Frage wegen multiplen clients

  Alt 15. Jan 2003, 17:09
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.
  Mit Zitat antworten Zitat
MadMason

Registriert seit: 9. Nov 2002
Ort: Altenburg
126 Beiträge
 
Delphi 2005 Architect
 
#2
  Alt 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
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.
Einstein ist tot
Newton ist tot
und mir ist auch schon ganz schlecht
  Mit Zitat antworten Zitat
cyborg

Registriert seit: 15. Jan 2003
24 Beiträge
 
Delphi 7 Personal
 
#3
  Alt 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!
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4
  Alt 15. Jan 2003, 17:50
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
cyborg

Registriert seit: 15. Jan 2003
24 Beiträge
 
Delphi 7 Personal
 
#5
  Alt 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?
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6
  Alt 15. Jan 2003, 19:10
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 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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#7
  Alt 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!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 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