一个很急的问题,高手赶快帮一下忙等着急用的, (200分)

  • 主题发起人 主题发起人 goodman
  • 开始时间 开始时间
G

goodman

Unregistered / Unconfirmed
GUEST, unregistred user!
我写文件传输用的INDY组件,idtcpclient用writestream传过去
而idtcpserver用readstream来接收,可是有个问题的就是writestream执行完了,
并且client显示已经断开的,可是readstream还在接收的,还远远没有完成的,还在缓慢的读着
数据,我检查数据时,也在不断增大的,但将网络连接一断掉,传输也就中断了怎么办呢,
不断掉的话是能成功收完的,我是用拨号传数据的(拨号网络是要断掉的呢,)
 
这里有源代码
ftp://61.152.210.98/Socket2.rar
 
to tassadar :
你能告诉我为什么在客户端用writestream(AStream,true ,false)执行完后调用DISCONNECT,这时
也许数据只传2%的, 但服务端的ReadStream(AStream, -1, True)一直继续在执行的并且数据接收也对的,
但如果网络断了以后那就会数据接收中断的呢,(但在writestream 执行完后拨号我是要断掉的可是一断掉
数据就传不完了)
 
因为这是异步的,你要在服务器端接收完之后发一个消息给客户端,
让客户端知道文件已经传递完毕,
服务器端:
readstream;
writeln;
客户端:
writeStream;
readln;
disconnect;
 
to tassadar
这样写行不通呢因为readstream结束是以客户端主动断掉才能结束的但如何断定客户是否
传完真的有点难呢,因为客户端的writestream执行完后,服务器端根本就没有read完的,所
以服务器端的跟在readstream后的writeln根本无法执行(因为readstream客户端主动断掉才能结束),这样程序就成了无限等待状态.

问题体现突出就是客户为局域网而服务器用拨号或带宽不如局域网时因为局域网中写和读的
速率相差不是很远的,可以用延时来解决的,
你能不能进一步给一点指点就是readstream 和writestream在idtcp组件中怎么用,谢谢
 
你sendStream的时候知道stream的大小吗,
如果知道就先发一个stream.size过去,用cardinal类型也就是4个byte
然后再传stream过去,接收端,先读4个byte,知道stream的Size,
然后ReadStream(aStream, aSize);就可以了
你可以参考我的代码:ftp://61.152.210.98/Socket2.rar
 
谢谢你哦我仔细看一下帮助确实如此解决了,对了你能告诉有没有好的办法在传输时断定客户端非正常断掉了,以便释放服务器端的接收线程的,本来用readstream(astream,-1,true)是不用管这个的, 可是用readstream(astrea,abytes,false)却要管了
 
indy的TIdTCPConnection有一个CheckForDisconnect的方法,也许你可以试一下
 
后退
顶部