Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Einen Chat mit den Sockets programmieren (https://www.delphipraxis.net/21622-einen-chat-mit-den-sockets-programmieren.html)

Die Muhkuh 6. Sep 2008 23:20

Re: Einen Chat mit den Sockets programmieren
 
Zitat:

Zitat von bob_aus_der_flasche
der fehler kommt bei mir auch

wie soll das denn funzen xDDD

kapier nix von dem prog

:glaskugel:

noobkovski 17. Nov 2008 20:54

Re: Einen Chat mit den Sockets programmieren
 
hey , hab das gefühl da fehlt was in der PDF kam damit nicht ganz klar,


Client:
Delphi-Quellcode:
unit delchat;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Timer1: TTimer;
    ClientSocket1: TClientSocket;
    ApplicationEvents1: TApplicationEvents;
    IdIPWatch1: TIdIPWatch;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Delay(time: word);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Nickname,Nachricht:string;

implementation

{$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
Label6.Caption:=IdIPWatch1.LocalIP; //Damit oben im Fenster schon beim FormCreate die aktuelle IP-Adresse angezeigt wird
Button1.Enabled:=false;//Damit man nicht schon vorher draufdrückt
Button2.Enabled:=false;// -''-
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Nickname:=Edit3.Text;
Button3.Enabled:=false;
Edit3.Enabled:=false;
Button2.Enabled:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Host:=Edit2.Text;
ClientSocket1.Active:=true;
Button2.Enabled:=false;
Edit2.Enabled:=false;
Button1.Enabled:=true;
Nachricht:=Edit3.Text+' hat den Raum betreten';
delay(500);
ClientSocket1.Socket.SendText(Nachricht);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if (ClientSocket1.Active=true) and (Edit1.Text<>'') then
ClientSocket1.Socket.SendText(NickName+': '+Edit1.Text);
Edit1.Text:='';
end;


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

end.

Server:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ServerSocket1: TServerSocket;
    IdIPWatch1: TIdIPWatch;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
label2.caption:=IdIPWatch1.LocalIP;
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.


könntet ihr mir vll . noch sagen was dort noch fehlt damits erstmal funktioniert ?!
vielen dank im voraus, und sorry wenn es totaler schwachsinn ist, der dort steht ;)

Xster 29. Nov 2008 21:56

Re: Einen Chat mit den Sockets programmieren
 
wo finde ich di IdIPWatch Komponente???

Dave729 10. Dez 2008 22:02

Re: Einen Chat mit den Sockets programmieren
 
Hi, wollte mal fragen ob jemand laut dem Pdf den Link: nevrona öffnen kann. Hat jemand noch die Datein? Ich habe nämlich nur Delphi 3. Leider

taaktaak 20. Jan 2009 17:22

Re: Einen Chat mit den Sockets programmieren
 
Ab und zu sollte man ja auch mal seine ausgetretenen Pfade verlassen. Aber was fange ich denn mit den beiden heruntergeladenen Exen an? Client und Server zeigen beide die gleiche IP an - was soll ich denn im Client in das Edit "IP oder Name des Servers" eintragen? Welche IP? Welchen Namen?

Whatever 30. Jan 2009 13:59

Re: Einen Chat mit den Sockets programmieren
 
Zitat:

wo finde ich di IdIPWatch Komponente???
Die Komponente gehört zu den Indy Komponenten und ist nach der Installation unter dem Reiter Indy-Misc verfügbar.

Zitat:

Client und Server zeigen beide die gleiche IP an - was soll ich denn im Client in das Edit "IP oder Name des Servers" eintragen? Welche IP? Welchen Namen?
Sie zeigen beide die gleiche IP an weil sie auf ein und dem selben Rechner laufen. Entweder gibst du deine lokale IP an (die IP die angezeigt wird) oder 127.0.0.1 (localhost).

mfg Whatever

taaktaak 30. Jan 2009 15:37

Re: Einen Chat mit den Sockets programmieren
 
Zitat:

Entweder gibst du deine lokale IP an (die IP die angezeigt wird) oder 127.0.0.1 (localhost)
Arrrrggggg, ich hasse Computer, die nicht gehorchen ...

Vielen Dank für die Info. Leider kann ich da eingeben was ich will, der Mist funktioniert nicht. Egal, ob mit oder ohne Kaspersky: "Der Server kann nicht gefunden werden" An Einstellungen des Routers kann's ja wohl nicht liegen, da hier doch nur der Client mit dem Server auf dem gleichen PC verbunden werden soll - oder?.

PS #1: Warum sind eigentlich Client und Server überhaupt in 2 Programme aufgeteilt? Muss nicht jeder Chat-Teilnehmer immer beide Programme starten? Warum fasst man nicht beide Funktionalitäten in einem Programm zusammen?

PS #2: Wir bräuchten hier mal einen Smiley, mit man seinen widerspenstigen PC symbolisch mit einem großen Hammer zertrümmern kann!

DeddyH 30. Jan 2009 18:42

Re: Einen Chat mit den Sockets programmieren
 
Zitat:

Zitat von taaktaak
Wir bräuchten hier mal einen Smiley, mit man seinen widerspenstigen PC symbolisch mit einem großen Hammer zertrümmern kann!

Den hab ich mir auch schon öfter gewünscht :mrgreen:

Ghostleader 6. Okt 2009 13:25

Re: Einen Chat mit den Sockets programmieren
 
Wie genau installiere ich denn IdIPWatch bzw. diese Indykomponenten? Ich habe Delphi 5 da ist kein IdIPWatch enthalten!

Ghostleader 6. Okt 2009 14:52

Re: Einen Chat mit den Sockets programmieren
 
kann mir jemand helfen?

Klaus01 6. Okt 2009 15:01

Re: Einen Chat mit den Sockets programmieren
 
Hi Ghostleader,

pushen solltest Du erst nach 24 Stunden.

Schau dir mal diese Anleitung an.

Grüße
Klaus

Ghostleader 6. Okt 2009 15:10

Re: Einen Chat mit den Sockets programmieren
 
Vielen Dank! Sorry ich hatte nur gesehen das dieser Thread schon über 6 Monate alt ist und das er auf der Portalseite schon von anderen Threads überholt wurde und damit jemand meinen Post sieht hab ich nochmal geschrieben :). Aber ich werd es mir merken - das nächste mal erst nach 24 Stunde.

