Autor Beitrag
brainkopf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Di 11.12.07 21:26 
Hi,
ich bin mir total unsicher ob das hier reingehört, aber ich probier es einfach mal.

Also.
Ich habe nen kleines Programm geschrieben (sehr klein xD)
Das den Text eines Memos in ein ShowMessage ausgibt.

Das ist ja ne tolle spielerei. nur hätte ich es gerne so, das diese Message an eine bestimmte Ip Adresse gesendet wird.
Also wenn PC1 die ip 1.1.1.1 und PC2 die ip 2.2.2.2 hat und das Programm auf PC1 ausgeführt wird, soll die Message an 2.2.2.2 gesendet werden und somit auf PC 2 erscheinen.
Ist das möglich?

mfg
brainkopf

Edit: Achso. Es sollte innerhalb eines Netzwerkes funktionieren!


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Di 11.12.2007 um 20:37
Quitzlinga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Di 11.12.07 22:25 
Wenn ich das jetzt richtig verstehe, willst Du ein Chat-Programm schreiben, das Textnachrichten zwische 2 Computern austauscht bzw. nur in eine Richtung die Nachricht sendet ohne Möglichkeit der Rückantwort.

Wenn es das ist, dann schau Dir dazu am besten mal Narses Netzwerktutorial an
www.delphi-library.d...kets+v400_54269.html
oder das mitgelieferte Chat-Beispiel der Indy-Komponenten von Delphi. Beides behandelt deine Problemstellung recht gut. Sei aber nicht gleich erschlagen von dem ganzen Stoff, denn es ist für den Anfang doch recht starker Tobak.
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 11.12.07 22:28 
mal net send in die Runde hauend, 8)

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Di 11.12.07 22:42 
gibt es nicht vll iwi eine möglichkeit das direkt einfach zu senden?

Also nach dem Motto

ausblenden Quelltext
1:
SendMessage('test') to 1.1.1.1;					


oder sowas?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 11.12.07 23:28 
Moin!

user profile iconbrainkopf hat folgendes geschrieben:
gibt es nicht vll iwi eine möglichkeit das direkt einfach zu senden?
Nein, leider nicht. :|

Der Tipp mit Suche in: Delphi-Forum, Delphi-Library NET SEND kommt deiner Vorstellung davon vielleicht noch am nächsten, allerdings ist doch heute meistens der Netzwerknachrichtendienst deaktiviert, so dass es eh nicht funktionieren wird. :nixweiss:

Damit ist der Tipp, sich mal mit einem Chat-Tutorial zu beschäftigen, IMHO der erfolgversprechendste Weg. :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Di 11.12.07 23:44 
Okay. Danke. Schade wenn es sowas nicht gibt. Den ich finde das mit den 'anmelden' im Chat über den Server etwas blöd. Müssen eigentlich beide Clienten das selbe Programm haben? Oder können die unterschielich sein?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 12.12.07 00:01 
Moin!

user profile iconbrainkopf hat folgendes geschrieben:
Den ich finde das mit den 'anmelden' im Chat über den Server etwas blöd.
Was meinst du denn mit "anmelden"? :gruebel: Wenn du damit TCP-Verbindungen meinst, das geht auch mit UDP. ;)

user profile iconbrainkopf hat folgendes geschrieben:
Müssen eigentlich beide Clienten das selbe Programm haben? Oder können die unterschielich sein?
Leider verstehe ich auch diese Frage nicht. :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Quitzlinga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Mi 12.12.07 01:18 
Simpel ausgedrückt funktioniert es so :

