请教 : 当服务端断线重启后,客户端怎么才能重新连接到服务端 ?(100分)

  • 主题发起人 主题发起人 activexform
  • 开始时间 开始时间
我先试试
 
还是 ...

真想看看一个例子 ...

谢谢
 
大家讲的够清楚了,哎,你是不是要大家帮你做项目,你就在傍边看对不?
[:(!]
 
张兄在第一个跟贴里就说得很明白了,楼主看仔细了自己试试,要我是张兄,比他还早发火。:)
 
不是我没有自己作,实在是搞不懂,学校封了也不能出去买书看 ; 以下是代码请你们看看

---------------------------------------------------------
Server 端 :

unit Umain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, Winsock, DB, DBTables, ADODB;

type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
ServerSocket1: TServerSocket;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if ServerSocket1.Active = false then ServerSocket1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
begin
s := Edit1.Text;
try
ServerSocket1.Socket.Connections[0].SendText(s);
except
end ;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label1.Caption := Socket.ReceiveText;
end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
var
StrErr: string;
begin
case ErrorEvent of
eeConnect: StrErr := '不能建立连接';
eeDisconnect: StrErr := '连接被关闭';
eeReceive: StrErr := '接收数据出错';
eeSend: StrErr := '发送数据出错';
else
StrErr := '连接出错';
end;
ErrorCode := 0;
if ServerSocket1.Active then
ServerSocket1.Active := False;
end;

end.


Client 端 :

object Timer1: TTimer // 默认 True
Interval = 10000
OnTimer = Timer1Timer
Left = 136
Top = 128
end

unit Umain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, ExtCtrls, DB, ADODB;

type
TForm1 = class(TForm)
Edit1: TEdit;
ClientSocket1: TClientSocket;
Label1: TLabel;
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
procedure Connect ;
public
{ Public declarations }
end;

var
Form1: TForm1 ;
t : Cardinal ;

implementation

{$R *.dfm}

procedure TForm1.Connect ;
begin
ClientSocket1.Open ;
end ;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(Edit1.Text) ;
t := GetTickCount ;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
t := GetTickCount ;
Label1.Caption := Socket.ReceiveText ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
t := GetTickCount ;
if ClientSocket1.Active = false then
begin
try
Connect ;
except
end ;
end ;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
var
StrErr: string;
begin
case ErrorEvent of
eeConnect: Connect ;
eeDisconnect: StrErr := '连接被关闭';
eeReceive: StrErr := '接收数据出错';
eeSend: StrErr := '发送数据出错';
else
StrErr := '连接出错';
end;

ErrorCode := 0;
if ClientSocket1.Active then
ClientSocket1.Active := False;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Not ClientSocket1.Active then
if GetTickCount - t > 10000 then
begin
ClientSocket1.Active := False ;
Connect ;
end ;
end;

end.

---------------------------------------------------------------------
假设通信正常(服务端已经打开,双方可以正常通信) , 这时关闭 TServerSocket ,
然后重新启动TServerSocket,这时候客户端连接不到服务端了,只有重新启动客户端才能
连接到服务端 ---- 也就是说服务端死机后服务端和客户端都必须重新启动一次 ; 但从
代码看当连接不成功时后反复连接(好像没有错误), 请问为什么 ? 应该怎样解决 ?

---- 上面的代码依然没有解决这个问题,请再指教
 
非常感谢!!
 
有意思,认真思索。
 
楼主你把我的个人资料里的我回复的帖子都好好看看,看明白了,你就是TCP高手了[:D]
 
怎么说我都得感谢您:0 我正在 从搜索的 Keyword = ClientSocket 一篇一篇的找

可是有 54 页多:) ,好多又不懂,实在苦恼 ;

这个问题我还是没有解决 ... 我最后的代码到底那儿错了 ??
 
哈,我也不懂,因为我也曾经经过这种情况,所以改成用UDP了。
 
李维的书里不是有一个多个服务器伺机服务的例子吗?看看就有收获。
 
hmzz :

请问哪本 ? 还不知能不能借到,现在封校了
 
网上一大把这本书的电子文档,名称是《Delphi5.x 分步式多层应用系统篇》
 
找不到的话,我给你也可以,要吗?
 
我是这样解决的
首先把TForm1.timer1.Enabled:=false;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
clientsocket1.Active:=false;
clientsocket1.Host:=your_IP;//假定你的服务器IP放在your_ip里
clientsocket1.Active:=true;
end;
然后:
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
timer1.Enabled:=true;
end;
然后:
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
timer1.Enabled:=false;
end;

把timer的间隔时间设为5000
问题就解决了,
呵呵,不知道有分拿没有?
 
谢谢您:):) 我试试稍候就给你:)

hmzz : 《Delphi5.x 分步式多层应用系统篇》 能不能给我一份呀:)

activexform@yahoo.com.cn
谢谢
 
还没有?
 
等 hmzz 给我 《Delphi5.x 分步式多层应用系统篇》 :) ,要不你给我 ?:)
 
后退
顶部