Delphi-PRAXiS

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.

Schnittcher 27. Aug 2009 09:51

Re: Chat (IP)
 
Hat keiner eine Idee? :(

Angel4585 27. Aug 2009 10:05

Re: Chat (IP)
 
Also was ist aktuell genau das Problem?

Der ServerSocket lässt sich nicht starten?
Was für Einstellungen hast du denn angegeben für Host, Port etc?

Schnittcher 27. Aug 2009 10:12

Re: Chat (IP)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Nein, das Problem ist im Anhang.
Es kommt kein Text an sondern nur Zeichen.

Angel4585 27. Aug 2009 10:46

Re: Chat (IP)
 
Arbeitest du mit blockierenden oder nichtblockierenden Sockets?

luke2 27. Aug 2009 12:25

Re: Chat (IP)
 
Zitat:

Zitat von Schnittcher
Es kommt kein Text an sondern nur Zeichen.

Ich kenne das. Hast du zufällig D2009? Dann liegt es am Unicode. ReceiveText() kommt damit nicht zurecht, du musst die Daten mit ReceiveBuf() in einen AnsiString schreiben.

Schnittcher 27. Aug 2009 12:47

Re: Chat (IP)
 
Kannst du mir das mal als Beispiel in meinem Code zeigen?

Gruß,
Schnittcher

Schnittcher 28. Aug 2009 08:42

Re: Chat (IP)
 
*Push*

luke2 28. Aug 2009 11:38

Re: Chat (IP)
 
Zitat:

Zitat von Schnittcher
Kannst du mir das mal als Beispiel in meinem Code zeigen?

[ungetestet]
Delphi-Quellcode:
procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  s:ansistring;
begin
  setlength(s,socket.receivelength);
  socket.receivebuf(s[1],socket.receivelength);
  memo1.lines.add(s);
end;
aber damit geht es auch mit D2009 und Unicode.

Schnittcher 28. Aug 2009 11:56

Re: Chat (IP)
 
Hallo,

danke jetzt kommt es beim Server an aber beim Client nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz