在用tidftp的时候,
这个异常有时会出现有时又不会出现,有时候在connect时出现,有时在list时出现,有时即使出现也可以正常上下传文件,有时却又不行
谢谢~
7 个解决方案
#1
关注
up
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'),然后主动退出。这就是我所说的握手退出。
自己研究的,大家讨论。
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
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'),然后主动退出。这就是我所说的握手退出。
自己研究的,大家讨论。
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 使用 阻塞模式。
工作时,网络不好的情况就可以继续上传。
网络情况好的情况时候不可以上传。
原理不清楚,希望都说对了。