Auf einem Computer läuft die Serversoftware. Komponenten, die du dazu benötigst sind entweder TIDTCPServer oder TIDUDPServer der Indykomponenten aus Delphi je nachdem, welches Protokoll Du nehmen willst, Ich rate zur TCP-Komponente, da das Protokoll auch sicherstellt, das alles ankommt, was Du sendest. Auf dem 2. Rechner läuft dann die Client-Software, die sich an den Server via Netz verbindet (Ich vermute mal, das Du das mit der Anmeldung meinst). So gesehen brauchst Du schon 2 verschiedene Programme : Einmal den Client und einmal den Server. Ich realisiere das aber meistens so, das ich beide Komponenten benutze und den Anwender entscheiden lasse, ob er jetzt Client oder Server spielen will. Das hat den Vorteil, das letztendlich der Benutzer vor sich nur ein Programm vor sich hat aber auch den Nachteil, das sich aus allen Benutzern erst mal der Server herauskristallisieren muss, an den sich dann alle connecten. Natürlich kannst Du auch eine Verteilungsvariante a la ICQ machen, wo alle Computer einen Server aufmachen und diese Adresse einem zentralen Verwaltungsserver mitteilen, der dann diese Adressen auf Wunsch herausgiebt.So können sich Computer untereinander (peer to peer like) verbinden, indem sie sich auf die herausgegebenen Adresse via Client Software verbinden. Ist aber sehr fortgeschrittenes Design und für deinen Fall übertrieben. Ergo : Wieviele Programme dein Benutzer letzendlich vor sich hat, hängt von deinem Konzept ab. Jede Variante, egal ob getrennt oder kombiniert in einem Programm hat seine Vor- und Nachteile.

Zitat:
gibt es nicht vll iwi eine möglichkeit das direkt einfach zu senden?


Kommt drauf an, was Du einfach nennst. Der Befehl zum Text-Senden in der Indykomponente ist einfach : Ein simples writeln('text')und der Text wird von einem zum anderen Computer gesendet. Die Probleme fangen erst dann an, wenn Du die Netzwerkkomponenten noch nicht richtig verstehst. Darum schau dir erst mal das Chat-Beispiel an. das macht genau das, was Du willst und Du kannst erste Netzwerkluft schnuppern. Wenns Dich dann gepackt hat, dann vertiefe Dein Wissen mit dem vorher beschriebenen Tutorial und erweiter Dein Programm. Einfach ist letztendlich (leider) nichts, das ist immer harte Arbeit selbst mit einem so gutem Compiler und Komponenten wie Delphi.

Wenn Du zu dem Chat-Beispiel Fragen hast, dann schick mir einfach ne PM und ich beantworte sie dann. Hab ja selber mal klein angefangen und weiss daher, wie verwirrend das im ersten Moment ist.

MfG

Quitzlinga
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Mi 12.12.07 15:11 
Danke für die umfangreiche Antwort!
Und mit dem Anmelden habe ich das verbinden mit dem Server gemeint. xD

Ich werde mir einfach mal den Code von dem Chat angucken und vll erstmal den so umschreiben wie ich in brauche.

Ich halte euch auf dem laufenden!


Edit:
So jetzt habe ich ein Problem.
Den gesendeten Text, würde ich gerne in einer ShowMessage anzeigen.
Nur das funktioniert nicht. Es kommt immer ein leeres Fenster.
Wenn dies nicht mit Show Message möglich ist, gibts da eine andere möglichkeit?

ausblenden Delphi-Quelltext
1:
ShowMessage(Socket.ReceiveText);					


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 12.12.07 17:07 
Moin!

Deine Codezeile ist ansich erstmal korrekt (kann man ja auch kaum "falsch" machen, sofern was im Empfangspuffer liegt). Zeig mal etwas mehr Code, so kommen wir da nicht weiter. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Mi 12.12.07 20:23 
also. hier die client 2 (Nur Ausgabe möglich)
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;

const
  MY_PORT = 12345// an diesem Port wartet der Server auf Clients