Mfg Ghost

Ghostleader 6. Okt 2009 15:26

Re: Einen Chat mit den Sockets programmieren
 
Hmm also ich habe Delphi5 und ich dachte das wäre Delphi 2005 aber das was in der Anleitung steht ist komplett anders als meine Sachen.
Ich soll das heruntergeladenes Verzeichnis in den Ornder "lib" einfügen.
Ich habe so einen Ordner aber der heißt "Lib" und die Ordner "BDS" und dadrin "3.0" im Screenshot habe ich nicht... (Der 1ste Screenshot von der Anleitung)

DeddyH 6. Okt 2009 15:45

Re: Einen Chat mit den Sockets programmieren
 
16 Minuten sind aber keine 24 Stunden :warn:. Nichtsdestotrotz, unter Delphi5 müsste das der Ordner C:\Programme\Borland\Delphi5\lib sein (Standard-Verzeichnis).

Ghostleader 6. Okt 2009 15:59

Re: Einen Chat mit den Sockets programmieren
 
Gut. Wenn ich das jetzt eingefügt habe und dann IndySystem90.dpk öffne erscheint aber nicht dasselbe Fenster wie im Tutorial, es öffnet sich Delphi und ein Programm was ich nicht geschrieben habe. Starten kann man es leider nicht weil da ein Fehler kommt (irgendwas mit "ALIGN")

DeddyH 6. Okt 2009 18:25

Re: Einen Chat mit den Sockets programmieren
 
Wieso IndySystem90.dpk? Ich dachte, es geht um Delphi 5.

Ghostleader 6. Okt 2009 20:01

Re: Einen Chat mit den Sockets programmieren
 
das ist aber der nächste schritt den man machen muss. diese datei da öffnen

DeddyH 7. Okt 2009 09:37

