chat

yoshie117

Mitglied
hi leute,

ich bins mal wieder. Ich habe nun weitergearbitet und bin von den indy komponenten nun wieder auf die server und clientsocket von Delphi zurückgekommen, weil ich damit einfach besser klarkomme und man mehr hilfen hat. Nun habe ich wieder mal ein problem ich schreibe erstmal dazu den Quelltext:

Client:

Code:
     unit UClient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  Thauptfenster = class(TForm)
    cs: TClientSocket;
    Memo1: TMemo;
    Button1: TButton;
    text: TEdit;
    ListBox1: TListBox;
    Button2: TButton;
    ip: TEdit;
    nick: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure csRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
  name:string;
  end;

var
  hauptfenster: Thauptfenster;

implementation

{$R *.dfm}

procedure Thauptfenster.FormCreate(Sender: TObject);
begin
           cs.Port:=23;             // Festlegung des Ports
           cs.host:=ip.text;
end;


procedure Thauptfenster.Button2Click(Sender: TObject);
var name:string;
begin
cs.Active:=true;         // Aufbau der Verbindung
name:=nick.text;         //nickname in variable speichern
end;


procedure Thauptfenster.Button1Click(Sender: TObject);
begin

          if cs.Socket.Connected=true then      // wenn Verbindung besteht,
          cs.Socket.SendText(text.text);          // sendet er den text

end;


procedure Thauptfenster.csRead(Sender: TObject; Socket: TCustomWinSocket);

   var rec:String; 
         begin 
         rec:=socket.ReceiveText;      // der empfangene Text wird in die Variable 'rec' geschrieben
         Memo1.Lines.Add(rec);         // Ausgabe der Variable 'rec'

end;



end.

und der Quelltext von der serveranwendung

Server:

Code:
    unit UServer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    ss: TServerSocket;
    Memo1: TMemo;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure ssClientConnect(Sender: TObject; Socket: TCustomWinSocket);

  private
    { Private-Deklarationen }
  public
    rec:String;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
           ss.Port:=23;             // Festlegung des Ports 
           ss.Active:=true;         // Aktivierung der ServerSocket
end;

procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);

 var
  i: Integer;
begin
  rec:=Socket.ReceiveText;              //Empfangene Text wird in eine Variable geschrieben
  for i := 0 to ss.Socket.ActiveConnections -1 do
  begin
    ss.socket.Connections[i].SendText(rec);      //Server sendet Text an alle Clients
  end;



  end;


procedure TForm1.ssClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
   var
  i: Integer;
  name:string;
  begin
  
  for i := 0 to ss.Socket.ActiveConnections -1 do
  begin
    ss.socket.Connections[i].SendText('Herzlich Willkommen im Chat');      //Server sendet Text an neu angemeldeten Clients
  end;
end;

end.

Nun mein Problem. Ich möchte nun das der user seinen nick eingibt, dann wird dieser beim connecten zum server geschickt und wieder an alle clients zurückgegeben. Am Ende soll es darauf hinauslaufen dass sämtliche eingeloggte user in eine Combobox bei der clientanwenduung zu sehen sind.
kann mir da jemand weiterhelfen? Also Wertegang von der nickeingabe bis zur ausgefülten combobox. Wäre sehr freundlich

cu yoshie
 

Patrick Kamin

Erfahrenes Mitglied
-

Moin!
Als erstes solltest du einen Port benutzen, der nicht schon von einem anderen Dienst genutzt wird. Auf Port 23 liegt Telnet.
Hinzu kommt, dass du bei deiner ClientConnect() Ereignisprozedur keine Schleife durchlaufen brauchst, da du ja die Willkommensnachricht nur an den einen Client schicken willst.

Bekommst du denn irgendwelche Fehlermeldungen beim compilieren?


P.s Vergiß nicht, auch dem Clientsocket den richtigen Port mitzuteilen.
 

yoshie117

Mitglied
re

nein ich bekomme keine fehler beim compilieren. Sollte ich welche bekommen? Aber weiß du wie man das Problem was ich angesprochen habe, läsen kann?

mfg yoshie
 

Patrick Kamin

Erfahrenes Mitglied
-

Wenn das OnConnect Ereignis deiner TClientSocket Komponente eintritt, übermittelst du den Inhalt deiner Variable "Name" an den Server.

Bei deinem ClientConnect Ereignis von TServerSocket schickst du den Namen vom gerade angemeldeten Client an alle anderen.
Diese müssen dann dementsprechend mitbekommen, dass jetzt ein neuer Client angemeldet ist. Am besten wäre es, wenn du dir ein eigenes kleines Protokoll schreiben würdest, damit du weißt, wie die Nachrichten geparst werden müssen. Kannst auch den Aufbau vom Irc Protokoll nehmen, zu finden in der RFC 1459.
Wenn dann also ein Client hinzu kommt, brauchst du nur noch den Namen von dem zu parsen und ihn in eine Listbox schreiben.
 

