![]() |
Delphi-Version: 5
Chattool - Probleme beim Übermitteln des Usernames
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: ![]() Wenn man sich verbindet sieht es dann so aus: ![]() 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 |
AW: Chattool - Probleme beim Übermitteln des Usernames
puish
|
AW: Chattool - Probleme beim Übermitteln des Usernames
Pushen erst nach mindestens 24 Stunden! :warn:
|
AW: Chattool - Probleme beim Übermitteln des Usernames
hoi,
ich vermute der Fehler liegt in "ClientRead"
Delphi-Quellcode:
cya
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; |
AW: Chattool - Probleme beim Übermitteln des Usernames
Das sollte sich beim Debuggen aber herausfinden lassen.
|
AW: Chattool - Probleme beim Übermitteln des Usernames
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 ![]() ![]() Wenn es etwas zum spielen ist, braucht man dann evtl. auch keinen Server mehr, so dass ![]() 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz