Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Chat mit den Sockets (https://www.delphipraxis.net/100739-chat-mit-den-sockets.html)

Berlinermauer 3. Okt 2007 08:28


Chat mit den Sockets
 
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.7' then begin
ServerSocket1.Socket.SendText('Chat gestartet!');
end
else begin
If cutip = '192.168.0.7' then begin
ip_7 := ;// Hier bekommt die variable die ID ZUGEWIESEN
ShowMessage(ip_7);
end
else begin
If cutip = '192.168.0.98' then begin
ip_7 := ;// Hier bekommt die variable die ID ZUGEWIESEN
ShowMessage(ip_98);
end
else begin
If MessageFromClient = '192.168.0.3' then begin
ip_7 := ;// Hier bekommt die variable die ID ZUGEWIESEN
ShowMessage(ip_3);
end
else begin
If MessageFromClient = '192.168.0.2' then 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 = '/help' then 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 = 'Elke' then
IP := '192.168.0.7';
If Edit1.Text = 'Michael' then
IP := '192.168.0.2';
IF Edit1.Text = 'Nicola' then
IP := '192.168.0.98';
IF Edit1.Text = 'Marc' then
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 = '/exit' then 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.

Sko 3. Okt 2007 09:29

Re: Chat mit den Sockets
 
Willkommen in der DP!

Zu dem Thema kann ich die Tutorials von Narses aus der Delphi Library empfehlen, die haben mir sehr geholfen: [link]. Eine Suche nach Chat tutorial hier in der DP hätte dir das hier gezeigt.

r2c2 3. Okt 2007 09:36

Re: Chat mit den Sockets
 
Bevor sich hier auch jemand fragt, was nun eigentlich das Problem ist:
http://forum.dsdt.info/viewtopic.php?t=34407

mfg

Christian

P.S.: Was ist eigentlich so schwer daran, Crossposts zu verlineken?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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