AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fragen zu Chat.

Ein Thema von MisterC · begonnen am 15. Feb 2012 · letzter Beitrag vom 16. Feb 2012
Antwort Antwort
MisterC

Registriert seit: 14. Feb 2012
11 Beiträge
 
Delphi 7 Personal
 
#1

Fragen zu Chat.

  Alt 15. Feb 2012, 15:59
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:
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.
Und des Clients

Delphi-Quellcode:
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.
Ihr würdet mir dabei sehr helfen alle die mir geholfen haben werden im serverprotokoll angezeigt (Solang erwünscht).

Falls ihr noch Screenshots braucht schreibt es mir.

Lg MisterC
Fabian

Geändert von r_kerber (16. Feb 2012 um 07:13 Uhr) Grund: Delphi-Tags gesetzt
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Fragen zu Chat.

  Alt 15. Feb 2012, 16:07
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
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
MisterC

Registriert seit: 14. Feb 2012
11 Beiträge
 
Delphi 7 Personal
 
#3

AW: Fragen zu Chat.

  Alt 15. Feb 2012, 16:21
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
Fabian
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Fragen zu Chat.

  Alt 15. Feb 2012, 16:49
Normalerweise Programmiere ich nichts mit Server.
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]
...
Das ist doch schon ein Anfang, jetzt musst du nur noch schauen das der Server/Client weis was du da verschickst bzw was er bekommt, sprich du musst in deine Message eine art Identifier packen. Der kann in etwa so aussehen #100#. Server und Client wissen dann, aha #100# das ist eine Message sprich Text das heißt das was dahinter steht muss ich auf mein Memo packen.

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.


ps:was meist du mit Delphi tags
Code:
[DELPHI][/DELPHI]
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
MisterC

Registriert seit: 14. Feb 2012
11 Beiträge
 
Delphi 7 Personal
 
#5

AW: Fragen zu Chat.

  Alt 15. Feb 2012, 17:38
könntest du das mit dem nickname und dem password genauer erklären ich hätte nur ne idee


[edit3.Text= #100# ]
Fabian
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Fragen zu Chat.

  Alt 15. Feb 2012, 23:06
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:

procedure 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 = 'Passwortthen //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;
//Client
Delphi-Quellcode:
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;
Soweit für die Kommunikation zwischen den Beiden. Die Werte von mir wie #100 usw. kannst du dir anpassen wie du willst.

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:
//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.
So hoffe ich konnte dir das System ein wenig näher bringen.

Gruß
NickelM
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
MisterC

Registriert seit: 14. Feb 2012
11 Beiträge
 
Delphi 7 Personal
 
#7

AW: Fragen zu Chat.

  Alt 16. Feb 2012, 20:31
Vielen Vielen Dank du hast mir sehr geholfen. Ich hoffe ich habe dich nicht zu viel Arbeit gekostet.http://1.2.3.12/bmi/www.delphipraxis...s/icon_sad.gif

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.
Fabian
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Fragen zu Chat.

  Alt 16. Feb 2012, 23:23
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:
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);
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.

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:
NachrichtAnServer := #107 + Nickname + ';' + Text; Zum Trennen kannst du ja mal selber schauen, es gibt zum Trennen von Texten 3 Funktionen,
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 (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.
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.

Geändert von NickelM (16. Feb 2012 um 23:50 Uhr)
  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 19:37 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