Witam, mam mały problem z aplikacją typu klient-serwer. Mianowicie zacząłem zabawę z aplikacjami tego typu i pierwszy projekt jaki zrobiłem to komunikator (skorzystałem z jednego tutoriala który znalazłem w sieci). Po stworzeniu i uruchomieniu aplikacji klienta i serwera i po próbie połączenia klienta z serwerem wyskakuje błąd o treści "Socket Error # 10065 No route to host".
Oto kody programu:
SERWER:
unit serwer;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdThreadMgr, IdThreadMgrDefault, IdBaseComponent,
IdComponent, IdTCPServer;
type
WConnection = ^TConnection;
TConnection = record
Host : String[20];
Thread : Pointer;
end;
TPackage = record
UserNick,
Txt : string[255];
end;
TForm1 = class(TForm)
Memo1: TMemo;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
IdTCPServer1: TIdTCPServer;
IdThreadMgrDefault1: TIdThreadMgrDefault;
procedure Button1Click(Sender: TObject);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ConnectionLst: TThreadList;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPServer1.DefaultPort:=StrToInt(Edit1.Text);
IdTCPServer1.Active:=true;
end;
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var NewConnection:WConnection;
begin
GetMem(NewConnection,SizeOf(TConnection));
NewConnection.Host:=AThread.Connection.LocalName;
NewConnection.Thread:=AThread;
AThread.Data:=TObject(NewConnection);
try
ConnectionLst.LockList.Add(NewConnection);
finally
ConnectionLst.UnlockList;
end;
Memo1.Lines.Add('Polaczenie: '+NewConnection.Host+'"' + TimeToStr(Time));
end;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
DestThread: TIdPeerThread;
i: Integer;
DestConnection: WConnection;
Package, NewPackage: TPackage;
begin
begin
AThread.Connection.ReadBuffer (Package, SizeOf (Package));
Memo1.Lines.Add (TimeToStr(Time)+ ' - ' + Package.UserNick+ ' : '+Package.Txt);
NewPackage := Package;
with ConnectionLst.LockList do
try
for i := 0 to Count-1 do
begin
DestConnection := Items[i];
DestThread := DestConnection.Thread;
DestThread.Connection.WriteBuffer(NewPackage, SizeOf(NewPackage), True);
end;
finally
ConnectionLst.UnlockList;
end;
end;
end;
procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
var
ActiveConnection: WConnection;
begin
begin
ActiveConnection := WConnection(AThread.Data);
try
ConnectionLst.LockList.Remove(ActiveConnection);
finally
ConnectionLst.UnlockList;
end;
FreeMem(ActiveConnection);
AThread.Data := nil;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close();
end;
end.
KLIENT:
unit Klient;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient;
type
TPackage = record
UserNick,
Txt:string[255];
end;
TClientOnReceive=class(TThread)
private
ActiveP: TPackage;
procedure Action;
protected
procedure Execute;
override;
end;
TForm1 = class(TForm)
Wiadomosci: TMemo;
DoWyslania: TMemo;
IP: TEdit;
Nick: TEdit;
Port: TEdit;
Polacz: TButton;
IdTCPClient1: TIdTCPClient;
procedure PolaczClick(Sender: TObject);
procedure DoWyslaniaKeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
procedure TClientOnReceive.Execute;
begin
while not Terminated do
begin
if not Form1.IdTCPClient1.Connected then
Terminate
else
try
Form1.IdTCPClient1.ReadBuffer(ActiveP, SizeOf (ActiveP));
Synchronize(Action);
except
end;
end;
end;
procedure TClientOnReceive.Action;
begin
Form1.wiadomosci.Lines.Add ('[' + ActiveP.UserNick + ']: ' + ActiveP.Txt);
end;
{$R *.dfm}
procedure TForm1.PolaczClick(Sender: TObject);
var
ClientRecive:TClientOnReceive;
begin
try
IdTCPClient1.Host:=IP.Text;
IdTCPClient1.Port:=StrToInt(Port.Text);
IdTCPClient1.Connect(10000);
ClientRecive:=TClientOnReceive.Create(True);
ClientRecive.FreeOnTerminate:=True;
ClientRecive.Resume;
except
on E: Exception do MessageDlg ('polaczenie niemozliwe: '+#13+E.Message, mtError, [mbOk], 0);
end;
end;
procedure TForm1.DoWyslaniaKeyPress(Sender: TObject; var Key: Char);
var SendPackage:TPackage;
begin
if(Key=#13) then
begin
DoWyslania.BevelOuter:=bvRaised;
SendPackage.UserNick:=Nick.Text;
SendPackage.Txt:=DoWyslania.Text;
IdTCPClient1.WriteBuffer(SendPackage,SizeOf(SendPackage),True);
dowyslania.text:='';
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
end.
Bardzo proszę o jakieś wskazówki w znalezieniu błędu. Z góry dziękuję za pomoc