Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Nachricht vom Server an alle Clienten schicken (https://www.delphipraxis.net/13952-nachricht-vom-server-alle-clienten-schicken.html)

hibbert 29. Dez 2003 20:24


Nachricht vom Server an alle Clienten schicken
 
Hi,
ich habe einen Clienten und einen Server auf der gleichen Form plaziert (Server und Client von Indy)
Nun habe ich ein Richedit zum Nachricht eingeben und ein weiters zum anzeigen der Nachricht.

Nun verbindet sich der eine client zum anderen Server und umgekehrt. Mit zwei compuntern im Lan funzt das. Doch wenn jetzt nich ein dritter hinzukommt, dann gibt es ein problem: Wie erhält der dritte User eine nachricht bzw. zu welchem Server soll dieser User connecten?

Nun könnte dieser User doch zu einen x-beliebigen Server connecten.dieser server müsste dann nur die Nachrichten an alle anderen Clienten wieder ausgeben. (oder rede ich jetzt wirres zeug?)

Mein Hintergrundgedanke ist es, einen Netzwerkchat zu erstellen, indem es keinen einzelnen Server gibt, d.h. das irgendwo im Netztwerk ein Server läuft, sondern das eigendtlich jeder ein Server ist.
Denn wenn es nur einen Server gibt und der auch noch ausfällt, dann kann man den ganzen Chat vergessen.

Wie mache ich das nun am günstigsten? Kann mir jemand vielleicht ein paar tips geben wie das am einfachsten zu realisieren ist?

thx hibbert

Uncle Cracker 29. Dez 2003 20:30

Re: Nachricht vom Server an alle Clienten schicken
 
Weshalb machst du in einem Programm Client und Server?

Reicht doch wenn der eine Client zum Server connected und nicht beide untereinander, dann gäbe es auch keine Probleme mit dem dritten Clienten, denn der müsst nur zum Server connecten.

hibbert 29. Dez 2003 20:45

Re: Nachricht vom Server an alle Clienten schicken
 
Zitat:

Zitat von hibbert
Mein Hintergrundgedanke ist es, einen Netzwerkchat zu erstellen, indem es keinen einzelnen Server gibt, d.h. das irgendwo im Netztwerk ein Server läuft, sondern das eigendtlich jeder ein Server ist.
Denn wenn es nur einen Server gibt und der auch noch ausfällt, dann kann man den ganzen Chat vergessen.

ich schicke einen text zum server und der wieder am mich zurück, doch wie schicke ich den text an alle verb. clienten zurück?

SleepyMaster 29. Dez 2003 20:48

Re: Nachricht vom Server an alle Clienten schicken
 
Wenn du es nur in deinem Netzwerk brauchst dann würde ich es mit UDP Broadcasting machen:

Du musst dich dann nicht mehr um Client Server kümmern sondern kannst dich auf andere Sachen konzentrieren

hibbert 29. Dez 2003 20:52

Re: Nachricht vom Server an alle Clienten schicken
 
genau so etwas habe ich gesucht, doch der text wird mir 3 mal angezeigt, wenn ich alleine verbunden bin.
Und was ist bitte UDP Broadcasting ? :shock:

thx hibbert

Uncle Cracker 29. Dez 2003 20:54

Re: Nachricht vom Server an alle Clienten schicken
 
Zitat:

ich schicke einen text zum server und der wieder am mich zurück, doch wie schicke ich den text an alle verb. clienten zurück?
In dem du in einer Schleife alle Clienten durch gehst, die der Server/Client bei sich gespeichert hat.

SleepyMaster 29. Dez 2003 20:55

Re: Nachricht vom Server an alle Clienten schicken
 
Die Nachrichten werden nicht an EINEN Client gesendet sondern an ALLE die an dem Netzwerk angeschlossen sind (255.255.255.255).

hibbert 29. Dez 2003 20:56

Re: Nachricht vom Server an alle Clienten schicken
 
Zitat:

Zitat von Uncle Cracker
In dem du in einer Schleife alle Clienten durch gehst, die der Server/Client bei sich gespeichert hat.

und wo werden die clienten abgespeichert, oder bekomme ich diese auch durch eine schleife heraus?

SleepyMaster 29. Dez 2003 20:59

Re: Nachricht vom Server an alle Clienten schicken
 
Nimm Broadcasting! ;)

Dann musst du dir darum auch keine Gedanken machen!

hibbert 29. Dez 2003 21:02