yoshie117

Mitglied
re

hi aso ich bekomme infach keinen string geschickt vom client aus schicke ich bei connection
Code:
cs.Socket.SendText(name);
und bim server kommt bei onclientconnect
Code:
name:=socket.ReceiveText;
dann schicke ich es gleic weiter mit
Code:
Socket.SendText(name);
uund will es im clint augeben unter onconnect
Code:
namer:=socket.receivetext;
und dann halt noch mit
Code:
memo1.lines.add(name)
man sieht einfach nichts, also wird nichts übermittelt, schon ebim server kan man nicihts ausgeben. Weißt du was das Problem ist?

yoshie
 

Arne Buchwald

Erfahrenes Mitglied
hi,

ich arbeite immer noch an meinem chatprogramm. Und ich habe es bis jetzt noch nicht hinbekommen, den nick vom editfels (nick.text) an den server zu schicken, wo er dann ausgelesen wird. Hier ist noch mal mein quelltext.

client

Code:
unit UClient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  Thauptfenster = class(TForm)
    cs: TClientSocket;
    Memo1: TMemo;
    Button1: TButton;
    text: TEdit;
    ListBox1: TListBox;
    Button2: TButton;
    ip: TEdit;
    nick: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure csRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    procedure csConnect(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
  public
  name,namer:string;
  end;

var
  hauptfenster: Thauptfenster;

implementation

{$R *.dfm}

procedure Thauptfenster.FormCreate(Sender: TObject);
begin
           cs.Port:=2003;             // Festlegung des Ports
           cs.host:=ip.text;          // Festlegung der IP
end;


procedure Thauptfenster.Button2Click(Sender: TObject);
var name:string;
begin
cs.Active:=true;         // Aufbau der Verbindung
end;


procedure Thauptfenster.Button1Click(Sender: TObject);
begin

          if cs.Socket.Connected=true then      // wenn Verbindung besteht,
          cs.Socket.SendText(nick.text+' '+':'+' '+text.text);          // sendet er den text

end;


procedure Thauptfenster.csRead(Sender: TObject; Socket: TCustomWinSocket);

   var rec:String; 
         begin 
         rec:=socket.ReceiveText;      // der empfangene Text wird in die Variable 'rec' geschrieben
         Memo1.Lines.Add(rec);         // Ausgabe der Variable 'rec'

end;



procedure Thauptfenster.csConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
socket.SendText(nick.text);

end;

end.

server.

Code:
unit UServer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    ss: TServerSocket;
    Memo1: TMemo;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure ssClientConnect(Sender: TObject; Socket: TCustomWinSocket);

  private
    { Private-Deklarationen }
  public
    rec:String;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
           ss.Port:=2003;             // Festlegung des Ports
           ss.Active:=true;         // Aktivierung der ServerSocket
end;

procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);

 var
  i: Integer;
begin
  rec:=Socket.ReceiveText;              //Empfangene Text wird in eine Variable geschrieben
  for i := 0 to ss.Socket.ActiveConnections -1 do
  begin
    ss.socket.Connections[i].SendText(rec);      //Server sendet Text an alle Clients
  end;



  end;


procedure TForm1.ssClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
   var
  i: Integer;
  name:string;
  begin
 socket.SendText('Herzlich Willkommen im Chat');      //Server sendet Text an neu angemeldeten Clients
 listbox1.Items.add(socket.ReceiveText);
 end;

 end.

Ich hoffe Ihr könnt mir diesmal helfen also ich möchte halt diesen string des nicknames an den server schicken und dort in eins listbox eintragen. Ich habe jetzt wirklich fast 2 wochen dran gearbeitet und ich bekomme es nciht hin. BITTE helft mir.

Danke schön im Vorraus

Thomas
Bitte nicht für das selbe Thema einen neuen Thread eröffnen.

Btw.: Ich hatte dir damals meine Hilfe anhand des Demo-Programmes angeboten. Du wolltest sie nicht - damit ist für mich die Sache erledigt.
 

yoshie117

Mitglied
re

ja das hatte ich auch mitbekommen, nur arbeite ich nciht mehr mit den indy komponenten und da hilft mir das demo Programm nciht weiter. Deswegen hatte ich gehofft das mir noch mal jemand weiterhelfen kann. Weil zu den serversocket und clientsocket, gibt es zwar auch ein kleines demoprog aber das bringt mir bei meiner frage nciht weiter, weil das ein prog fü server und client ist und dort keine verschiedenen namen angezeigt werden. Hasst du eine Ahnuung wie ich das mit dem nick machen kann? Ich würde doch nicht fragen, wenn ich es wüßte. Du würdest mir echt weiterhelfen.

mfg thomas