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:
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:
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 with IdTCPClient1 do begin Host := Form1.Edit3.Text; Port := StrToInt(Form1.Edit2.Text); Connect; end; RecvThread := TRecvThread.Create(False); Button2.Enabled := False; Button3.Enabled := True; end;
procedure TForm1.Button3Click(Sender: TObject); begin RecvThread.Terminate; repeat Application.ProcessMessages; until RecvThread.Terminated; IdTCPClient1.Disconnect; Button2.Enabled := True; Button3.Enabled := False; end;
procedure TForm1.Button1Click(Sender: TObject); begin IdTCPClient1.Socket.WriteLn(Form1.Edit1.Text); Form1.Edit1.Text := ''; end;
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