Re: Einen Chat mit den Sockets programmieren
 
Du musst das Package öffnen, das zu Deiner Delphi-Version passt. Es macht doch keinen Sinn, das Tutorial für Delphi 2005 sklavisch in Delphi 5 abarbeiten zu wollen.

Ghostleader 10. Okt 2009 17:55

Re: Einen Chat mit den Sockets programmieren
 
So der Chat ist jetzt fertig allerdings bekomme ich wie so viele andere den (unbeatworteten) fehler:
"Asynchroner Socket-Fehler 10060."

Was ist da los?!

Klaus01 10. Okt 2009 18:08

Re: Einen Chat mit den Sockets programmieren
 
Zitat:

Zitat von http://support.microsoft.com/kb/819124/de
WSAETIMEDOUT (10060)

* Übersetzung : Verbindung wegen Timeout abgebrochen.
* Beschreibung : ein Verbindungsversuch ist fehlgeschlagen, weil die Gegenstelle hat nach einem bestimmten Zeitraum nicht richtig reagiert, bzw. die hergestellte Verbindung ist, fehlgeschlagen weil verbundene Host reagieren nicht.

.. kannst Du nicht den Verbindungsversuch mit try.. except kapseln
und entsprechend reagieren und eventuell später nochmals einen Verbindungsversuch starten.

Grüße
Klaus

Die Muhkuh 10. Okt 2009 18:09

Re: Einen Chat mit den Sockets programmieren
 
Zitat:

Zitat von Ghostleader
So der Chat ist jetzt fertig allerdings bekomme ich wie so viele andere den (unbeatworteten) fehler:
"Asynchroner Socket-Fehler 10060."

Was ist da los?!

Wenn es von PC1 <-> PC2 blockt da sicher noch irgendeine Firewall.

Ghostleader 10. Okt 2009 19:07

Re: Einen Chat mit den Sockets programmieren
 
@Klaus... danke aber ich versteh nicht was ich dagegen tuen kann ;)
gibts da eine möglichkeit das die "gegenstelle" auf den verbindungsaufbau versuch reagieren kann?
und wenn ja, wie sieht die als delphi befehl aus?

@DieMuhkuh... nein ist mein eigener chat und ich probier ihn selber aus

Die Muhkuh 10. Okt 2009 19:10

Re: Einen Chat mit den Sockets programmieren
 
Solltest vielleicht mal den Code zeigen, ansonsten könnte die Fehlersuche etwas schwer sein.

Ghostleader 10. Okt 2009 19:15

Re: Einen Chat mit den Sockets programmieren
 
okay einen moment:
(server und client sind in einem... einzelnd hab ich es auch aber so finde ich es besser - beides hat nichgeklappt -selber fehler)

Delphi-Quellcode:
unit pChat3;

interface

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