type
  TForm1 = class(TForm)
    ServerAdress: TEdit;
    Online: TCheckBox;
    Log: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure OnlineClick(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure BtnSendClick(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    ClientSocket1: TClientSocket; // dynamisch erzeugter TClientSocket
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// bei Programmstart ausführen
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Objekt erstellen; Eigentümer ist das Formular -> so wird das Objekt beim
  // Beenden automatisch mit freigegeben
  ClientSocket1 := TClientSocket.Create(Form1);
  // Ereignisse eintragen
  ClientSocket1.OnConnect := ClientSocket1Connect;
  ClientSocket1.OnDisconnect := ClientSocket1Disconnect;
  ClientSocket1.OnError := ClientSocket1Error;
  ClientSocket1.OnRead := ClientSocket1Read;
  // fertig, ClientSocket dynamisch erstellt
  ClientSocket1.Port := MY_PORT; // Port eintragen
end;

// Online-Checkbox wechselt den Status
procedure TForm1.OnlineClick(Sender: TObject);
begin
  if (Online.Checked) then // falls wir online gehen...
    ClientSocket1.Host := ServerAdress.Text; // ...Serveradresse eintragen
  ClientSocket1.Active := Online.Checked; // neuen Status setzen
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Form1.Destroy
end;
// Verbindung erfolgt (connect) -> Meldung machen
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Log.Lines.Add('Verbunden mit '+ServerAdress.Text);
end;

// Verbindung getrennt (disconnect) -> Meldung machen
procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Log.Lines.Add('Verbindung getrennt.');
  // falls der Server getrennt hat, sonst bleibt der Haken stehen,
  Online.Checked := FALSE; // obwohl wir gar nicht mehr online sind!
end;

// Fehler in der Verbindung aufgetreten
procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  Log.Lines.Add('Fehler '+IntToStr(ErrorCode));
  Online.Checked := FALSE; // sicherheitshalber Verbindung trennen
  ErrorCode := 0// keine Exception erzeugen, Fehler behandelt
end;

// Sende-Button bearbeiten
procedure TForm1.BtnSendClick(Sender: TObject);
begin
  if (ClientSocket1.Active) then // sind wir online?
  else
    Log.Lines.Add('Nicht verbunden!'); // nein, Meldung machen
end;

// Daten vom Server eingetroffen
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  Log.Lines.Add(Socket.ReceiveText); // lesen und ausgeben
  ShowMessage(Socket.ReceiveText);
end;

// bei Programmende ausführen
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if (ClientSocket1.Active) then // noch online?
    ClientSocket1.Close; // ja, dann trennen
end;

end.


Die Client 1 (Ausgabe und schreiben)
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;

const
  MY_PORT = 12345// an diesem Port wartet der Server auf Clients

type
  TForm1 = class(TForm)
    ServerAdress: TEdit;
    Online: TCheckBox;
    Log: TMemo;
    Input: TEdit;
    BtnSend: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure OnlineClick(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure BtnSendClick(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    ClientSocket1: TClientSocket; // dynamisch erzeugter TClientSocket
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// bei Programmstart ausführen
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Objekt erstellen; Eigentümer ist das Formular -> so wird das Objekt beim
  // Beenden automatisch mit freigegeben
  ClientSocket1 := TClientSocket.Create(Form1);
  // Ereignisse eintragen
  ClientSocket1.OnConnect := ClientSocket1Connect;
  ClientSocket1.OnDisconnect := ClientSocket1Disconnect;
  ClientSocket1.OnError := ClientSocket1Error;
  ClientSocket1.OnRead := ClientSocket1Read;
  // fertig, ClientSocket dynamisch erstellt
  ClientSocket1.Port := MY_PORT; // Port eintragen
end;

// Online-Checkbox wechselt den Status
procedure TForm1.OnlineClick(Sender: TObject);
begin
  if (Online.Checked) then // falls wir online gehen...
    ClientSocket1.Host := ServerAdress.Text; // ...Serveradresse eintragen
  ClientSocket1.Active := Online.Checked; // neuen Status setzen
end;

// Verbindung erfolgt (connect) -> Meldung machen
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Log.Lines.Add('Verbunden mit '+ServerAdress.Text);
end;

// Verbindung getrennt (disconnect) -> Meldung machen
procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Log.Lines.Add('Verbindung getrennt.');
  // falls der Server getrennt hat, sonst bleibt der Haken stehen,
  Online.Checked := FALSE; // obwohl wir gar nicht mehr online sind!
end;

// Fehler in der Verbindung aufgetreten
procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  Log.Lines.Add('Fehler '+IntToStr(ErrorCode));
  Online.Checked := FALSE; // sicherheitshalber Verbindung trennen
  ErrorCode := 0// keine Exception erzeugen, Fehler behandelt
end;

// Sende-Button bearbeiten
procedure TForm1.BtnSendClick(Sender: TObject);
begin
  if (ClientSocket1.Active) then // sind wir online?
    ClientSocket1.Socket.SendText(Input.Text) // ja, Text senden
  else
    Log.Lines.Add('Nicht verbunden!'); // nein, Meldung machen
end;

// Daten vom Server eingetroffen
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  Log.Lines.Add(Socket.ReceiveText); // lesen und ausgeben
end;

// bei Programmende ausführen
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if (ClientSocket1.Active) then // noch online?
    ClientSocket1.Close; // ja, dann trennen
end;

end.


und die Server
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

const
  MY_PORT = 12345// an diesem Port melden sich die Clients

type
  TForm1 = class(TForm)
    Log: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
  public
    ServerSocket1: TServerSocket;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// beim Programmstart ausführen
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Objekt erstellen; Eigentümer ist das Formular -> so wird das Objekt beim
  // Beenden automatisch mit freigegeben
  ServerSocket1 := TServerSocket.Create(Form1);
  // Ereignis eintragen
  ServerSocket1.OnClientRead := ServerSocket1ClientRead;
  // fertig, ServerSocket dynamisch erstellt
  ServerSocket1.Port := MY_PORT; // den Port eintragen
  ServerSocket1.Open; // Server aktivieren
  Log.Lines.Add('Server online.');
end;

// beim Programmende ausführen
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ServerSocket1.Close; // Server deaktivieren
end;

// Daten von einem Client eingetroffen
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  var
    MyMessage: String;
    i: Integer;
begin
  // Nachricht lesen und davor die IP des Absenders setzen
  MyMessage := Socket.RemoteAddress+': '+Socket.ReceiveText;
  Log.Lines.Add(MyMessage); // Nachricht lokal ausgeben
  // und an alle verbundenen Clients senden
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
    ServerSocket1.Socket.Connections[i].SendText(MyMessage);
end;

end.


ich hoffe das ist genügend. xD
bin mir nicht sicher was dafür wichtig. ist.

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Quitzlinga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Mi 12.12.07 22:43 
Hi

Mit der Socket-Komponente von Delphi kenne ich mich jetzt nicht so gut aus, aber folgende Dinge sind mir aufgefallen :

Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
// Verbindung erfolgt (connect) -> Meldung machen 
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); 
begin 
  Log.Lines.Add('Verbunden mit '+ServerAdress.Text); 
end;


Ersetz das am besten mal mit Socket.remotehost. Dadurch bekommst du letztendlich die IP, die auch im Socket steht und mit der du verbunden bist.

Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
// Daten vom Server eingetroffen 
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin 
  Log.Lines.Add(Socket.ReceiveText); // lesen und ausgeben 
  ShowMessage(Socket.ReceiveText); 
end;


Besser :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// Daten vom Server eingetroffen 
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var MyMessage : string;
begin
  MyMessage := Socket.ReceiveText; // lesen
  Log.Lines.Add(MyMessage); // ausgeben 
  ShowMessage(MyMessage); // und nochmal ausgeben
end;


Probiers jetzt noch einmal aus. Auf Dauer würde ich Dir aber zur INDY-Komponente raten. Die ist wesentlich besser.

MfG

Quitzlinga
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.12.07 00:32 
Moin!

user profile iconbrainkopf hat folgendes geschrieben:
ich hoffe das ist genügend. xD
bin mir nicht sicher was dafür wichtig. ist.
Wenn man von dieser Zeile absieht, ist das exakt der Tutorial-Code: ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
// Daten vom Server eingetroffen
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  Log.Lines.Add(Socket.ReceiveText); // lesen und ausgeben
  ShowMessage(Socket.ReceiveText);
end;

Das klappt deshalb nicht, weil du zwei mal aus dem Socket liest, aber nur einmal Daten da sind; wenn du sie gelesen (und ins Memo ausgegeben hast), dann sind da keine Daten mehr. Wie man das Problem lösen kann, hat dir user profile iconQuitzlinga ja bereits gezeigt. ;)



user profile iconQuitzlinga hat folgendes geschrieben:
Mit der Socket-Komponente von Delphi kenne ich mich jetzt nicht so gut aus, aber folgende Dinge sind mir aufgefallen :
Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
// Verbindung erfolgt (connect) -> Meldung machen 
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); 
begin 
  Log.Lines.Add('Verbunden mit '+ServerAdress.Text); 
end;


Ersetz das am besten mal mit Socket.remotehost. Dadurch bekommst du letztendlich die IP, die auch im Socket steht und mit der du verbunden bist.
Das ist eigentlich Geschmacksache. Da im Editfeld ServerAdress der eingegebene Hostname steht, würde ich bei einer Meldung auch erwarten, dass da eine Verbindung zu meiner Eingabe hergestellt wurde (das sehe ich der IP-Adresse jedenfalls nicht direkt an).

user profile iconQuitzlinga hat folgendes geschrieben:
Auf Dauer würde ich Dir aber zur INDY-Komponente raten. Die ist wesentlich besser.
Sicherlich sind die Delphi-Sockets nicht state-of-the-art, aber ich wäre doch etwas vorsichtiger mit überschwänglichen Lobeshymnen auf die Indy-Kompos... :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Do 13.12.07 12:44 
Ja. den Code des Tutorilas habe ich noch nicht auf meine Ansprüche abgeändert, da ich zuerst die Funktion haben möchte.
Den kompletten Code werde ich nachher natürlich noch auf meine bedürfnisse abändern.
Ich hoffe ich darf den so verwenden. Als Grundlage.

Danke.

Also es funktioniert. Geht es jetzt noch, das die IP nicht in der Medlung angezeigt wird?
Weil die Meldung ist so aufgebaut: IP: Inhalt.
Die Ip finde ich in der Meldung etwas störend. Allerdings sollte sie in der Log stehen!
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Do 13.12.07 12:53 
Hallo,

wie wärs mit UDP-Multicast?

Da wäre dann kein Server notwendig.

r u

René

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.12.07 13:28 
Moin!

user profile iconbrainkopf hat folgendes geschrieben:
Ich hoffe ich darf den so verwenden. Als Grundlage.
Klar, ist ja zum Lernen da. ;)

