Thema: Delphi Chat mit den Sockets

Einzelnen Beitrag anzeigen

Berlinermauer

Registriert seit: 3. Okt 2007
Ort: 0x0000
213 Beiträge
 
Delphi 7 Personal
 
#1

Chat mit den Sockets

  Alt 3. Okt 2007, 08:28
Also :

Ich habe einen Chat mit den Sockets ...

die chat übertragung ist nicht p2p sondern peer 2 Server 2 Peer ...

sprich Herr a schreibt "hi" zu Herr b ... diese nachricht "hi" wird dann an den Server gesendet und dieser Sendet die dann an Herr B ...

Das dies geht muss der Server auch wissen welche Connection ID der Herr B hat ...

Der Herr B sendet beim Starten des Clients ne Nachricht an den Server das er on ist und seine ip ....


Wie kann ich die ID rausfinden, sodass die nachricht weitergeleitet wird ? so würde die der Server bekommen und dir würde dort vergammeln ... sprich : Ich brauche etwas wo die ganzen Usernamen und ihre IDS gespeichert sind ...

Hier mal die Sources :

Server:

Delphi-Quellcode:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ServerSocket1: TServerSocket;
    Label1: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  Stop: Integer;
  messagefromclient: String;
  ip_7: String;
  ip_98: String;
  ip_3: String;
  ip_2: String;



implementation

{$R *.dfm}



procedure TForm1.Button2Click(Sender: TObject);
begin
ServerSocket1.Active := False;
ShowMessage('Server Stopped!');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.Active := True;
ShowMessage('Server Started');
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Label1.Caption := 'Verbindung eines Clienten Bekommen ... ';
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
messagefromclient := ServerSocket1.Socket.ReceiveText;
CUTIP := Pos('/login', messagefromclient);
if CUTIP <> 0 then
Delete(CUTIP, 1,7);

if cutip = '192.168.0.7then begin
ServerSocket1.Socket.SendText('Chat gestartet!');
end
else begin
If cutip = '192.168.0.7then begin
ip_7 := ;// Hier bekommt die variable die ID ZUGEWIESEN
ShowMessage(ip_7);
end
else begin
If cutip = '192.168.0.98then begin
ip_7 := ;// Hier bekommt die variable die ID ZUGEWIESEN
ShowMessage(ip_98);
end
else begin
If MessageFromClient = '192.168.0.3then begin
ip_7 := ;// Hier bekommt die variable die ID ZUGEWIESEN
ShowMessage(ip_3);
end
else begin
If MessageFromClient = '192.168.0.2then begin
ip_7 := ;// Hier bekommt die variable die ID ZUGEWIESEN
ShowMessage(ip_2);
end
else begin
Serversocket1.Socket.SendText (messagefromclient);
End;
End;
end.
Client
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ClientSocket: TClientSocket;
    Nicklbl: TLabel;
    Nickname: TEdit;
    nickbut: TButton;
    chatlog_memo: TMemo;
    Nachrichted: TEdit;
    sendenbut: TButton;
    connectbut: TButton;
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    procedure nickbutClick(Sender: TObject);
    procedure connectbutClick(Sender: TObject);
    procedure sendenbutClick(Sender: TObject);
    procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocketConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  nicknamevar: string;
  str: string;
  ip: String;
  MEINEIP: String;

implementation

{$R *.dfm}

procedure TForm1.nickbutClick(Sender: TObject);

begin

//nickbut heißt unser "Nickname setzen" Button
// NickName heißt unser Edit-Feld
//nicklbl ist der "Nickname" Label


nickbut.Enabled := false;
Nickname.Enabled := false;
nicklbl.Enabled := false;
nicknamevar := nickname.Text;

//Die restlichen Buttons/Memos/Edits aktivieren

chatlog_memo.Enabled := true;
Edit1.Enabled := True;
Connectbut.Enabled := True;
end;

procedure TForm1.sendenbutClick(Sender: TObject);
begin
//sendenbut heißt unser "Senden" Button

//nachrichted heißt unsere "Deine Nachricht..." Box

//chatlog_memo ist unsere "Chat-Log" Memo

if nachrichted.Text = '/helpthen begin
Chatlog_memo.Lines.Add('SERVER: Command Listing Started !');
Chatlog_memo.Lines.Add('/exit : Beende die Sitzung mit dem Partner');
Chatlog_Memo.Lines.Add('/ip [Address] : Verbinde mit Folgender Client IP');
Chatlog_Memo.Lines.Add('SERVER: Command Listing Stopped');
end
else begin
try
chatlog_memo.Lines.Add(nicknamevar + ' sagt: ' + nachrichted.Text);
ClientSocket.Socket.SendText(nicknamevar + ' sagt: ' + nachrichted.Text);
except
chatlog_memo.Lines.Add('Server Error : Verbindung zum Server gescheitert ! entweder blockt eine Firewall den Port oder er ist Belegt oder der Server ist Offline');
ShowMessage('Error ! Verbindung zum Server gescheitert ! entweder blockt eine Firewall den Port oder er ist Belegt oder der Server ist Offline');
end;
end;
nachrichted.Text := '';
end;

procedure TForm1.connectbutClick(Sender: TObject);
begin
//connectbut heißt unser "Connect" Button
//EDIT1 heißt unsere "127.0.0.1" Edit-Box
//ClientSocket heißt unser TClientSocket
sendenbut.Enabled := True;
Nachrichted.Enabled := True;
If Edit1.Text = 'Elkethen
IP := '192.168.0.7';
If Edit1.Text = 'Michaelthen
IP := '192.168.0.2';
IF Edit1.Text = 'Nicolathen
IP := '192.168.0.98';
IF Edit1.Text = 'Marcthen
IP := '192.168.0.3';

ClientSocket.Host := '192.168.0.3';
ClientSocket.Port := 1994;

//Verbindung aufbauen:
try
ClientSocket.Active := true;
ClientSocket.Socket.SendText('/ip ' + IP);
except
chatlog_memo.Lines.Add('Server Error : Verbindung zum Server gescheitert ! entweder blockt eine Firewall den Port oder er ist Belegt oder der Server ist Offline');
ShowMessage('Error ! Verbindung zum Server gescheitert ! entweder blockt eine Firewall den Port oder er ist Belegt oder der Server ist Offline');
end;
chatlog_memo.Lines.Delete(1);
Chatlog_memo.Lines.Add('Herzlich Willkommen in FAM-ICQ Sie sind verbunden mit dem Server 192.168.0.3');
ChatLog_Memo.Lines.Add('Tippen Sie /help ein um Die Kommandos zu sehen !')
end;

procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin

//in str speichern wir den ankommenden String

//und geben es dann in der memo aus.

str := ClientSocket.Socket.ReceiveText;
If str = '/exitthen begin
ShowMessage('Der Partner hat die verbindung Beendet ... bitte starten sie FAMICQ Neu !');
Form1.Close;
end
else begin
chatlog_memo.Lines.Add(str);
end;
end;
procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
begin

//adresselbl ist das Label "Adresse:"

Edit1.Enabled := false;
connectbut.Enabled := false;
ShowMessage('Sie Wurden Verbunden !');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket.Socket.SendText('/login' + MEINEIP);
end;

end.
Marc S.
  Mit Zitat antworten Zitat