type
  TfmChat = class(TForm)
    MeChatlog: TMemo;
    BtSenden: TButton;
    EdSenden: TEdit;
    EdNickname: TEdit;
    btOK: TButton;
    MeWIO: TMemo;
    BtClose: TButton;
    MeChatverlauf: TMemo;
    CbStatus: TComboBox;
    cbOptionen: TComboBox;
    MeSupport: TMemo;
    MeCopyright: TMemo;
    MeHelp: TMemo;
    OpenDialog1: TOpenDialog;
    BtVerlauf: TButton;
    TmIP: TTimer;
    IdIPWatch1: TIdIPWatch;
    PaIP: TPanel;
    LaIPShow: TLabel;
    LaIP: TLabel;
    ImUser: TImage;
    BitBtn1: TBitBtn;
    ImStrich: TImage;
    DateTimePicker1: TDateTimePicker;
    OpenPictureDialog1: TOpenPictureDialog;
    ApplicationEvents1: TApplicationEvents;
    ClientSocket1: TClientSocket;
    PaServer: TPanel;
    ServerSocket1: TServerSocket;
    MeServer: TMemo;
    LaIPShow2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure btOKClick(Sender: TObject);
    procedure EdNicknameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure EdNicknameClick(Sender: TObject);
    procedure BtSendenClick(Sender: TObject);
    procedure BtCloseClick(Sender: TObject);
    procedure CbStatusChange(Sender: TObject);
    procedure cbOptionenChange(Sender: TObject);
    procedure MeSupportDblClick(Sender: TObject);
    procedure BtVerlaufClick(Sender: TObject);
    procedure TmIPTimer(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure EdSendenChange(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Delay(time: word);
    procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  fmChat: TfmChat;

implementation

var Nickname: string;
var Nachricht: string;

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

{$R *.dfm}

procedure TfmChat.BtCloseClick(Sender: TObject);
begin
ClientSocket1.Socket.SendText (Nickname + 'hat den Chat verlassen.');
delay(500);
MeChatLog.Lines.SaveToFile ('Chat-Log.txt');
ClientSocket1.Close;
close;
end;

procedure TfmChat.btOKClick(Sender: TObject);
begin
Nickname:= EdNickname.text;
Nachricht:= (Nickname + ' hat den Raum betreten.');
delay(500);
ClientSocket1.Active:= True;
ClientSocket1.Socket.SendText (Nachricht);
BtSenden.Enabled:= True;
EdSenden.Enabled:= True;
MeChatlog.Enabled:= True;
Btok.Enabled:= False;
CbStatus.Enabled:= True;
MeWIO.Lines.Add (Nickname + ' <online>');
MeChatlog.Lines.SaveToFile ('Chat-Log.txt');
end;

procedure TfmChat.BtSendenClick(Sender: TObject);
begin
EdSenden.text:= Nachricht;
if (ClientSocket1.Active = True) and (EdSenden.text<>'') then
begin
  ClientSocket1.Socket.SendText (Nickname+ ' : '+ EdSenden.text);
end;
EdSenden.Text:='';

MeChatverlauf.Lines.LoadfromFile ('Chat-Log.txt');

end;

procedure TfmChat.BtVerlaufClick(Sender: TObject);
begin
OpenDialog1.Filter:= 'Text - Dokumente |*.txt';
OpenDialog1.FileName:= 'Wählen sie ihre Datei...';
OpenDialog1.Execute;
MeChatVerlauf.Lines.LoadFromFile (OpenDialog1.Filename);
end;

procedure TfmChat.CbStatusChange(Sender: TObject);
begin
if CbStatus.Itemindex = 1 then
begin
  MeChatlog.Lines.Add (Nickname + ' ist nun online.');
  MeWIO.Lines.Clear;
  MeWIO.Lines.Add (Nickname + ' <online>');
end;
if CbStatus.Itemindex = 2 then
begin
  MeChatlog.Lines.Add (Nickname + ' ist nun beschäftigt.');
  MeWIO.Lines.Clear;
  MeWIO.Lines.Add (Nickname + ' <Beschäftigt>');
end;
if CbStatus.Itemindex = 3 then
begin
  MeChatlog.Lines.Add (Nickname + ' ist nun abwesend.');
  MeWIO.Lines.Clear;
  MeWIO.Lines.Add (Nickname + ' <Abwesend>');
end;
if CbStatus.Itemindex = 4 then
begin
  MeChatlog.Lines.Add (Nickname + ' ist nun offline.');
  MeWIO.Lines.Clear;
  MeWIO.Lines.Add (Nickname + '-offline anzeigen-');
end;

end;

procedure TfmChat.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin

end;

procedure TfmChat.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
FmChat.Show;
MeChatlog.Lines.Add (Socket.ReceiveText);
end;

procedure TfmChat.cbOptionenChange(Sender: TObject);
begin
if CbOptionen.itemindex = 0 then
begin
  FmChat.Color:= Clskyblue;
  MeHelp.Visible:= False;
  MeSupport.Visible:= False;
  MeCopyright.Visible:= False;
end;
if CbOptionen.itemindex = 1 then
begin
  MeHelp.Visible:= True;
end
else
begin
  MeHelp.Visible:= False;
end;
if cbOptionen.itemindex = 2 then
begin
  MeSupport.Visible:= True;
end
else
begin
  MeSupport.Visible:= False;
end;
if cbOptionen.ItemIndex = 3 then
begin
  MeCopyright.Visible:= True;
end
else
begin
  MeCopyright.Visible:= False;
end;
if cbOptionen.Itemindex = 4 then
begin
  OpenPictureDialog1.Filename:= 'Ihre Datei...';
  OpenPictureDialog1.Execute;
  ImUser.Picture.LoadFromFile (OpenPictureDialog1.Filename);
end;
end;

procedure TfmChat.EdNicknameClick(Sender: TObject);
begin
EdNickname.Clear;
end;

procedure TfmChat.EdNicknameKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Btok.Enabled:= True;
end;

procedure TfmChat.EdSendenChange(Sender: TObject);
begin
if EdSenden.text = 'Server.List' then
begin
  PaServer.Visible:= True;
  FmChat.Height:= 636;
end
else
begin
  PaServer.Visible:= False;
  FmChat.Height:= 285;
end;
end;

procedure TfmChat.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Close;
MeChatLog.Lines.SaveToFile('Chat-Log.txt');

end;

procedure TfmChat.FormCreate(Sender: TObject);
begin
LaIpShow2.Caption:= IdIPWatch1.LocalIP;
FmChat.Height:= 285;
ClientSocket1.Host:= '80.132.196.139' ;
ClientSocket1.Active:= True;
TmIP.Enabled:= True;
BtSenden.Enabled:= False;
EdSenden.Enabled:= False;
MeChatlog.Enabled:= False;
Btok.Enabled:= False;
MeChatverlauf.Lines.LoadfromFile ('Chat-Log.txt');
CbStatus.Enabled:= False;
CbOptionen.Enabled:= True;
MeSupport.Visible:= False;
MeCopyright.Visible:= False;
MeHelp.Visible:= False;

end;

procedure TfmChat.MeSupportDblClick(Sender: TObject);
begin
MeSupport.Visible:= False;
end;

procedure TfmChat.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  Var Text: String;
      i: integer;
begin
Text:=Socket.ReceiveText;
MeChatlog.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;

procedure TfmChat.TmIPTimer(Sender: TObject);
begin
LaIP.Caption:=IdIPWatch1.LocalIP;
end;

end.
ist ziemlich viel.

Me steht für Memo
La steht für Label
Ed steht für Edit
Tm steht für Timer
Bt steht für Button...


ansonsten einfach nachfragen

Ghostleader 11. Okt 2009 20:28

Re: Einen Chat mit den Sockets programmieren
 
hat da jemand ne ahnung?

Ghostleader 13. Okt 2009 10:12

Re: Einen Chat mit den Sockets programmieren
 
ist noch jemand für mich da ? :D

sirius 13. Okt 2009 10:18

Re: Einen Chat mit den Sockets programmieren
 
1. Willst du dafür nicht einen eigenen Thread aufmachen (dann gibt es meist auch mehr Resonanz)

2. Das könnte dem Socket ein wenig zu schnell gehen:
Delphi-Quellcode:
ClientSocket1.Active:= True;
ClientSocket1.Socket.SendText (Nachricht);
Das Socket sendet ein Ereignis, wenn es fertig zum "schreiben" ist.

DelphiProgrammer 30. Jan 2014 07:19

AW: Einen Chat mit den Sockets programmieren
 
Hi,

ich habe den chat programmiert und auf einem rechner funktoniert alles prima. Wenn ich jetzt aber
auf einem rechner server und einen client laufen lasse und auf einem anderen rechner(im netzwerk)
einen zweiten client habe geht nur der teil, der auf dem rechner mit dem server ist alles prima
mit rechner 2 kann ich micht nicht verbinden!
Verbindung haben beide - sie sind im selben Heimnetzwerk - und ich habe rechner 1 (der mit server)
auch angepingt: ging. Port ist 7777 denke der wird nicht belegt sein...

LG Christopher:)

Sherlock 30. Jan 2014 11:12

AW: Einen Chat mit den Sockets programmieren
 
Die IP-Adresse des zweiten Client hast du wo und wie im Server verarbeitet?

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr.
Seite 3 von 3     123   

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