Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Client und Server in einem Prog - Code geht nicht (https://www.delphipraxis.net/23942-client-und-server-einem-prog-code-geht-nicht.html)

jfheins 12. Jun 2004 15:22


Client und Server in einem Prog - Code geht nicht
 
Ich möchte ein programm schreiben, das normalerweise immer server ist, und auf knopfdruck kurz zum clienten wird, um eine deatei/meldung zu senden. Ich möchte also nicht wie bei einem herkömmlichen system einen clienten und einen server proggen, sondern beides in einem. Man gibt dann einfach die IP eines computers an, wird zum client und überträgt.

Es soll, wenn es fertig ist, ein programm zur übermittlung von daten im LAN werden, wo jeder jedem etwas senden kann. Es soll also keinen zentralen server geben und alles clients sondern eher wie ein P2P-Netz.

Hoffe, ich habe mich verständlich ausgedrückt. Hier ist der Code, Danke schonmal im voraus.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdThreadMgr, IdThreadMgrDefault, IdTCPServer, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, StdCtrls;

type
  TForm1 = class(TForm)
    IdTCPClient1: TIdTCPClient;
    IdTCPServer1: TIdTCPServer;
    IdThreadMgrDefault1: TIdThreadMgrDefault;
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure Edit1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  mess1, mess2: string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
IdTCPServer1.Active := TRUE;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPServer1.Active := FALSE;


if (Edit1.Text <> 'Bitte IP eingeben') then
begin
if (Edit1.Text <> '') then
begin
IdTCPClient1.Host := Edit1.Text;
IdTCPClient1.Port := 2222;
IdTCPClient1.Connect;

IdTCPClient1.Write('Hallo');
mess2 := IdTCPClient1.ReadLn();
showmessage (mess2);

IdTCPClient1.Disconnect;
end;
end;

IdTCPServer1.Active := TRUE;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
mess1 := AThread.Connection.ReadLn();
showmessage (mess1);
AThread.Connection.Write('Hallo vom Server');
end;

procedure TForm1.Edit1Click(Sender: TObject);
begin
Edit1.Text := '';
end;

end.

sakura 12. Jun 2004 15:23

Re: Client und Server in einem Prog - Code geht nicht
 
Zitat:

Zitat von jfheins
Client und Server in einem Prog - Code geht nicht

Was genau geht nicht?

...:cat:...

StefanDP 12. Jun 2004 15:25

Re: Client und Server in einem Prog - Code geht nicht
 
Delphi-Quellcode:
IdTCPClient1.Connect;

IdTCPClient1.Write('Hallo');
ist denn schon connected wenn du 'hallo' sagst?
gibt es da nicht irgendwo vom client ein OnConnected oder so?

vlees91 12. Jun 2004 15:28

Re: Client und Server in einem Prog - Code geht nicht
 
Client und Server in einem Programmen gehen:ich hab bei meinem Chatprog (Open Source) auch einen Client mit einem Server in einem programm gepackt (wegen den Nicknames, war einfacher)

vlees91 12. Jun 2004 15:29

Re: Client und Server in einem Prog - Code geht nicht
 
Zitat:

Zitat von StefanDP
gibt es da nicht irgendwo vom client ein OnConnected oder so?

gibt es

jfheins 12. Jun 2004 15:48

Re: Client und Server in einem Prog - Code geht nicht
 
@sakura: es kommt Error #10061 ("Connection refused")

@stefanDP: geht imnernoch nicht, trotzdem danke ...

vlees91 12. Jun 2004 16:07

Re: Client und Server in einem Prog - Code geht nicht
 
warum beendest du eigentlich, bevor du den client startest, den server?
wegen dem connection refused. warscheinlich will die firewall das nicht.

jfheins 12. Jun 2004 21:51

Re: Client und Server in einem Prog - Code geht nicht
 
hier der korekte Sourcecode:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdThreadMgr, IdThreadMgrDefault, IdTCPServer, IdBaseComponent, ComCtrls,
  IdComponent, IdSocketHandle, IdTCPConnection, IdTCPClient, StdCtrls, WinSock,
  IdAntiFreezeBase, IdAntiFreeze;

type
  TForm1 = class(TForm)
    IdTCPClient1: TIdTCPClient;
    IdTCPServer1: TIdTCPServer;
    IdThreadMgrDefault1: TIdThreadMgrDefault;
    Button1: TButton;
    ComboBox1: TComboBox;
    IdAntiFreeze1: TIdAntiFreeze;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  mess1, mess2: string;
  Binding : TIdSocketHandle;
 // CommBlock, NewCommBlock: TCommBlock;

implementation

{$R *.dfm}

function GetIp: string;
var phoste: PHostEnt;
  Buffer: array [0..100] of char;
  WSAData: TWSADATA;
begin
  result:='';
  if WSAStartup($0101, WSAData) <> 0 then exit;
  GetHostName(Buffer,Sizeof(Buffer));
  phoste:=GetHostByName(buffer);
  if phoste = nil then result:='127.0.0.1'
  else result:=StrPas(inet_ntoa(PInAddr(phoste^.h_addr_list^)^));
  WSACleanup;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
IdTCPServer1.Active := FALSE;

IdTCPServer1.Bindings.Clear;
Binding := IdTCPServer1.Bindings.Add;
Binding.IP := GetIP;
Binding.Port := 2222;

IdTCPServer1.Active := TRUE;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPServer1.Active := FALSE;

if (Combobox1.Text <> 'Bitte IP eingeben') then
begin
if (Combobox1.Text <> '') then
begin
IdTCPClient1.Host := Combobox1.Text;
IdTCPClient1.Port := 2222;
IdTCPClient1.Connect;
end;
end;

IdTCPServer1.Active := TRUE;
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
IdTCPClient1.WriteLn(Edit1.Text);
IdTCPClient1.Disconnect;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IdTCPServer1.Active := FALSE;
IdTCPServer1.Destroy;
IdTCPClient1.Destroy;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
showmessage (AThread.Connection.ReadLn());
end;

end.

DataCool 19. Aug 2005 00:38

Re: Client und Server in einem Prog - Code geht nicht
 
Hi,

vollkommen klar, das das nicht geht !!!!

Im OnCreate setzt Du den Server active := true;

Im ButtonClick setzt Du den Server auf active := false; (d.h. keine verbindung möglich)

Dann versuchst Du den Client zu verbinden, obwohl Dein Server gar nicht läuft :?

Und wenn der Client nicht verbinden kann, weil der Server ja gar nicht an ist(Deshalb auch Connection refused), danach schaltest Du den Server wieder an :wall:

Der fehler und die Lösung sollten jetzt doch klar seien oder ?

jfheins 19. Aug 2005 08:46

Re: Client und Server in einem Prog - Code geht nicht
 
Abgesehen, davon, dass dieser Thread schon "etwas" älter ist:
Der Server, zu dem ich verbinden wollte, war nicht der, in dem selben Programm ;)
==> Das Programm lief auch noch auf nem anderen PC, und da war der Server ja Aktiv ...


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