AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Chattool - Probleme beim Übermitteln des Usernames
Thema durchsuchen
Ansicht
Themen-Optionen

Chattool - Probleme beim Übermitteln des Usernames

Ein Thema von Lyan · begonnen am 31. Aug 2011 · letzter Beitrag vom 31. Aug 2011
Antwort Antwort
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#1

Chattool - Probleme beim Übermitteln des Usernames

  Alt 31. Aug 2011, 10:33
Delphi-Version: 5
Delphi-Version: XE


Hallo,

habe ein Chattool, das später zum kommunizieren per Wlan geeignet sein soll (das wir im unterricht miteinander schreiben können (ohne wlan)).

Das ganze sieht so aus:
http://imageshack.us/f/854/unconnected.png/

Wenn man sich verbindet sieht es dann so aus:
http://imageshack.us/photo/my-images...onnectedp.png/

Wie man an Abbildung 2 erkennen kann, ist im Fenster "--UserList--" alles leer. Beim Server wird aber ip + Username angezeigt.

ich möchte die Leute die verbunden sind in dem Fenster angezeigt haben, um später einen private chat zu realisieren.

Übrigens läuft das tool über TServerSocket und TClientSocket!

aber weiß grade nicht weiter! hier mal der code der Stelle:


Client:
Code:

procedure TFormClient.ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
richeditNachrichten.Lines.Add('Status: verbunden mit ' + socket.RemoteAddress);
//Server eigenen Namen mitteilen
client.socket.SendText(inttostr(edit1.color) + ';' + editusername.text + ';' + '!Connected#');
Timer2.Enabled := true;
end;

procedure TFormClient.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
richeditNachrichten.Lines.Add('Status: getrennt mit ' + socket.RemoteAddress);
//Eigenen Name wieder aus Liste auf Server löschen
client.socket.SendText(inttostr(edit1.color) + ';' + editusername.text + ';' + '!Disconnected#');
end;


procedure TFormClient.Timer2Timer(Sender: TObject);
begin
Form2.richeditusers.Clear;
//Kontaktliste abrufen
client.Socket.SendText(inttostr(edit1.color) + ';' + editusername.text + ';' + '!GetList#');
end;


procedure TFormClient.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i, iPos1, iPos2, iPos3 :integer;
    sFarbe, sText, sUsername, sIP: String;
begin
    sText := Socket.ReceiveText;

    if Pos('/', Trim(sText)) = 1 then
    begin
      iPos3 := Pos(';', sText);
      sIP := '';
      if iPos3 > 0 then
      begin
        sIP := Copy(sText, 2, iPos3-1);

        if sIP = sEigeneIP then
        begin
          sText := Copy(sText, iPos3+1, Length(sText));
          if Pos('!LIST#', sText) > 0 then
          begin
            sText := Copy(sText, Pos('#', sText) + 1, Length(sText));

            repeat
              if Pos(';', sText) > 0 then
              begin
                Form2.richeditusers.lines.Add(Copy(sText, 1, Pos(';', sText)-1));
                sText := Copy(sText, Pos(';', sText) + 1, Length(sText));
              end
              else
              begin
                Form2.richeditusers.lines.Add(Copy(sText, 1, Length(sText)));
                sText := '';
              end;
            until Length(sText) > 0;

          end;
        end;
      end;
      Exit;
    end;

    iPos1 := Pos(';', sText);
    sFarbe := '';
    if iPos1 > 0 then
    begin
      sFarbe := copy(sText, 1, ipos1 -1);
      delete(sText, 1, iPos1);
    end;

    iPos2 := Pos(';', sText);
    if iPos2 > 0 then
    begin
      sUsername := copy(sText, 1, ipos2 -1);
      delete(sText, 1, ipos2);
    end;

    if (stext <> '') then
    begin

      if sFarbe = '' then
        sFarbe := '0';
      RichEditNachrichten.SelAttributes.Color := strtoint(sFarbe);
    richeditNachrichten.Lines.Add(sUsername + ' -> ' + sText);

    end;
end;

procedure TFormClient.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  Client.Socket.Close;
end;


Und der Server:

Code:
function TFormServerMain.fsGetChatterList : string;
var sList : string;
    iI : integer;
begin
  Result := '';
  sList := '';
  try
    for iI := 0 to ListBoxUser.Count - 1 do
    begin
      if iI = 0 then
        sList := sList + ListBoxUser.Items[iI]
      else
        sList := sList + ';' + ListBoxUser.Items[iI];
    end;
  finally
    Result := sList;
  end;
end;


procedure TFormServerMain.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i:integer;
    sNachricht: String;
    iPos1: Integer;
    iPos2: Integer;
    iPos3: Integer;
    sFarbe: String;
    sUsername: String;
    sText: String;
    sChatterList : string;
