(高分求解)如何解决 Connection Closed Gracefully 在用tidftp的时候,这个异常有时会出现有时又不会出现,有时候在connect时出现,有时

时间:2021-09-30 07:54:36
如何解决 Connection Closed Gracefully

在用tidftp的时候,
这个异常有时会出现有时又不会出现,有时候在connect时出现,有时在list时出现,有时即使出现也可以正常上下传文件,有时却又不行

谢谢~

7 个解决方案

#1


关注
up

#2


关注

#3


indy系列组件的工作原理应该差不多,下面是我研究的idtcpserver的一些心得,你可以参考一下

IndyServer为每个客户端建立一个线程,然后在线程里read数据。
我们一般这样写服务器端的接收程序:
  if not AThread.Terminated and AThread.Connection.Connected then  //注意这里
  begin
    AThread.Connection.ReadBuffer(Command,SizeOf(TCommand));
    if Command='1' then
    ……

现在以服务器端为例,研究退出。
因为indy是阻塞的,所以程序会等停在read那里;接到数据后,程序继续运行,处理完数据后,线程自动又会运行到read那里等待数据。如果客户端突然disconnect,这里的read自然会报错;所以正确的退出方式应该是:在接收数据以后的处理代码里,服务器端断开连接:

注意我标注的地方:
  if not AThread.Terminated and AThread.Connection.Connected then  //注意这里
程序再运行到这里的时候,AThread.Connection.Connected 已经为false,则线程自动退出了,连接断开了。
示例:

  if not AThread.Terminated and AThread.Connection.Connected then  //注意这里
  begin
    AThread.Connection.ReadBuffer(Command,SizeOf(TCommand));
    if Command='Server Quit' then
    begin
      Command := 'Client Quit';
      AThread.Connection.WriteBuffer(Command,Sizeof(Command));      
      AThread.Connection.Disconnect;
    end;

在客户端建立线程来接收数据的,基本也是这样写的。所以也需要得到一个退出的统治(程序中的'Client Quit'),然后主动退出。这就是我所说的握手退出。

自己研究的,大家讨论。

#4


"Connection Closed Gracefully" 只在 DEPHI IDE 中运行的时候 才会出现,发布出的EXE 单独运行时不会出现的

#5


up

#6


我换回delphi自带的版本就好了,那些问题都是出在10上的

#7



1,Connection Closed Gracefully  

是正常关闭 FTP 的连接。点击断开连接,
网络出现问题,服务器出现问题,都出现这种情况。

解决方法,把异常屏蔽掉了就有了。

2,有时即使出现也可以正常上下传文件,有时却又不行

这是因为 IdFTP 使用 阻塞模式。
工作时,网络不好的情况就可以继续上传。
网络情况好的情况时候不可以上传。

原理不清楚,希望都说对了。

#1


关注
up

#2


关注

#3


indy系列组件的工作原理应该差不多,下面是我研究的idtcpserver的一些心得,你可以参考一下

IndyServer为每个客户端建立一个线程,然后在线程里read数据。
我们一般这样写服务器端的接收程序:
  if not AThread.Terminated and AThread.Connection.Connected then  //注意这里
  begin
    AThread.Connection.ReadBuffer(Command,SizeOf(TCommand));
    if Command='1' then
    ……

现在以服务器端为例,研究退出。
因为indy是阻塞的,所以程序会等停在read那里;接到数据后,程序继续运行,处理完数据后,线程自动又会运行到read那里等待数据。如果客户端突然disconnect,这里的read自然会报错;所以正确的退出方式应该是:在接收数据以后的处理代码里,服务器端断开连接:

注意我标注的地方:
  if not AThread.Terminated and AThread.Connection.Connected then  //注意这里
程序再运行到这里的时候,AThread.Connection.Connected 已经为false,则线程自动退出了,连接断开了。
示例:

  if not AThread.Terminated and AThread.Connection.Connected then  //注意这里
  begin
    AThread.Connection.ReadBuffer(Command,SizeOf(TCommand));
    if Command='Server Quit' then
    begin
      Command := 'Client Quit';
      AThread.Connection.WriteBuffer(Command,Sizeof(Command));      
      AThread.Connection.Disconnect;
    end;

在客户端建立线程来接收数据的,基本也是这样写的。所以也需要得到一个退出的统治(程序中的'Client Quit'),然后主动退出。这就是我所说的握手退出。

自己研究的,大家讨论。

#4


"Connection Closed Gracefully" 只在 DEPHI IDE 中运行的时候 才会出现,发布出的EXE 单独运行时不会出现的

#5


up

#6


我换回delphi自带的版本就好了,那些问题都是出在10上的

#7



1,Connection Closed Gracefully  

是正常关闭 FTP 的连接。点击断开连接,
网络出现问题,服务器出现问题,都出现这种情况。

解决方法,把异常屏蔽掉了就有了。

2,有时即使出现也可以正常上下传文件,有时却又不行

这是因为 IdFTP 使用 阻塞模式。
工作时,网络不好的情况就可以继续上传。
网络情况好的情况时候不可以上传。

原理不清楚,希望都说对了。