Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi per UDP Nachricht an alle senden...WIE? (https://www.delphipraxis.net/69021-per-udp-nachricht-alle-senden-wie.html)

torud 9. Mai 2006 10:48


per UDP Nachricht an alle senden...WIE?
 
Hallo Wissende,

ich kann mir vorstelle, dass Euch dieses Thema langweilt, aber leider hat mich die Hilfe, bzw. die Demo von Indy nicht weitergebracht. Ich habe das Problem, dass ich die Beispielanwendung für den Server und den Client compiliert habe, es aber leider nur lokal funktioniert, dass ich vom Client an den Server was sende.

Da ich aber eine andere Funktionalität benötige, nämlich das der Server an die Clients per UDP Nachrichten versendet, habe ich mir das einfach nur so umgebaut, dass lokal auch so funzt. Wenn ich aber nun im Netzwerk meine Clientapplikationen starte und vom Server aus ne Nachricht sende, erscheint bei meinen Clients keine Messagebox, wie ich es als Beispiel erstellt habe.

Was mache ich falsch? Muss ich Broadcast aktivieren und sonst noch was einstellen, damit alle Clients vom Server was empfangen?

Diesen Code hier verwende ich im Client, wo ich die UDPServer-Komponente verwende:

Delphi-Quellcode:
procedure TForm1.UDPServerUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  DataStringStream: TStringStream;
  s: String;
begin
  DataStringStream := TStringStream.Create('');

  try
    DataStringStream.CopyFrom(AData, AData.Size);
    ShowMessage('Received "' + DataStringStream.DataString + '" from ' + ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
    s := 'Replied from ' + UDPServer.LocalName + ' to "' + DataStringStream.DataString + '"';
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
  finally
    DataStringStream.Free;
  end;
end;
Und das hier passiert, wenn ich am Server einen Button betätige:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  MessageID: Integer;
  ThisMessage: String;
  ReceivedString: String;
begin
  //MessageID := Random(MAXINT);
  ThisMessage := 'Message: ' + 'Nachricht von Sam';//IntToStr(MessageID);
  UDPMemo.Lines.Add('Sending ' + ThisMessage);
  UDPClient.Send(ThisMessage);
  ReceivedString := UDPClient.ReceiveString();
  if ReceivedString = '' then
  UDPMemo.Lines.Add('No response received from the server after ' + IntToStr(UDPClient.ReceiveTimeout) + ' millseconds.')
  else
  UDPMemo.Lines.Add('Received: ' + ReceivedString)
end;
Warum ist das nur so kompliziert?

torud 9. Mai 2006 11:51

Re: per UDP Nachricht an alle senden...WIE?
 
Problem gelöst.

Bei Host muss man 255.255.255.255 einstellen, damit an alle gesendet wird.

Klaus01 9. Mai 2006 12:00

Re: per UDP Nachricht an alle senden...WIE?
 
Ähm, dann bekommt aber auch jeder diese Nachricht auch die 99,9% der User
die keinen Client von Dir installiert haben.
Außerdem solltes Du in Betracht ziehen, daß es eventuell sein
kann das die Router im Internet oder des Providers eine
Broadcastmessage blockieren werden.

Wenn Du an allen Clients eine Meldung schicken möchtest,
dann mach das bitte dediziert, denn Dein Server weiß ja welche Clients
verbunden sind. Also sollte es nicht so schwer sein
dies auszuwerten und die Clients gezielt anzusrechen.

Wenn es darum geht in einem begrenzten Netz diese Meldung zu verteilen
kannst Du auch einen Broadcast (so nennt sich das) im Subnetz machen.
z.B. 192.168.10.255 o.ä.

Grüße
Klaus

torud 9. Mai 2006 14:24

Re: per UDP Nachricht an alle senden...WIE?
 
Hallo Klaus,

danke für Deine Info.

In meinem Fall geht es tatsächlich um ein "lokales" Netzwerk in dem 10-20 Clients hängen, die einfach nur ne Meldung vom Server erhalten sollen, dass sich die SQL-Datenbank geändert haben. Daraufhin sollen Sie dann eine Abfrage starten, um sich selbst zu abdaten.

Ich habe es nun mit nem Broadcast hinbekommen, dass ich ne Meldung an alle senden kann. Da sich unsere Clients von Veranstaltung zu Veranstaltung ändern, kann es also sein, dass immer wieder andere Clients dran hängen, die ich dann erst beim Server "bekannt" machen müsste.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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