Autor Beitrag
TrippleDoubleU
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 15.07.02 15:53 
Hallo Leute!
Das ist für euch bestimmt eine leichte Frage, aber Wie schaffe ich es, dass ein ServerSocket, einen String an mehrere ClientSockets gleichzeitig schickt?
Das muss doch irgendwie gehn!


Danke!

~WWW~
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: Mo 15.07.02 18:22 
Hi,

Zitat:
Das muss doch irgendwie gehn!


geht auch :mrgreen:



ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ServerSocket1.Socket.ActiveConnections -1 do
  begin
    ServerSocket1.Socket.Connections[i].SendText('Text');
  end;
end;


Damit dürfte es funktionieren.

_________________
Viele Grüße
Jakob
TrippleDoubleU Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 15.07.02 19:14 
Titel: Danke dir...
... :? Aber dann muss jeder Client (Socket.Connect[x]) was anderes für X angeben, oder?

Das heißt, wenn ich den Client von mehreren PCs aus starten lasse müsste ich für jeden PC nen andern Client schreiben?


uha..


Aber danke :lol:

~WWW~
Murdock1
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 16.07.02 09:16 
???
Wieso willst du für jeden PC einen anderen Clienten erzeugen? Bei den Socket-Komponenten von Delphi wird folgender Mechanismus genutzt (nonBlocked):

Der Server hört auf einem Port auf Clientanfragen. Alle Clients senden auf demselben Port ihre Anfrage nach Verbindung an den Server. Akzeptiert der Server eine Verbindung, so handelt er mit dem Clienten einen anderen Port aus, auf dem dann die eigentliche Kommunikation stattfindet. Das bedeutet, der Port, den Du den Komponenten zuweist, ist nur zur Verbindungsaufname gedacht, die Kommunikation läuft dann je Client über einen separaten Port. Deswegen musst du sogar pro Server dieselben Clienten bzw. Clienteinstellungen verwenden, sonst funzt das ganze Konzept nicht. Dieses Verfahren eignet sich somit ideal für 1:n Verbindungen wie z.B. Chat-Programme

mfg Peter

P.S. Wenn Du willst, kann ich dir dazu mal ein Beispiel mailen
TrippleDoubleU Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 16.07.02 11:00 
Titel: aha?
Ja gerne :?


Aber muss nicht jeder Client ne andere "Connection-Nummer" ham ?


Da gehts doch erstmal garnich um die Ports.. ach ich bin einfach doof...
:(
TrippleDoubleU Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 16.07.02 14:57 
Titel: noch ne blöde Frage
Jetz hab ich noch ne blöde Frage..


Ich habs jetzt grade so geschafft, dass sich 2 Clienten an einem Server anmelden und auch Texte Empfangen, aber kann der Server auch Strings vom Client empfangen? Die Prozedur scheints ja zu geben, aber welches Ereignis muss das denn auslösen?

Ach, und nochwas.. wenn der Client nicht verbinden kann, geht ja ne Fehlermeldung auf. Aber wie verhindere ich das?

Sorry, aber ich bin in solchen Gebieten ein ziemlicher Noob.


Danke für eure Hilfe!! :wink:

~WWW~
Murdock1
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 17.07.02 13:08 
hi TrippleDoubleU,

- der Port ist einmalig "je Server", d.h. alle Clienten senden ihre Anfragen (ConnectRequest) auf demselben Port und das ist der, den du im code vorgegeben hast. der Server handelt dann mit jedem Client, dessen Anfrage er annimmt, einen anderen (eindeutigen) Port aus. z.b. stellst du Port 2048 für den Server und alle Clienten ein, und die tatsächliche Verbindung läuft dann über port 2090, 2091 und 2092 (bei 3 Clienten), während der Server weiterhin auf Port 2048 auf weitere Anfragen lauert. Diese 3 Portnummern handeln Server und Clienten ohne dein zutun aus, im Ernstfall weisst Du nicht mal, welche Ports die dann benutzen. Stell Dir vor, der Server ist ein Makler mit ´nem Handy und drei stationären Telefonen. Client 1 ruft auf dem Handy an und gibt seine Nummer (TCP/IP-Adresse) durch und legt dann auf. Der Server ruft mit dem stationären Telefon 1 den Clienten an und die beiden können schwatzen. Genauso machen es dann Client 2 und 3, wobei das Handy immer nur zur Übermittlung der Verbindungsdaten (Adresse des Clienten) dient. Du als Programmierer sagst jedem Clienten nur die Handy-Nr.; die Nummern der anderen Telefone des Maklers interessieren dich gar nicht.

-wenn ein Client Daten sendet, z.B.
clientSocket1.Socket.SendText(sSendString)
dann löst das beim Server ein Ereignis OnClientRead aus, die gesendeten Daten stehen dann in
Socket.ReceiveText und die Adresse des Senders in Socket.RemoteHost.

-Fehlermeldungen beim Verbindungsaufbau lösen ein OnError-Ereignis auf, in dem kannst du dann deine Reaktionen auf die fehlgeschlagene Verbindung reinpacken. Wenn Du die Fehlermeldungen des ClientSocket, die auf dem Bildschirm angezeigt werden, unterdrücken willst, setzt Du einfach in der OnError-Funktion den ErrorCode auf 0. In etwa so:

procedure TfrmMain.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
cbConnect.Checked:=false;
end;

Du kannst natürlich auch den Error-Code auswerten (am besten mit ´ner case-Anweisung), was die einzelnen Codes bedeuten, findest du in der Hilfe. In etwa so:

case ErrorCode of

0: blah;
1: blah;
blahblah;
5: schubbiduh;

end;
errorCode:=0;


Hoffe, das hat erstmal ein Stück weitergeholfen, wenn ich dazukomme, schick ich dir nochmal ein Beispiel per mail.

mfg Peter
TrippleDoubleU Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 17.07.02 14:16 
Titel: Ja
:D Dangäschööön!

Ja, das hat mir sehr weitergeholfen!