关于TIdTcpClient,向TIdTcpServer上传文件正常,接收文件多次调试失败

时间:2022-01-21 00:30:49
我知道TIdTcpServer/TIdTcpClient是阻塞模式,只能TIdTcpClient主动发数据给TIdTcpServer,所以Client向Server传文件很容易就实现了。
但是程序还要实现Client从Server取文件,查了一些资料据说还可以实现,可是多次调试失败。时间不等人啊,难道要在Server端开个TIdTcpClient,Client端再开个TIdTcpServer不成?

希望有经验的朋友多提宝贵建议!分不够再加,哈哈哈。

10 个解决方案

#1


上传:

Client   发送“上传”协议,开始上传
Server   收到“上传”协议,开始接收


下载:

Client   发送“下载”协议,等待服务器消息
Server   收到“下载”协议,查找文件,回复“上传”或“取消”
Server   当回复“上传”协议时,开始上传
Client   收到“上传”协议,开始接收,收到“取消”协议时,就跳出


以上均在同一个连接内完成,只是下载时,加入前二步,然后二步在 TIdTcpServer 内是当作“上传”处理的。

#2


引用 1 楼 sczyq 的回复:
下载: 

Client  发送“下载”协议,等待服务器消息 
Server  收到“下载”协议,查找文件,回复“上传”或“取消” 
Server  当回复“上传”协议时,开始上传 
Client  收到“上传”协议,开始接收,收到“取消”协议时,就跳出 


以上均在同一个连接内完成,只是下载时,加入前二步,然后二步在 TIdTcpServer 内是当作“…


Server只用TIdTcpServer如下能解决问题么?
image->Position = 0;
AThread->Connection->OpenWriteBuffer();
AThread->Connection->WriteInteger(image->Size, true);
AThread->Connection->WriteStream(image);
AThread->Connection->CloseWriteBuffer();

个人觉得关键是Client中用TIdTcpClient接收数据有差异,总不准确。
int iReadSize = IdTCPClient1->ReadInteger();
IdTCPClient1->ReadStream(file, iReadSize, false);
iReadSize好像没有读到一样,每次调试出的字节数都是错的。

貌似要用吗:
While idTcpClient->Connected()
{
....
}
对吗?

#3


人气不够,自己顶!

#4


Server只用TIdTcpServer如下能解决问题么? 


image->Position = 0; 
// AThread->Connection->OpenWriteBuffer(); 
// AThread->Connection->WriteInteger(image->Size, true); 
AThread->Connection->WriteStream(image, -1, true); // 注意改动
// AThread->Connection->CloseWriteBuffer(); 

#5


Client:

IdTCPClient1->ReadStream(file, -1, false); 

#6


引用 5 楼 sczyq 的回复:
Client: 

IdTCPClient1->ReadStream(file, -1, false); 


多谢sczyq!!!

不过遗憾的是你的语句我都调试过的,执行都报错呀,调试好多次过不去。
客户端执行到ReadStream的时候报“Out of Memory”,晕死了......

#7


我有过的调试成功是文件能收下来,但是会多9个字节数,因此图片文件显示不正常。

由于图片格式还要转换,所以不正常仍然算失败的。

#8


没辙了,只好把多的字节想办法去掉再用了......

多谢sczyq!

#9


// AThread->Connection->WriteInteger(image->Size, true); 


9字节可能就是他

#10


已经注释掉的老,不知道为什么会多出字节来。

现在是多5个字节,去掉了文件流就对了。只是用idTcpClient->WriteLn过,idTcpServer并没有再写其它的内容,不知道多的字节怎么进来的,很晕。没时间了,以后有时间再看吧。呵呵

谢谢sczyq!

#1


上传:

Client   发送“上传”协议,开始上传
Server   收到“上传”协议,开始接收


下载:

Client   发送“下载”协议,等待服务器消息
Server   收到“下载”协议,查找文件,回复“上传”或“取消”
Server   当回复“上传”协议时,开始上传
Client   收到“上传”协议,开始接收,收到“取消”协议时,就跳出


以上均在同一个连接内完成,只是下载时,加入前二步,然后二步在 TIdTcpServer 内是当作“上传”处理的。

#2


引用 1 楼 sczyq 的回复:
下载: 

Client  发送“下载”协议,等待服务器消息 
Server  收到“下载”协议,查找文件,回复“上传”或“取消” 
Server  当回复“上传”协议时,开始上传 
Client  收到“上传”协议,开始接收,收到“取消”协议时,就跳出 


以上均在同一个连接内完成,只是下载时,加入前二步,然后二步在 TIdTcpServer 内是当作“…


Server只用TIdTcpServer如下能解决问题么?
image->Position = 0;
AThread->Connection->OpenWriteBuffer();
AThread->Connection->WriteInteger(image->Size, true);
AThread->Connection->WriteStream(image);
AThread->Connection->CloseWriteBuffer();

个人觉得关键是Client中用TIdTcpClient接收数据有差异,总不准确。
int iReadSize = IdTCPClient1->ReadInteger();
IdTCPClient1->ReadStream(file, iReadSize, false);
iReadSize好像没有读到一样,每次调试出的字节数都是错的。

貌似要用吗:
While idTcpClient->Connected()
{
....
}
对吗?

#3


人气不够,自己顶!

#4


Server只用TIdTcpServer如下能解决问题么? 


image->Position = 0; 
// AThread->Connection->OpenWriteBuffer(); 
// AThread->Connection->WriteInteger(image->Size, true); 
AThread->Connection->WriteStream(image, -1, true); // 注意改动
// AThread->Connection->CloseWriteBuffer(); 

#5


Client:

IdTCPClient1->ReadStream(file, -1, false); 

#6


引用 5 楼 sczyq 的回复:
Client: 

IdTCPClient1->ReadStream(file, -1, false); 


多谢sczyq!!!

不过遗憾的是你的语句我都调试过的,执行都报错呀,调试好多次过不去。
客户端执行到ReadStream的时候报“Out of Memory”,晕死了......

#7


我有过的调试成功是文件能收下来,但是会多9个字节数,因此图片文件显示不正常。

由于图片格式还要转换,所以不正常仍然算失败的。

#8


没辙了,只好把多的字节想办法去掉再用了......

多谢sczyq!

#9


// AThread->Connection->WriteInteger(image->Size, true); 


9字节可能就是他

#10


已经注释掉的老,不知道为什么会多出字节来。

现在是多5个字节,去掉了文件流就对了。只是用idTcpClient->WriteLn过,idTcpServer并没有再写其它的内容,不知道多的字节怎么进来的,很晕。没时间了,以后有时间再看吧。呵呵

谢谢sczyq!