Здравствуйте.
В общем, решил я на досуге разобраться с клиент-серверными приложениями и нашел в интернете следующий шаблон:
Клиент:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ScktComp, StdCtrls;
type
TForm1 = class(TForm)
cs: TClientSocket;
Timer1: TTimer;
log: TMemo;
procedure csError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure Timer1Timer(Sender: TObject);
procedure csConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure csDisconnect(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.csError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
var
myDate : TDateTime;
formattedDateTime : string;
begin
if ErrorEvent= eeConnect then
begin
cs.Active:=false;
mydate:=Now;
DateTimeToString(formattedDateTime, 'c', myDate);
log.lines.Add(formattedDateTime+': Невозможно установить соединение с сервером - '+cs.Address);
end;
ErrorCode:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not cs.Active then
begin
cs.Active:=true;
end;
cs.Socket.SendText('ping client');
end;
procedure TForm1.csConnect(Sender: TObject; Socket: TCustomWinSocket);
var
myDate : TDateTime;
formattedDateTime : string;
begin
mydate:=Now;
DateTimeToString(formattedDateTime, 'c', myDate);
log.lines.Add(formattedDateTime+': Соединение с сервером - '+socket.RemoteAddress+' установлено.');
end;
procedure TForm1.csDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
myDate : TDateTime;
formattedDateTime : string;
begin
mydate:=Now;
DateTimeToString(formattedDateTime, 'c', myDate);
log.Lines.Add(formattedDateTime+': Соединение с сервером '+socket.RemoteAddress+' потеряно.');
end;
end.
и сервер:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
type
TForm1 = class(TForm)
log: TMemo;
ss: TServerSocket;
procedure ssClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ssClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ssClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
myDate : TDateTime;
formattedDateTime : string;
begin
mydate:=Now;
DateTimeToString(formattedDateTime, 'c', myDate);
log.Lines.Add(formattedDateTime+': Есть коннект c '+Socket.RemoteAddress);
end;
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
s:string;
begin
s:=Socket.ReceiveText;
log.Lines.Add(s);
end;
procedure TForm1.ssClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
myDate : TDateTime;
formattedDateTime : string;
begin
mydate:=Now;
DateTimeToString(formattedDateTime, 'c', myDate);
log.Lines.Add(formattedDateTime+': Клиент '+socket.RemoteAddress+' отключился.');
end;
end.
При коннекте в локалхосту все нормально, но если я пытаюсь подключиться либо к другому компьютеру, либо к своему, но уже по внешнему ip, то появляется ошибка "Asynchronous server 16*", которая в этом примере превращается в "Невозможно установить соединение с сервером".
Подскажите, как исправить.