begin
  sChatterList := '';
  sNachricht := Socket.ReceiveText;
  iPos1 := Pos(';', sNachricht);
  if iPos1 > 0 then
  begin
    sFarbe := copy(sNachricht, 1, ipos1 -1);
    delete(sNachricht, 1, iPos1); //sNachricht := Copy(sNachricht,ipos1+1,length(sNachricht));
  end;

  iPos2 := Pos(';', sNachricht);
  if iPos2 > 0 then
  begin
    sUsername := copy(sNachricht, 1, ipos2 -1);
    delete(sNachricht, 1, ipos2);
  end;

  //Name von Client beim Connect erhalten
  if Pos('!Connected#', sNachricht) > 0 then
  begin
    ListBoxUser.Items.Add(Socket.RemoteAddress + '-' + sUsername);
  end
  else
  begin
    if Pos('!Disconnected#', sNachricht) > 0 then
    begin
      for i := 0 to ListBoxUser.Count - 1 do
      begin
        if ListBoxUser.Items[i] = Socket.RemoteAddress + '-' + sUsername then
        begin
          ListBoxUser.Items.Delete(i);
          Exit;
        end;
      end;
    end
    else
    begin
    if Pos('!GetList#', sNachricht) > 0 then
    begin
      //Liste der Chatter versenden
      sChatterList := fsGetChatterList;
      for i := 0 to server.Socket.ActiveConnections - 1 do
      begin
        server.Socket.Connections[i].SendText('/' + server.Socket.Connections[i].RemoteAddress + ';!LIST#' + sChatterList);
      end;
    end
    else
    begin
      for i := 0 to server.Socket.ActiveConnections - 1 do
        server.socket.Connections[i].SendText(sFarbe + ';' + sUsername + ';' + sNachricht);
      end;
    end;
  end;
end;

Ich hoffe jemand nimmt sich die Zeit ^.^ - Danke im vorraus

Geändert von Lyan (31. Aug 2011 um 10:45 Uhr)
  Mit Zitat antworten Zitat
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#2

AW: Chattool - Probleme beim Übermitteln des Usernames

  Alt 31. Aug 2011, 12:32
puish
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#3

AW: Chattool - Probleme beim Übermitteln des Usernames

  Alt 31. Aug 2011, 13:08
Pushen erst nach mindestens 24 Stunden!
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
soulies

Registriert seit: 9. Dez 2005
234 Beiträge
 
#4

AW: Chattool - Probleme beim Übermitteln des Usernames

  Alt 31. Aug 2011, 13:26
hoi,

ich vermute der Fehler liegt in "ClientRead"

Delphi-Quellcode:
procedure TFormClient.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var ... ;
begin
    ...
    ...

        if sIP = sEigeneIP then // <-- sEigeneIP wird wohl nicht oder falsch gesetzt sein und deshalb läuft er hier nicht durch
        begin
          ...
          Form2.richeditusers.lines.Add(Copy(sText, 1, Pos(';', sText)-1));
          ...
        end;
    
    ...
end;
cya
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Chattool - Probleme beim Übermitteln des Usernames

  Alt 31. Aug 2011, 13:28
Das sollte sich beim Debuggen aber herausfinden lassen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Chattool - Probleme beim Übermitteln des Usernames

  Alt 31. Aug 2011, 13:45
Der Code ist etwas unübersichtlich. Verwende doch bitte mal kürze aber aussagekräftige Namen. Z.B. RENews statt RicheditNachrichten.irgendwas.

Dann würde mich interessieren, ob es neben dem Code auch einen Plan gibt. Ich frage nicht von ungefähr, weil ich (mittlerweile) auch einen Chat programmiert habe; ebenfalls mit TServerSocket und TClientSocket. Ich fand das nicht trivial. So ist es m.E. zunächst wichtig herauszubekommen, was bei welchem Ereignis genau passiert.

Durchschaubar wurde es aber dann, als ich das hier durchgelesen hatte. Nach Deinen Ausführungen sollte aber auch das hier reichen.
Wenn es etwas zum spielen ist, braucht man dann evtl. auch keinen Server mehr, so dass auch das hier für Dich interessant sein könnte.

Bei späteren Detailfragen wurde mir dann hier in der DP sehr geholfen.
Ansonsten kann ich mich nur DaddyH anschließen, dass Du beim Debuggen mal nachsehen solltest, was der Client an den Server und der Server an den Client sendet. Denn es reicht nicht, dass der Client sagt, wie er heißt, der Server muss diesen (1.) in die Liste aufnehmen und (2.) die aktualisierte Liste an alle Clients rumreichen...

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr.
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