但是程序还要实现Client从Server取文件,查了一些资料据说还可以实现,可是多次调试失败。时间不等人啊,难道要在Server端开个TIdTcpClient,Client端再开个TIdTcpServer不成?
希望有经验的朋友多提宝贵建议!分不够再加,哈哈哈。
10 个解决方案
#1
上传:
Client 发送“上传”协议,开始上传
Server 收到“上传”协议,开始接收
下载:
Client 发送“下载”协议,等待服务器消息
Server 收到“下载”协议,查找文件,回复“上传”或“取消”
Server 当回复“上传”协议时,开始上传
Client 收到“上传”协议,开始接收,收到“取消”协议时,就跳出
以上均在同一个连接内完成,只是下载时,加入前二步,然后二步在 TIdTcpServer 内是当作“上传”处理的。
Client 发送“上传”协议,开始上传
Server 收到“上传”协议,开始接收
下载:
Client 发送“下载”协议,等待服务器消息
Server 收到“下载”协议,查找文件,回复“上传”或“取消”
Server 当回复“上传”协议时,开始上传
Client 收到“上传”协议,开始接收,收到“取消”协议时,就跳出
以上均在同一个连接内完成,只是下载时,加入前二步,然后二步在 TIdTcpServer 内是当作“上传”处理的。
#2
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();
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);
IdTCPClient1->ReadStream(file, -1, false);
#6
多谢sczyq!!!
不过遗憾的是你的语句我都调试过的,执行都报错呀,调试好多次过不去。
客户端执行到ReadStream的时候报“Out of Memory”,晕死了......
#7
我有过的调试成功是文件能收下来,但是会多9个字节数,因此图片文件显示不正常。
由于图片格式还要转换,所以不正常仍然算失败的。
由于图片格式还要转换,所以不正常仍然算失败的。
#8
没辙了,只好把多的字节想办法去掉再用了......
多谢sczyq!
多谢sczyq!
#9
// AThread->Connection->WriteInteger(image->Size, true);
9字节可能就是他
9字节可能就是他
#10
已经注释掉的老,不知道为什么会多出字节来。
现在是多5个字节,去掉了文件流就对了。只是用idTcpClient->WriteLn过,idTcpServer并没有再写其它的内容,不知道多的字节怎么进来的,很晕。没时间了,以后有时间再看吧。呵呵
谢谢sczyq!
现在是多5个字节,去掉了文件流就对了。只是用idTcpClient->WriteLn过,idTcpServer并没有再写其它的内容,不知道多的字节怎么进来的,很晕。没时间了,以后有时间再看吧。呵呵
谢谢sczyq!
#1
上传:
Client 发送“上传”协议,开始上传
Server 收到“上传”协议,开始接收
下载:
Client 发送“下载”协议,等待服务器消息
Server 收到“下载”协议,查找文件,回复“上传”或“取消”
Server 当回复“上传”协议时,开始上传
Client 收到“上传”协议,开始接收,收到“取消”协议时,就跳出
以上均在同一个连接内完成,只是下载时,加入前二步,然后二步在 TIdTcpServer 内是当作“上传”处理的。
Client 发送“上传”协议,开始上传
Server 收到“上传”协议,开始接收
下载:
Client 发送“下载”协议,等待服务器消息
Server 收到“下载”协议,查找文件,回复“上传”或“取消”
Server 当回复“上传”协议时,开始上传
Client 收到“上传”协议,开始接收,收到“取消”协议时,就跳出
以上均在同一个连接内完成,只是下载时,加入前二步,然后二步在 TIdTcpServer 内是当作“上传”处理的。
#2
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();
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);
IdTCPClient1->ReadStream(file, -1, false);
#6
多谢sczyq!!!
不过遗憾的是你的语句我都调试过的,执行都报错呀,调试好多次过不去。
客户端执行到ReadStream的时候报“Out of Memory”,晕死了......
#7
我有过的调试成功是文件能收下来,但是会多9个字节数,因此图片文件显示不正常。
由于图片格式还要转换,所以不正常仍然算失败的。
由于图片格式还要转换,所以不正常仍然算失败的。
#8
没辙了,只好把多的字节想办法去掉再用了......
多谢sczyq!
多谢sczyq!
#9
// AThread->Connection->WriteInteger(image->Size, true);
9字节可能就是他
9字节可能就是他
#10
已经注释掉的老,不知道为什么会多出字节来。
现在是多5个字节,去掉了文件流就对了。只是用idTcpClient->WriteLn过,idTcpServer并没有再写其它的内容,不知道多的字节怎么进来的,很晕。没时间了,以后有时间再看吧。呵呵
谢谢sczyq!
现在是多5个字节,去掉了文件流就对了。只是用idTcpClient->WriteLn过,idTcpServer并没有再写其它的内容,不知道多的字节怎么进来的,很晕。没时间了,以后有时间再看吧。呵呵
谢谢sczyq!