Autor Beitrag
isch
Hält's aus hier
Beiträge: 1


Delphi 2005
BeitragVerfasst: Di 21.11.06 17:59 
Hi Leutz,

bin im Internet bei meiner Suche auf dieses Forum gestoßen und dachte mir, dass mir hier eventuell jemand helfen kann. Ich bin noch recht neu, was Verbindungen über TCP/IP per Indykomponenten IdTCPServer und IdTCPClient angeht, aber irgendwie komme ich im Moment absolut nicht weiter. Ich versuche für den Anfang einen einfachen Chat zu schreiben. Ein Rechner betreibt den Server und einer ist dann eben der Client. Was bisher sehr gut funktioniert ist, dass der Server beim Connecten eine festgelegte Message an den Clienten schickt und der gibt diese in einem Memo aus. Zudem klappt auch sehr gut, dass der Client eine Message aus einem Eingabefeld abschickt und der Server diese dann zeitgleich ebenfalls in einem Memo ausgibt. Das funktioniert auch mit mehreren Messages hintereinander.

Bisher habe ich allerdings nicht den Fehler gefunden, warum der Server keine Message an den Clienten schicken kann (und zwar auch eine Message aus dem Eingabefeld beim Drücken von Enter oder einem Buttonclick). Das unter "Edit1KeyPress" geschriebene WriteLn nimmt er einfach nicht an und eine andere Lösung finde ich nicht.

Ich habe hier jetzt mal beide Quelltexte gepostet. Wenn sich jemand meiner annehmen würde, wäre ich demjenigen sehr sehr dankbar!


Quelltext des Servers:

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:
var
  Form1: TForm1;
  nachricht: string;

implementation

{$R *.dfm}


procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
 with AContext.Connection.IOHandler do
  begin
    WriteLn('Verbindung erfolgreich hergestellt.');
    while Form1.IdTCPServer1.Active = True do
    begin;
     nachricht := ReadLn;
     Form1.Memo1.Lines.Add(nachricht);
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 IdTCPServer1.DefaultPort := StrToInt(Form1.Edit2.Text);
 IdTCPServer1.Active := True;
 Form1.Button2.Enabled := False;
 Form1.Button3.Enabled := True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 IdTCPServer1.Active := False;
 Form1.Button2.Enabled := True;
 Form1.Button3.Enabled := False;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
Form1.Memo1.Lines.Clear;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #13 then
 begin
  WriteLn(Form1.Edit1.Text);
  Form1.Edit1.Text := '';
 end;
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
 with AContext.Connection.Socket do
 begin
  WriteLn('Hello');
 end;
end;

end.


Quelltext des Clienten:

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:
var
  Form1: TForm1;
  RecvThread : TRecvThread;

implementation

{$R *.dfm}

procedure TRecvThread.Execute;
begin
 while not Terminated do begin
  try
   nachricht := Form1.IdTCPClient1.Socket.ReadLn;
   Synchronize(ReceivedLine);
   except
   Terminate;
   end;
 end;
end;

procedure TRecvThread.ReceivedLine;
begin
if Copy (nachricht,1,4) = '-Err' then
 MessageDlg(Copy(nachricht,5,Length(nachricht)), mtError, [mbOK],0)
 else
 Form1.Memo1.Lines.Add(nachricht);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//Verbindung zum Host aufbauen
 with IdTCPClient1 do
 begin
  Host := Form1.Edit3.Text;
  Port := StrToInt(Form1.Edit2.Text);
  Connect;
 end;
//Thread erstellen und Button deaktieren/aktivieren
RecvThread := TRecvThread.Create(False);
Button2.Enabled := False;
Button3.Enabled := True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//Thread deaktiveren
RecvThread.Terminate;
repeat
 Application.ProcessMessages;
 until RecvThread.Terminated;
IdTCPClient1.Disconnect;
Button2.Enabled := True;
Button3.Enabled := False;
end;

//Bei Klick auf "Senden" --> Nachricht an Server schicken
procedure TForm1.Button1Click(Sender: TObject);
begin
 IdTCPClient1.Socket.WriteLn(Form1.Edit1.Text);
 Form1.Edit1.Text := '';
end;

//Bei Drücken der Taste Enter --> Nachricht an Server schicken
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #13 then
 begin
  IdTCPClient1.Socket.WriteLn(Form1.Edit1.Text);
  Form1.Edit1.Text := '';
 end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 Form1.Memo1.Lines.Clear;         
end;

end.


Viele Grüße und Danke schonmal!
Sven - Oliver
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 24.11.06 23:09 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);  
begin  
 if Key = #13 then  
 begin  
  WriteLn(Form1.Edit1.Text);  
  Form1.Edit1.Text := '';  
 end;  
end;

Achtung! Das WriteLn bezieht sich hier auf die Applikation und nicht auf die Komponente. Da muss IdTCPServer... davor.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)