Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Chat (IP) (https://www.delphipraxis.net/139186-chat-ip.html)

Schnittcher 25. Aug 2009 10:35


Chat (IP)
 
Hallo,

kann mir jemand helfen und mir sagen, was heir falsch ist?

Client:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, AppEvnts, ExtCtrls, ScktComp, IdBaseComponent, IdComponent,
  IdIPWatch;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    lbIP: TLabel;
    Label4: TLabel;
    Label3: TLabel;
    Label5: TLabel;
    edNachricht: TEdit;
    edIP: TEdit;
    edNickname: TEdit;
    cmdSenden: TButton;
    cmdSetzen: TButton;
    cmdNick: TButton;
    ClientSocket1: TClientSocket;
    ApplicationEvents1: TApplicationEvents;
    IdIPWatch1: TIdIPWatch;
    Timer1: TTimer;
    Label6: TLabel;
    lbNickname: TLabel;
    Memo1: TMemo;
    cmdVerlassen: TButton;
    ServerSocket1: TServerSocket;
    procedure cmdNickClick(Sender: TObject);
    procedure cmdVerlassenClick(Sender: TObject);
    procedure cmdSendenClick(Sender: TObject);
    procedure cmdSetzenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure delay(time:word);
    procedure Timer1Timer(Sender: TObject);
    procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
 var Nickname, Nachricht:String;
{$R *.dfm}

procedure TForm1.delay(time: word);
var Start:Integer;
begin
  Start:=GetTickCount;
  while (GetTickCount) - (Start) <= time do
  Application.ProcessMessages;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Create(Form1);
ClientSocket1.Create(Form1);
lbIP.Caption := IdIPWatch1.LocalIP; // Die aktuelle IP-Adresse wird angezeigt.
cmdSenden.Enabled:= false;
cmdSetzen.Enabled:= false;
label6.Visible:=False;
lbNickname.Visible:=False;
end;

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var msg: string;
begin
  Memo1.Lines.Add(Socket.ReceiveText);
end;

procedure TForm1.cmdNickClick(Sender: TObject);
begin
Nickname:= edNickname.Text;
//cmdSenden.Enabled:=True;
cmdSetzen.Enabled:=True;
//cmdNick.Visible:=False;
edNickName.Enabled:=False;
Label6.Visible:=True;
//lbNickname.Visible:=True;
lbNickname.Caption:= Nickname;
Label5.Visible:=False;

end;

procedure TForm1.cmdSendenClick(Sender: TObject);
begin
if (ClientSocket1.Active=true) and (edNachricht.Text<>'') then
CLientSocket1.Socket.SendText(Nickname+': ' +edNachricht.Text);
edNachricht.Text := '';
end;

procedure TForm1.cmdSetzenClick(Sender: TObject);
begin
ClientSocket1.Host:= edIP.Text;
ClientSocket1.Port:= 1990;
ClientSocket1.Active:= True;
cmdSetzen.Enabled:= False;
edIP.Enabled:= False;
cmdSenden.Enabled:= True;
Nachricht:= edNickName.Text+' hat den Raum betreten.';
delay(500);
ClientSocket1.Socket.SendText(Nachricht);

end;

procedure TForm1.cmdVerlassenClick(Sender: TObject);
begin
ClientSocket1.Socket.SendText(edNickName.Text+' hat den Raum verlassen.');
delay(500);
ClientSocket1.Close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
lbIP.Caption:= IdIPWatch1.LocalIP;
end;
end.
Server:

Delphi-Quellcode:
unit server;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    IdIPWatch1: TIdIPWatch;
    Label1: TLabel;
    ServerSocket1: TServerSocket;
    procedure FormCreate(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
label1.Caption:= IdIPWatch1.LocalIP;
ServerSocket1.Create(Form1);
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var Text:string;
i: Integer;
begin
Text:=Socket.ReceiveText;
Memo1.Lines.add(Timetostr(now)+': '+Text);
For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
with ServerSocket1.Socket.Connections [I] do
if (Connected) then SendText(Text);
end;
end;

end.
Es werden keine Nachrichten verschickt.

Gruß,
Schnittcher

inherited 25. Aug 2009 10:59

Re: Chat (IP)
 
-Du versuchst ClientSocket und ServerSocket im FormCreate manuell zu erzeugen, dabei passiert das automatisch, weil die Komponenten auf der Form liegen
-Du erzeugst sie auch noch falsch. SChau dir evtl. mal ein OOP-Tutorial an.
-Dem ServerSocket muss gesagt werden, dass er auch lauschen soll. Die Eigenschaft heißt Active, glaube ich.

Schnittcher 25. Aug 2009 12:01

Re: Chat (IP)
 
Hallo,

ja du hast ja recht. ;-)

So ich habe jetzt nochmal einen Haltepunkt gesetzt Active:= True;
wird niemals true es bleibt immer false.

Gruß,
Schnittcher

Sko 25. Aug 2009 12:31

Re: Chat (IP)
 
Wie sieht denn das Stück Code jetzt aus wo der Server aktiviert wird?

Schnittcher 25. Aug 2009 12:41

Re: Chat (IP)
 
Delphi-Quellcode:
ServerSocket1.Port:= 1990;
ServerSocket1.Active:= True;

Schnittcher 25. Aug 2009 12:56

Re: Chat (IP)
 
So das verschicken geht, aber es kommt nur Müll an.

Zum Beispiel:

Zitat:

㼿㐿㼿㼿㼿㼿猿甠摮晥湩摥
13:56:25: 晤⁧慨⁴敤慒浵戠瑥敲整⹮s undefined.

Sko 25. Aug 2009 15:40

Re: Chat (IP)
 
Port 1990? AFAIK sollte man nicht so niedrige Ports verwenden, da die oft schon mit anderen Diensten belegt sind/sein können ([hier] mal die aktuelle Portliste), 1990 ist auch dabei:
Code:
stun-p1         1990/tcp  cisco STUN Priority 1 port
stun-p1         1990/udp  cisco STUN Priority 1 port
Ob das jetz was mit deinem Problem zu tun hat weiß ich nicht (vielleicht empängt dein Server irgendwelche cisco-Pakete), aber du kannst ja mal einen freien Port ausprobieren. Ansonsten sieht das eigentlich recht normal aus (ich hab aber auch länger nicht mehr direkt mit den Sockets hantiert).

Schnittcher 25. Aug 2009 15:43

Re: Chat (IP)
 
daran liegt es nicht.

DeddyH 25. Aug 2009 16:28

Re: Chat (IP)
 
Zeig doch nochmal den ganzen Code.

Schnittcher 26. Aug 2009 07:45

Re: Chat (IP)
 
Server:

Delphi-Quellcode:
unit server;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    IdIPWatch1: TIdIPWatch;
    Label1: TLabel;
    ServerSocket1: TServerSocket;
    procedure FormCreate(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
label1.Caption:= IdIPWatch1.LocalIP;
ServerSocket1.Port:= 55555;
ServerSocket1.Active:= True;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var Text:string;
i: Integer;
begin
Text:=Socket.ReceiveText;
Memo1.Lines.add(Timetostr(now)+': '+Text);
For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
with ServerSocket1.Socket.Connections [I] do
if (Connected) then SendText(Text);
end;
end;
end.
Client:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, AppEvnts, ExtCtrls, ScktComp, IdBaseComponent, IdComponent,
  IdIPWatch;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    lbIP: TLabel;
    Label4: TLabel;
    Label3: TLabel;
    Label5: TLabel;
    edNachricht: TEdit;
    edIP: TEdit;
    edNickname: TEdit;
    cmdSenden: TButton;
    cmdSetzen: TButton;
    cmdNick: TButton;
    ClientSocket1: TClientSocket;
    ApplicationEvents1: TApplicationEvents;
    IdIPWatch1: TIdIPWatch;
    Timer1: TTimer;
    Label6: TLabel;
    lbNickname: TLabel;
    cmdVerlassen: TButton;
    Memo1: TMemo;
    procedure cmdNickClick(Sender: TObject);
    procedure cmdVerlassenClick(Sender: TObject);
    procedure cmdSendenClick(Sender: TObject);
    procedure cmdSetzenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure delay(time:word);
    procedure Timer1Timer(Sender: TObject);
  private

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
 var Nickname, Nachricht:String;
{$R *.dfm}

procedure TForm1.delay(time: word);
var Start:Integer;
begin
  Start:=GetTickCount;
  while (GetTickCount) - (Start) <= time do
  Application.ProcessMessages;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
lbIP.Caption := IdIPWatch1.LocalIP; // Die aktuelle IP-Adresse wird angezeigt.
cmdSenden.Enabled:= false;
cmdSetzen.Enabled:= false;
label6.Visible:=False;
lbNickname.Visible:=False;
end;

procedure TForm1.cmdNickClick(Sender: TObject);
begin
Nickname:= edNickname.Text;
//cmdSenden.Enabled:=True;
cmdSetzen.Enabled:=True;
//cmdNick.Visible:=False;
edNickName.Enabled:=False;
Label6.Visible:=True;
//lbNickname.Visible:=True;
lbNickname.Caption:= Nickname;
Label5.Visible:=False;

end;

procedure TForm1.cmdSetzenClick(Sender: TObject);
begin
ClientSocket1.Host:= '192.168.255.123';
ClientSocket1.Port:= 55555;
ClientSocket1.Active:=True;
cmdSetzen.Enabled:= False;
edIP.Enabled:= False;
cmdSenden.Enabled:= True;
Nachricht:= edNickName.Text+' hat den Raum betreten.';
delay(500);
ClientSocket1.Socket.SendText(Nachricht);

end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Form1.Show;
Memo1.Lines.Add(Socket.ReceiveText);
end;

procedure TForm1.cmdSendenClick(Sender: TObject);
begin
if (ClientSocket1.Active=true) and (edNachricht.Text<>'') then
CLientSocket1.Socket.SendText(Nickname+': '+edNachricht.Text);
edNachricht.Text := '';
end;

procedure TForm1.cmdVerlassenClick(Sender: TObject);
begin
ClientSocket1.Socket.SendText(edNickName.Text+' hat den Raum verlassen.');
delay(500);
ClientSocket1.Close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
lbIP.Caption:= IdIPWatch1.LocalIP;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr.
Seite 1 von 2  1 2      

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