Re: Nachricht vom Server an alle Clienten schicken
 
Zitat:

Zitat von SleepyMaster
Nimm Broadcasting! ;)

Dann musst du dir darum auch keine Gedanken machen!

ok kann ich machen, aber was ist das und wo bekomme ich das her?

SleepyMaster 29. Dez 2003 21:04

Re: Nachricht vom Server an alle Clienten schicken
 
Indy UDPClient (TIdUDPClient)
Indy UDPServer (TIdUDPServer)

Und bei dem UDPClient Broadcasting auf true setzen!

hibbert 29. Dez 2003 21:06

Re: Nachricht vom Server an alle Clienten schicken
 
ok, danke für eure hilfe, ich werde mich mal gleich ranmachen.
wenn ich noch fargen habe, dann melde ich mich in den nächsten tagen nochmal.

danke nochmal für eure hilfe.

hibbert

SleepyMaster 29. Dez 2003 21:08

Re: Nachricht vom Server an alle Clienten schicken
 
Delphi-Quellcode:
IdUDPClient1.Send('255.255.255.255',Portnummer,Text);
und zum empfangen

Delphi-Quellcode:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  x:string;
begin
AData.Position:=0;
SetLength(x,AData.Size);
AData.ReadBuffer(x[1],AData.Size);
//in x steht jetzt dem empfangene Text
end;

hibbert 29. Dez 2003 21:32

Re: Nachricht vom Server an alle Clienten schicken
 
ok, nun geht es los mit meinen Fragen:
(ich benutze nun die Kompos Indy UDPClient (TIdUDPClient) & Indy UDPServer (TIdUDPServer) )
  • Welche Bindings muss ich beim Server eintragen ?
  • Welchen host muss ich beim Clienten eintragen ?
  • Der Prot ist doch egal, hauptsache der gleiche, oder ?
  • Was sollte ich noch beachten ?
  • Und warum kommt diese Fehlermeldung:
Zitat:

Zitat von Compiler
[Fehler] Unit1.pas(19): Undefinierter Bezeichner: 'TIdSocketHandle'

Ich habe ein edit Feld, einen Button und den server sowie den Clienten drauf.
(oder darf ich nur den server oder nur den Clienten benutzen, geht beides zusammen überhaupt?)
Code:
Im Button ist folgender Quelltext:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdUDPClient1.Send('255.255.255.255',32,edit1.Text);
end;
Und dann habe ich noch dieses hier:
Code:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var x:string;
begin
AData.Position:=0;
SetLength(x,AData.Size);
AData.ReadBuffer(x[1],AData.Size);
memo1.Lines.Add(x)
end;
Was habe ich falsch gemacht ?

thx hibbert

SleepyMaster 29. Dez 2003 21:58

Re: Nachricht vom Server an alle Clienten schicken
 
Zitat:

Welche Bindings muss ich beim Server eintragen ?
-Keine Bindings
Zitat:

Welchen host muss ich beim Clienten eintragen ?
-Keinen (Alle Nachrichten werden an alle PCs im Netzwerk gesendet)
Zitat:

Der Prot ist doch egal, hauptsache der gleiche, oder ?
-Jepp
Zitat:

Was sollte ich noch beachten ?
-KA
Zitat:

Und warum kommt diese Fehlermeldung:
-Den Fehler hab ich auch! Habs so gelöst:
Delphi-Quellcode:
type
  TIdSocketHandle = THandle;
Zitat:

(oder darf ich nur den server oder nur den Clienten benutzen, geht beides zusammen überhaupt?)
-MUSST beide nehmen (Client zum senden/Server zum empfangen)
Zitat:

Was habe ich falsch gemacht ?
-Garnix. Wenn BroadcastEnabeld = true ist und der Serverport auch 32 ist.
(glaub ich mal)

hibbert 29. Dez 2003 22:08

Re: Nachricht vom Server an alle Clienten schicken
 
schön dass du auch den gelcihen fehler hattest :wink:
doch wo hast du das Type eingefügt? etwas so:
unit Unit1;

Delphi-Quellcode:
interface

uses
  ...
type
  TForm1 = class(TForm)
    IdUDPClient1: TIdUDPClient;
    IdUDPServer1: TIdUDPServer;
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    TIdSocketHandle = THandle;
    procedure Button1Click(Sender: TObject);
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
...
thx hibbert

SleepyMaster 29. Dez 2003 22:12

