TIdTCP传输多个文件的迷惑? ( 积分: 100 )

  • 主题发起人 主题发起人 xj_lq
  • 开始时间 开始时间
X

xj_lq

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TIdTCPClient 写的小程序传送文件,用TIdServer可以接收,
但有个怪现象是我每次只能传一个文件如果用TIdTcpClient连续传输多个文件,
TIdServer却只能正常接收第一个文件,从第二个以后就不正常了.
我用WriteBuffer()发文件数据(客户端发文件是循环连续发送的),服务器端用ReadBuffer()接收文件数据,跟踪调试后发现,TIdTcpServer读第二个文件时候,读的Buffer中的内容就不对了,现不知道其中原因哪位大虾有TIdTcp传输文件的经验请指教一二....
 
我用TIdTCPClient 写的小程序传送文件,用TIdServer可以接收,
但有个怪现象是我每次只能传一个文件如果用TIdTcpClient连续传输多个文件,
TIdServer却只能正常接收第一个文件,从第二个以后就不正常了.
我用WriteBuffer()发文件数据(客户端发文件是循环连续发送的),服务器端用ReadBuffer()接收文件数据,跟踪调试后发现,TIdTcpServer读第二个文件时候,读的Buffer中的内容就不对了,现不知道其中原因哪位大虾有TIdTcp传输文件的经验请指教一二....
 
可能是丢包吧,第一个文件还没处理完,第二个文件就发出了,试试看握手式的传输,发送文件和处理完都返回一个消息
 
加上握手消息,也不行, 问题还是存在!...只能接收到第一个文件,第二,第三收不到..
...不知道 IdTcpClient.WriteBuffer() 与 IdTcpServer.ReadBuffer() 如何去同步或者保持一定顺序, 如果发握手信息来控制,但握手信息本身的顺序又成问题.
希望有经验的不吝赐教!
 
另一问题,握手信息的读取,是用循环读取合适,还是用时间控件,如TTimer来控制合适...
哪种机制更合理...
 
IdTCPServerExecute事件里面如果不写代码的话,这样加握手应该是没有问题的,但Execute事件会在你socket状态发生改变的时候激发,也就是说,你握手的返回信息都给Execute先‘抢去了’,你也可以直接在Execute事件里面接收数据,这样是可以的。
如果用握手,TTimer控件的方法是不足取的
 
tcp是流式通信,发送和接收的单位是字节,而不是数据包。
即A方发送的100个数据包(100次writebuf调用),B可能一次收到(一次readbuf),也可能1000才能收到(1000次readbuf)。
比如A writebuf发送数据400字节,B可能一次readbuf读取100个字节,再来一次readbuf收到300字节。
由于是流式的,在网络通信中,需要定义数据包的格式,格式里面最不能少的就是数据包长度(在头部),对方接收正常判断的唯一标准就是接收方收到了正确的回应包。
 
多人接受答案了。
 
后退
顶部