user profile iconbrainkopf hat folgendes geschrieben:
Also es funktioniert. Geht es jetzt noch, das die IP nicht in der Medlung angezeigt wird?
Weil die Meldung ist so aufgebaut: IP: Inhalt.
Ja, das geht. Die Nachricht wird im Server erstellt und dann an alle Clients gesendet. Aber das wird ausführlich im Tutorial-Text erläutert, bitte da nochmal nachlesen. :les: :think: ;)

user profile iconbrainkopf hat folgendes geschrieben:
Die Ip finde ich in der Meldung etwas störend. Allerdings sollte sie in der Log stehen!
Wenn du das Tut durchgearbeitet hast, sollte es klar sein, wie und wo man dafür ändern muss. Falls es nach der Lektüre noch nicht klar sein sollte, kannst du ja nochmal nachfragen.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Do 13.12.07 19:28 
So.
Also das funktioniert jetzt.
Habs zwar nicht so genau gemacht, aber es funzt.

Jetzt aber nen anderes Problem.
Wenn ich sage, Form1.destroy; läuft der Prozess ja noch weiter.
Allerdings kommen die Meldungen nichtmehr durch.
Gibt es eine möglichtkeit, die Meldungen unabhänig von Form1 zu machen?

Ich würde nämlich gerne Form1 verschwinden lassen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.12.07 19:39 
Moin!

user profile iconbrainkopf hat folgendes geschrieben:
Wenn ich sage, Form1.destroy; läuft der Prozess ja noch weiter.
Du darfst das Hauptformular einer VCL-Anwendung nicht einfach freigeben, das führt zu Fehlern. :? Es sollte doch reichen, dieses zu verstecken: Form1.Hide; :idea:

Btw: Bitte nur ein Thema pro Topic, das führt sonst zu Chaos. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Do 13.12.07 19:48 
trotzdem danke. hat funktioniert.

also ich würde sagen, das Thema ist dann wohl geklärt!

Vielen Dank an alle die mir geholfen haben!
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: So 16.12.07 20:21 
Also ich habe das Programm gerade mit nem 2. Pc probiert!

Es funzt nicht!
Es kommt immer ein Fehler! Ich kann nicht verbinden.
Anschließen hängt sich das Programm total auf

Fehler 10060

das ist der Fehler!