Re: Nachricht vom Server an alle Clienten schicken
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
  IdUDPClient, XPMan;

type                         //<<<<<<<<<<<<<<<<<<
  TIdSocketHandle = THandle; //<<<<<<<<<<<<<<<<<<

type
  TForm1 = class(TForm)
    IdUDPClient1: TIdUDPClient;
    IdUDPServer1: TIdUDPServer;
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    XPManifest1: TXPManifest;
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

SleepyMaster 29. Dez 2003 22:14

Re: Nachricht vom Server an alle Clienten schicken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab mal en kleines Beispiel angehangen

hibbert 29. Dez 2003 23:48

Re: Nachricht vom Server an alle Clienten schicken
 
ach da oben kam das hin :shock:
na dann ist ja der rest auch klar :lol:

Danke für deine bzw. eure Hilfe.

Aber eine Frage habe ich da noch: warum wird der eingegebene Text 3 mal in das memo geschrieben?

(zum Zeitpunkt meines Tests war kein weitere Rechner im Netzwerk online)

thx hibbert

SleepyMaster 30. Dez 2003 10:44

Re: Nachricht vom Server an alle Clienten schicken
 
Also ich hab kein Problem damit! (Bekomme ihn immer nur einmal)
Wieviele Netzwerkkarten hast du denn in deinem PC???

Und was passiert wenn du es noch auf einem anderen PC laufen lässt???
Bekommt der dann auch alle Nachrichten 3x???

hibbert 30. Dez 2003 12:14

Re: Nachricht vom Server an alle Clienten schicken
 
ok, ich hatte in den netzwerkverbindungen 3 lan verbindungen offen.
nun sind es nur noch 2 (die andere verbindung muss aktiviert sein, damit ich ins internerkomme, obwohl das modem bei mir installiert und eingebaut ist...)
aber jetzt kommt auch immer nur eine zeile zurück.

cool endlich funzt es, vielen Danke !!

ps. funzt das auch über das internet?

thx hibbert

SleepyMaster 30. Dez 2003 12:21

Re: Nachricht vom Server an alle Clienten schicken
 
Nein leider nicht!

(Wäre aber auf der anderen Seite auch ein bisschen dumm wenn JEDER der ans Internet angeschlossen ist deine Nachrichten empfängt)

Die Nachrichten werden sobald sie beim Provider ankommen blockiert und NICHT weitergeleitet!

Ultimator 27. Apr 2004 18:50

Re: Nachricht vom Server an alle Clienten schicken
 
Wenn du das Ganze allerdings mit Sockets und ohne UDP machen willst, hätt ich hier was für dich:
Delphi-Quellcode:
For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
   begin
   with ServerSocket1.Socket.Connections [I] do //Alle Clients durchgehen
  if (Connected) then SendText('wasauchimmerduwillst');

hibbert 27. Apr 2004 21:05

Re: Nachricht vom Server an alle Clienten schicken
 
Danke für die antwort, aber ich habe das auch mit den UPD Server und Clienten hinbekommen.

Ich habe einfach einfach eine abfrage vorher eingebaut und dann ging das alles.

und die sache mit dem internet funzt auch...

thx hibbert

SleepyMaster 27. Apr 2004 21:07

Re: Nachricht vom Server an alle Clienten schicken
 
Zitat:

und die sache mit dem internet funzt auch...
wie??? Schaffst du es einen Broadcat über Internet zu senden/empfangen???

hibbert 27. Apr 2004 21:12

Re: Nachricht vom Server an alle Clienten schicken
 
Ich habe es mit den UPD Komponenten geschafft, aber mit folgenden Einschränkungen:
° User hinter einem Router erreiche ich nicht, die aber mich
° Ich benötige die IP des anderen Users

Hibbert

SleepyMaster 28. Apr 2004 11:22

Re: Nachricht vom Server an alle Clienten schicken
 
OK! Das ist dann logisch! Ich dachte du würdest es über einen Broadcast schaffen.

DymonD 12. Mai 2004 11:34

Re: Nachricht vom Server an alle Clienten schicken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Ultimator
Wenn du das Ganze allerdings mit Sockets und ohne UDP machen willst, hätt ich hier was für dich:
Delphi-Quellcode:
For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
   begin
   with ServerSocket1.Socket.Connections [I] do //Alle Clients durchgehen
  if (Connected) then SendText('wasauchimmerduwillst');


