有关 Socket 链接,恳请指导(50分)

  • 主题发起人 主题发起人 活在来生的鱼
  • 开始时间 开始时间

活在来生的鱼

Unregistered / Unconfirmed
GUEST, unregistred user!
您好,如果一个 TServerSocket 实例没有打开,这时候如果一个 TClientSocket 实例
试图去链接Server端会出错 ,那么怎样才能让客户端知道服务端没有打开呢 ? 也就是
说在客户端坐怎样的处理才能屏蔽这个链接错误 ? 同样,通信中如果Server端突然关闭
这时候这样通知客户端 ? 如果这时候有数据正在传输,那么如何处理才能最大限度的
避免数据丢失 ? 谢谢
 
在ClientSocket 的OnError事件里判断,通过哪个错误事件类型参数判断发生错误的
类型,如果是在连接的时候发生错误就是连接失败,,,
数据丢失的判断也是在哪个 OnError事件里判断,
前提是你用TclientSocket的非组塞方式
 
张无忌: 您好
能否给段代码让我学习一下 ,谢谢
 
procedure TSlaveServerForm.CSocketError(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;

showmessage(StrErr);
ErrorCode:=0; //这里作用是屏蔽掉错误
end;
 
还有,在连接失败以后,一定要TClientSocket.Active:=false;
 
马上就试试
 
那么还有一个问题 :
如果所有客户端都关闭了链接,那么这时候如果服务端向客户端发送数据(也就是客户端全部
死机而服务端不知道)时也会出错 , 这个错误是否在 TServerError 中屏蔽 ? 该怎样做 ?

推荐一本 Socket 编程的书好么 ? 谢谢
 
同样的道理呀!
 
推荐一本 Socket 编程的书好么 ? 谢谢 :)
 
加上后,有的地方 ...
客户端的确在 FormCreate 试图建立链接时有提示 ;
procedure TForm1.FormCreate(Sender: TObject);
begin
if ClientSocket1.Active = false then ClientSocket1.Open;
end;
但是如果点击Button1 , 则没有任何反应(链接没有打开,此时是不是也应该有错误提示 ?)
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(Edit1.Text);
end;

procedure TForm1.ClientSocket1Error(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;
ShowMessage(StrErr);
ErrorCode := 0; if ClientSocket1.Active then
ClientSocket1.Active := False; //ClientSocket1.Close ;
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;
ShowMessage(StrErr);
ErrorCode := 0;
if ServerSocket1.Active then
ServerSocket1.Active := False; // ServerSocket1.Close ;
end;

如果客户没有在线,那么无论 ServerSocket1 是否打开,点击 Button2(代码如下),都会弹出
一个 "out of index" 的错误 ; 怎样才能屏蔽这个错误 ?
procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
begin
s := Edit1.Text;
ServerSocket1.Socket.Connections[0].SendText(s);
end;
 
ErrorCode:=0; //这里作用是屏蔽掉错误
 
什么意思呀楼上 ? 应该不是这句的原因
 
你要想搞明白,看VCL原代码
 
试试用
try
...
Except
end ;

屏蔽掉
 
这样是可以 但总让人觉得有点遮遮掩掩过去的感觉 ...

能否从根本上解决问题 ?
 
to 活在来生的鱼
这就是最好的办法了
 
多人接受答案了。
 
后退
顶部