![]() |
Fragen zu Chat.
Ich habe wieder ma eine Frage.
Unzwar Ich habe wie vllt.mansche wissen einen Chat Programmiert.Jetzt Würde oich aber dieses noch ein Wenig ausbauen.In folgenden Punkten: Wichtig-OnlineListe, Wichtig-Nachricht an bestimmte User die online sind Nicht so Wichtig-(Geht es die über ein Plugin zu regeln das alle 2 Minuten eine Meldung kommt das man sich im Forum anmelden soll.Und wenn man sich angemeldet hat ein Plugin bekommt das die Nachricht deinstalliert?) Wichtig-Nickname(Bis jetzt )wird nur eine Ip angezeigt. Wichtig-Server mit Passwort schützen(Im grunde habe ich den Chat für die Firma meines Vaters Programmiert.Daher will ich das sich nicht jeder einloggen kann.) Hier die Codes des client und Servers. Server:
Delphi-Quellcode:
Und des Clients
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp, XPMan; type TForm1 = class(TForm) Label1: TLabel; Port: TEdit; GroupBox1: TGroupBox; Memo1: TMemo; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Senden: TEdit; User: TLabel; Server: TServerSocket; XPManifest1: TXPManifest; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Userzahl:Integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Server.Port:=strtoint(Port.Text); Server.Active:=True; Button1.Enabled:=False; Button2.Enabled:=True; Memo1.Lines.Add('Status: Server gestartet.'); Memo1.Lines.Add(Viel Spaß) ; end; procedure TForm1.Button2Click(Sender: TObject); begin Server.Port:=strtoint(Port.Text); Server.Active:=False; Button1.Enabled:=True; Button2.Enabled:=False; Memo1.Lines.Add('Status: Server angehalten.'); sleep(600); Memo1.Clear; Memo1.Lines.Add('Chatserver v1.0 (by Fabian Cernota)'); end; procedure TForm1.Button3Click(Sender: TObject); begin Memo1.Lines.Clear; Memo1.Lines.Add('Server 1.0'); end; procedure TForm1.Button4Click(Sender: TObject); var i:Integer; begin for i := 0 to Server.Socket.ActiveConnections - 1 do Server.Socket.Connections[i].SendText('Nachricht vom Server: ' + Senden.Text); Memo1.Lines.Add('Nachricht vom Server: ' + Senden.Text); end; procedure TForm1.Button5Click(Sender: TObject); begin Server.Active:=False; Application.Terminate; end; procedure TForm1.FormDestroy(Sender: TObject); begin Server.Active:=False; end; procedure TForm1.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' verbunden.'); Userzahl:=Userzahl +1; User.Caption:='User: ' + inttostr(Userzahl); end; procedure TForm1.ServerClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' getrennt.'); Userzahl:=Userzahl -1; User.Caption:='User: ' + inttostr(Userzahl); end; procedure TForm1.ServerClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + 'hat den Fehler: ' + inttostr(Errorcode)); Userzahl:=Userzahl -1; User.Caption:='User: ' + inttostr(Userzahl); end; procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var i:integer; Nachricht:AnsiString; begin Nachricht:=Socket.RemoteAddress + ': ' + Socket.ReceiveText; Memo1.Lines.Add(Nachricht); for i := 0 to Server.Socket.ActiveConnections - 1 do Server.Socket.Connections[i].SendText(Nachricht); end; end.
Delphi-Quellcode:
Ihr würdet mir dabei sehr helfen alle die mir geholfen haben werden im serverprotokoll angezeigt (Solang erwünscht).
unit clientunit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp, XPMan; type TForm1 = class(TForm) Label1: TLabel; Host: TEdit; Label2: TLabel; Button1: TButton; Button2: TButton; GroupBox1: TGroupBox; Memo1: TMemo; GroupBox2: TGroupBox; Senden: TMemo; Button3: TButton; Port: TEdit; Client: TClientSocket; XPManifest1: TXPManifest; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Client.Host :=Host.Text; Client.Port:=Strtoint(Port.Text); Client.Active :=True; Button1.Enabled:=False; Button2.Enabled:=True; end; procedure TForm1.Button2Click(Sender: TObject); begin Client.Host :=Host.Text; Client.Port:=Strtoint(Port.Text); Client.Active :=False; Button1.Enabled:=True; Button2.Enabled:=False; end; procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add('Status: verbunden mit: ' +Socket.RemoteAddress); end; procedure TForm1.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add('Status: getrennt von: ' +Socket.RemoteAddress); end; procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add(Socket.ReceiveText); end; procedure TForm1.Button3Click(Sender: TObject); begin Client.Socket.SendText(Senden.Text); end; end. Falls ihr noch Screenshots braucht schreibt es mir. Lg MisterC:roll: |
AW: Fragen zu Chat.
Hast du dir den schon Gedanken gemacht, wie du die von dir genannten Punkt umsetzten willst und stehst irgendwo auf dem Schlauch oder hast ud überhaupt keine Idee?
Desweiteren zwecks besserer Lesbarkeit könntest du Delphi Tags benutzen :) |
AW: Fragen zu Chat.
Normalerweise Programmiere ich nichts mit Server.
Doch mein Vater hat gefragt ob ich es für ihn machen könnt. Ich will aber meinem Vater nicht sagen das ich es nicht packe. Bin gut im Breich technik und Pc. ich hätte nur die idee das man den nickname in ne Variable packe und mit dem socket schicke. Den Nickname gibt man dann in ein Edit ein. Außerdem weiß ich das jeder client eine Nummer bekommt also 1.client [0] 2.Client [1] ... Für die anderen dinge habe ich keine Idee ps:was meist du mit Delphi tags |
AW: Fragen zu Chat.
Zitat:
Das mit dem Passwort, dazu würde ich erst einmal das Passwort verschlüsselt an den Server schicken, der Server schaut dann ob das Passwort stimmt, wenn nicht kannst du entweder den Client wieder disconnected oder einfach keine Nachrichten an ihn rausschreiben. Zitat:
Code:
[DELPHI][/DELPHI]
|
AW: Fragen zu Chat.
könntest du das mit dem nickname und dem password genauer erklären ich hätte nur ne idee
[
Delphi-Quellcode:
]
edit3.Text= #100#
|
AW: Fragen zu Chat.
Hallo,
Also wenn ich so ein ServerClient System baue, gehe ich immer so vor: 1. Wie schon jemand erwähnt eine Art Indikator, d.h. ein Wert der der Client an den Server und umgekehrt sendet, woher er weis, was er mit den einkommenden Daten machen soll. Normalerweise deklariert man einen Type, der als Byte von Delphi umgesetzt wird und den an den Server sendet, da das Empfangen dadurch ein bischen Komplizierter wird, kann man auch einen Char (ein Zeichen) verwenden, was auch schon erwähnt wurde. Z.B. wegen dem Passwort: //Server
Delphi-Quellcode:
//Clientprocedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var i:integer; Nachricht,SendText :AnsiString; begin Nachricht:= Socket.ReceiveText; If Nachricht[1] = #101 then //Erstes Zeichen überprüfen und Passwort filtern begin Delete(Nachricht,1,1); //Erstes Zeichen von der Nachreicht entfernen, damit wir nur das Passwort haben. If Nachricht = 'Passwort' then //Bei 'Passowrt' das Passwort, das dein Vater haben möchte. begin //Wenn Passwort übereinstimmt, sende "Richtig Befehl" an client; SendText := #102; //Richtig end else begin SendText := #103; //Falsch end; end; end. procedure TForm1.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket); var Text : AnsiString; begin //Die Socket Variable kann man dazu benutzen direkt mit dem Client zukomumnizieren Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' verbunden.'); Text := #100 //Z.B. für die Passwort abfrage Socket.SendText(Text); end;
Delphi-Quellcode:
Soweit für die Kommunikation zwischen den Beiden. Die Werte von mir wie #100 usw. kannst du dir anpassen wie du willst.
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var Text : AnsiString; SendT : AnsiString; begin Text := Socket.ReceiveText; If Text[1] = #100 then //mit Text[1] überprüfst du das erste zeichen begin //Dialog oder sonstwas anzeigen zur Passwortabfrage. Variable SendT mit dem Eingegeben Passwort füllen. SendT := #101 + Passwort; //Passwort ist ein Platzhalter für z.b. Edit1.Text oder ähnliches Socket.SendText(SendT); end; Text := Socket.ReceiveText; //Antwort empfangen, es kann sein das du den grad gesendet text bekommst, bin mir nicht sicher, da ich normalerweise immer die Indy Komponenten dafür nehme. If Text[1] = #102 then //mit Text[1] überprüfst du das erste zeichen begin //Passwort war richtig end else If Text[1] = #103 then begin //Passwort war falsch end; end; Wegen dem Nicknamen würde ich mit 2 StringListen( musst du selbst per Code erstellen) arbeiten, oder 2 ListBoxen. Diese sind nur beim Server. In der einen Schreibst du die Socket.RemoteAddress und in der anderen den Nicknamen. Den Nicknamen für eine Adresse bekommst du dan so:
Delphi-Quellcode:
So hoffe ich konnte dir das System ein wenig näher bringen.
//Adressen, NicknamenList sind ListBoxen
var Nickname : String; Nickname := NicknamenList[Adressen.IndexOf(Socket.RemoteAddress)]; //IndexOf gibt dir den Index in der Liste von Adressen, da beide gleichviele Einträge und zu jeder Adresse ein Nickname existiert, kannst du mit dem Index von Adressen, dir den Nicknamen von der Adresse ausgeben lassen. Gruß NickelM |
AW: Fragen zu Chat.
Vielen Vielen Dank du hast mir sehr geholfen. Ich hoffe ich habe dich nicht zu viel Arbeit gekostet.
![]() Doch das mit dem Nickname versteh ich noch nicht so wirklich folgendes habe ich mir gedacht. var Nickname := Ansistring; dann denke ich wieder mit so einem #106 verbinden: Nickname:= #106 + Nickname.Text; doch weiter habe ich nicht verstanden. Lg MisterC ps:Ich habe dich im Quellcode genannt werde dich auch im About nennen. Vielleicht könntest du mir per Pn deinen Richtigen namen senden damit ich ihn nennen kann den mit Forenname is en bisschen blöd. |
AW: Fragen zu Chat.
Du schickst den Nicknamen genauso wie das Passwort und ließt es dann so auch aus.
Das hinzufügen machst du dan so: //Server
Delphi-Quellcode:
NicknamenList und Adressen sind ListBoxen, die du auf das Form setzt und die Eigenschaft Visible auf False setzt, so siehst du sie nicht. Du kannst sie auch sichtbar lassen, um zu sehen, ob er die richtige Adresse nihmt.
If Nachricht[1] = #101 then
begin Delete(Nachricht,1,1); //Nun hast du in der Variable Nachricht den eingebeben Nicknamen beim Server. NicknamenList.Items.Add(Nachricht); Adressen.Items.Add(Socket.RemoteAddress); Das Lesen der Nicknamen,also der User die angemeldet sind, machst du über nen anderes "Zeichen", das du an den Server sendest und dann Sendest du mit einer For-Schleife alle Nicknamen, die angemeldet. (Der Client Empfängt dann alle Nicknamen und speichert die sich auch in einer ListBox). Falls du dan eine PN an den Nicknamen senden willst, musst du wieder ein anderes "Zeichen" und den Nicknamen, danach ein Zeichen, zum Trennen des Nicknamen und der Nachricht. In so einer Form:
Delphi-Quellcode:
Zum Trennen kannst du ja mal selber schauen, es gibt zum Trennen von Texten 3 Funktionen,
NachrichtAnServer := #107 + Nickname + ';' + Text;
1. Pos (Liefert die Position eines Zeichens) 2. Copy (Liefert einen String/AnsiString, von Position aus mit einer bestimmten Länge) 3. Length(Liefert die Länge eines Strings/AnsiStrings) Kleine Hausaufgabe :-D (du sollst dich ja auch mal ein bischen damit beschäftigen, bzw. Delphi Hilfe stöbern.) Wie trenne ich Nicknamen und Text beim Server, die ich vom Client erhalten habe. Gruß NickelM P.S.: Versuch mal ob du das hinbekommst. Weitere Fragen kannst du ja per PN stellen, da dieser Thread sonst ewig lang wird. :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 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