Ja und die Prozedur sendet dann den Text an alle mit dem Server verbundenden Clients??

Kann ich das auch mit TTcpServer / TTcpClient übers INet nutzen? Will mIRC & Co. Konkurrenz machen ^^

thx
DymonD

PS: Wieso sind bei mir die Buttons grau und rechteckog wie bei W2K obwohl ich XP habe..?

alcaeus 12. Mai 2004 11:48

Re: Nachricht vom Server an alle Clienten schicken
 
Zitat:

Zitat von DymonD
Wieso sind bei mir die Buttons grau und rechteckog wie bei W2K obwohl ich XP habe..?

Wenn du den klassischen Stil bei XP eingestellt hast, werden die alten visuellen Komponenten verwendet. Wenn du den neuen hast, musst du ein [dp:d4c77d7d2a=Manifest]Manifest[/dp:d4c77d7d2a] verwenden.

Ultimator 12. Mai 2004 11:53

Re: Nachricht vom Server an alle Clienten schicken
 
Ob das Ganze mit TCPServer und -Client geht weiß ich nicht, aber der Text wird dann an jeden einzelnen verbundenen Client geschickt. Musst halt gucken ob's auch mit den oben beschriebenen Kompos geht.

DymonD 12. Mai 2004 11:57

Re: Nachricht vom Server an alle Clienten schicken
 
hi,

meinst du mit

{$R WindowsXP.res}

oder wie?

DymonD

alcaeus 12. Mai 2004 11:58

Re: Nachricht vom Server an alle Clienten schicken
 
Genau, das meine ich. Natürlich musst du beim Anzeigen auch den neuen XP-Stil eingestellt haben.

DymonD 12. Mai 2004 12:01

Re: Nachricht vom Server an alle Clienten schicken
 
axo..danke
aber wie is das mit den sockets..?

DymonD

Ultimator 12. Mai 2004 12:10

Re: Nachricht vom Server an alle Clienten schicken
 
Was meinst mit
Zitat:

Zitat von DymonD
aber wie is das mit den sockets..?

Erklär mal genauer, was du machen willst.

DymonD 12. Mai 2004 12:22

Re: Nachricht vom Server an alle Clienten schicken
 
hi,

ob das auch mit TTcpServer und TTcpClient übers inet funzt bzw ob der server das dann an alle cliens sendet die mit ihm verbunden sind..?


For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
with ServerSocket1.Socket.Connections [I] do //Alle Clients durchgehen
if (Connected) then SendText('wasauchimmerduwillst');


DymonD

Ultimator 12. Mai 2004 12:30

Re: Nachricht vom Server an alle Clienten schicken
 
Ich hab jetzt auf die Schnelle nix entsperchendes gefunden. Musst halt selber mal suchen. Zur Not kannst du's ja doch mit den Sockets machen.

DymonD 12. Mai 2004 12:35

Re: Nachricht vom Server an alle Clienten schicken
 
ok, thx, ich probiers mal so...
DymonD

hibbert 12. Mai 2004 12:56

Re: Nachricht vom Server an alle Clienten schicken
 
Wenn du das mit den UPD Komponenten von Indy machst, geht das noch etwas einfacher:
Delphi-Quellcode:
form1.IdUDPClient1.Send('255.255.255.255',33,'Dein Text');

DymonD 12. Mai 2004 13:01

Re: Nachricht vom Server an alle Clienten schicken
 
Zitat:

Zitat von hibbert
Wenn du das mit den UPD Komponenten von Indy machst, geht das noch etwas einfacher:
Delphi-Quellcode:
form1.IdUDPClient1.Send('255.255.255.255',33,'Dein Text');

hi,

ja ich habe aber den TTcpServer / TTcpClient.. muss ich das denn jetzt alles umstellen?? sind die Einstellungen gleich?? und außerdem soll es im INet funzen.. soll ja kein LanMessenger sein

und außerdem wieso geht das ned:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
   //-----------  Den Mist senden --------------
   if Form1.TcpClient1.Active then Form1.TcpClient1.SendText(Memo2.Text);
end;

Ultimator 12. Mai 2004 13:08

Re: Nachricht vom Server an alle Clienten schicken
 
Probier mal, das Form1.-Geknör wegzumachen und versuchs mal mit ...Active=true.
Es kann natürlich auch sein, dass er keine Zeilenumbrüche mag, nimm mal ein Edit-Feld.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 Uhr.
Seite 1 von 2  1 2      

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