Chat Socket Problem

P@d3

Grünschnabel
Hallo,

Ich bin noch ein ziemlicher Delphi Anfänger und wollte einen
einfachen LAN Chat mit sockets schreiben. Das Problem ist,
das ich nich weiss, ob man in einer Anwendung Server und
Client in einem haben kann, ich denke nämlich dort liegt das
Problem. Hier erstma der Quelltext:

Code:
implementation

{$R *.dfm}

procedure TForm1.cb_lportClick(Sender: TObject);
begin

  //Buttons (de)aktivieren 
  if cb_listenport.checked = true then 
    e_listenport.enabled := true
  else 
    e_listenport.enabled := false;
end;

procedure TForm1.cb_ipClick(Sender: TObject);
begin
  //Buttons (de)aktivieren
  if cb_ip.checked = true then 
    e_ip.enabled := true
  else 
    e_ip.enabled := false;
end;

procedure TForm1.b_sendClick(Sender: TObject);
var 
  text:string;
begin
  text := e_sendtext.Text;
  //Nachricht fals leere Eingabe
  if e_sendtext.Text = '' then
  begin
    application.MessageBox('Bitte einen Text eingeben!', 'Fehler')
  end else //sonst Text anbsendne
  begin
    //Text senden
    clientsocket.Socket.SendText(text);
    //Text in Memo eintragen
    if m_text.lines[0] = '' then 
      m_text.lines[0] := TimeToStr(time)+' : '+text
    else
      m_text.lines.Add(TimeToStr(time)+' : '+text);
  end;
end;

procedure TForm1.cb_sportClick(Sender: TObject);
begin
  //Buttons (de)aktivieren
  if cb_sendport.checked = true then
    e_sendport.enabled := true
  else
    e_sendport.enabled := false;
end;

procedure TForm1.b_connectClick(Sender: TObject);
begin
  //Buttons (de)aktivieren
  if b_connect.caption = 'Verbinden' then
  begin
    //Button Einstellungen
    b_connect.Caption := 'Verbindung Trennen';
    b_send.enabled := true;
    //Server Einstellungen
    serversocket.port := StrToInt(e_listenport.Text);
    serversocket.Open;
    //Client Einstellungen
    clientsocket.Port := StrToInt(e_sendport.text);
    clientsocket.Host := e_ip.Text;
    clientsocket.open;
  end else
  begin
    //Button Einstellungen
    b_connect.Caption := 'Verbinden';
    b_send.Enabled := false;
    serversocket.Close;
    clientsocket.Close;
  end;
end;

procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var 
  text:string;
begin
  //Text empfangen
  text := socket.ReceiveText;
  if m_text.lines[0] = '' then
    m_text.Lines[0] := '=>'+timetostr(time)+' : '+text
  else
    m_text.Lines.add('=>'+timetostr(time)+' : '+text);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  serversocket.Close;
  clientsocket.Close;
end;

end.

Wenn ich versuche eine Verbingung zu erstellen, bekomme ich
immer die Fehlermeldung "Asynchroner Socker Fehler". Und die
Verbindung funktioniert nur in eine Richtung. Komischerweise
funktioniert es aber, wenn ich die Anwendung 2 mal auf
dem selben Rechner laufen lasse.
Vielleicht kann mir ja jemand sagen, was ich flasch gemacht habe.

Vielen Dank

P@d3
 
Zuletzt bearbeitet von einem Moderator:

Patrick Kamin

Erfahrenes Mitglied
-

Grundsätzlich ist es möglich, Server und Client in einer Anwendung zu nutzen. Bei den Delphi-Demos ist auch ein dementsprechendes Programm dabei, kannst dir dort ja mal angucken, wie die Mädels von Borland das gelöst haben.

Einen Fehler kann ich in deinem Programm so auf die schnelle nicht finden, aber der Fehler tritt häufig auf, wenn die Verbindungsdaten des Sockets nicht stimmen.

Ansonsten schnapp dir den Debugger und teste, wo er dich aus dem Programm rausschmeist.
 

P@d3

Grünschnabel
Danke

Vielen Dank!
Hab mir mal die das Demo Programm angeschaut
und den Fehler gefunden.

Danke für die Hilfe
P@d3