帮帮忙...问个关于 TServerSocket 和 TClientSocket 的问题...

mdejtod 2008-06-02 03:32:09
RT ... 现在要做一个上传的模块,打算用这两个组件来实现..可是从来没用过这两个东东,也没搞过网络编程这方面的东西....
现在有些问题问下.各位达人帮帮忙...
1.客户端要求是每个文件支持多线程上传,要求线程数可配置.(即如果有多个用户同时上传,则为每个用户单独开一线程来接收)
2.客户端要求能支持断点续传功能,客户端再连接到网络的时候自动把还没传完的文件传完.
3.客户端连接到服务器端的时候会进行身份认证而且客户端的登录帐号和密码是加密.
4.客户端发到服务端的文件需要进行文件数据完整较验.如果失败通知客户端重新发送文件,服务器端会把不完整文件删除.
5.服务器接收的并发数可配置,最高要求1000个.
6.服务端要做好统计数量的接口,统计项目如下:上传/下载速度(KB/S),已上传的文件大小(KB),登录上传的用户名,上传的文件路径.文件传输完共用的时间,上传文件的日期和时间
7.端口监听和释放,即其中一个用户传输完毕,则释放相应的端口.
-------------------------------------------------------------
真诚的请教各位....如果有实现过,麻烦帮忙说一下其中的原理,比如多线程的创建和调用,当有用户发出请求时就要创建一个线程.都要注意些什么,具体的代码我想自己实现
分不够再加.....
...全文
217 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐的泥巴 2011-07-15
  • 打赏
  • 举报
回复
学习中,所以看看。很复杂了。
fuwu1245 2010-10-14
  • 打赏
  • 举报
回复
最近需要用这个东西
回复看下内容再讨论
僵哥 2008-06-04
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 mdejtod 的回复:]
嗯..谢谢两位...
1.服务器端的连接就先不用创建多线程的方式了
2.楼上的大哥..是这样的,
由于客户端是采用多线程分块传输文件,那在服务端就要进行文件粘合...是不是也需要多线程的方式进行接收,然后再粘合文件?
总的来说,现在还剩下这两个问题,客户端的多线程传输.服务端的多线程接收(可以断点)
这两个还不知道从哪里下手,可不可以给个简单的例子?太复杂的看了会晕...呵
[/Quote]
服务端是否使用多线程并没有太大的关系,实际上我们通常写文件都是以禁写的方式打开的,但是对于这种应用来讲,我们就要使用允写方式打开,在写入之前只需要使用LockFile/LockFileEx锁定我们需要写入的那一分片对应的小段就可以了,如此,其它线程如果操作的分片只要跟这个分片不相重叠的话,就不受影响,各自就可以安好地并行。
skylkj 2008-06-04
  • 打赏
  • 举报
回复
我觉得应该是一开始服务器就根据要上传的文件大小创建好文件,客户端在上传数据的同时给出数据所在文件的偏移位置,服务器只管添数据到文件.
服务器要建立一个表来记录每个文件哪些位置已经上传过了,继传时客户端要下载相应的文件维护表来觉得那些是要上传的
mdejtod 2008-06-04
  • 打赏
  • 举报
回复
嗯..谢谢两位...
1.服务器端的连接就先不用创建多线程的方式了
2.楼上的大哥..是这样的,
由于客户端是采用多线程分块传输文件,那在服务端就要进行文件粘合...是不是也需要多线程的方式进行接收,然后再粘合文件?
总的来说,现在还剩下这两个问题,客户端的多线程传输.服务端的多线程接收(可以断点)
这两个还不知道从哪里下手,可不可以给个简单的例子?太复杂的看了会晕...呵
僵哥 2008-06-04
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 mdejtod 的回复:]
呵...感觉越说越模糊了哦
现在有几个问题
1.服务器端到底需不需要采用多线程的方式为每个用户单独分配端口进行连接,我测试时发现同时有多个用户连接到服务器的同一端口也可以?
2.服务器端开多线程进行分块接收客户端同一用户的同一文件,采用哪种方式比较好?要求断点续传..个人觉得采用日志的方式太过了繁琐,
3.客户端上传文件时.用多线程的方式进行文件分块传输..哪位大哥帮忙说一下文件内存映射方面的东西呀?
谢谢各位…
[/Quote]
1.Accept到的客户连接是不占用端口资源的,通讯仍然往同一个端口,这样可以大大节省端口资源,之所以说某些服务器可以达到上十万的用户量,就是因为它不受端口(只有六万多)的约束。至于多线程,那只是业务处理上面的一个性能需求。一个线程可以管一个也可以管多个连接的通讯。重要的是在多核心多CPU的环境当中可以将CPU资源利用起来,这才是多线程的目的。
2.分块传输,这不应该是服务器干的活,而是客户端干的,客户端只要指明了文件是哪一个,当前传上来了多少数据,是从文件哪一个位置(Position)开始的就可以了。
3.就是CreateFileMapping就可以,这样子一个线程控制一个文件的句柄,可以随意地移动文件的位置指针,而不影响其它线程。
skylkj 2008-06-04
  • 打赏
  • 举报
回复
如果你用idtcpserver的话,可以只用一个端口与多个客户端通讯,idtcpserver本身有这个机制.
服务器开多线程主要是方便管理,因为你有多用户且每个用户还有多线程,所以干脆给每个用户创建个idtcpserver并分配独立端口通讯比较好一些.
mdejtod 2008-06-04
  • 打赏
  • 举报
回复
呵...感觉越说越模糊了哦
现在有几个问题
1.服务器端到底需不需要采用多线程的方式为每个用户单独分配端口进行连接,我测试时发现同时有多个用户连接到服务器的同一端口也可以?
2.服务器端开多线程进行分块接收客户端同一用户的同一文件,采用哪种方式比较好?要求断点续传..个人觉得采用日志的方式太过了繁琐,
3.客户端上传文件时.用多线程的方式进行文件分块传输..哪位大哥帮忙说一下文件内存映射方面的东西呀?
谢谢各位....!!!
Heyongfeng 2008-06-04
  • 打赏
  • 举报
回复
关注一下.
mdejtod 2008-06-04
  • 打赏
  • 举报
回复
楼上的兄弟..要做简单也可以,要实现功能强大当然也行..只是要求不同而已....如果只是要一个简简单单的传输文件.就不用这么费劲啦...
kye_jufei 2008-06-04
  • 打赏
  • 举报
回复
c/s模式的TCPserver and TCPclient文件傳輸很簡單的吧,一個發送,另一個接收。
mdejtod 2008-06-04
  • 打赏
  • 举报
回复
呵...谢谢几位热心人...
暂时先实现简单的文件传输...
哪位大哥做过这方面的东西,多多指点....!!
僵哥 2008-06-04
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 mdejtod 的回复:]
to :unsigned
如你所说客户端用多线程发送文件块,那在服务端它怎么将这些写入文件?在 IdTCPServer1Execute 这里进行写文件就可以了吗?
还有就是,你是采用什么方式来断点续传的?也是用记录文件写入的信息吗?
[/Quote]
IdTCPServer没用过。没有做过断点传输。
mdejtod 2008-06-04
  • 打赏
  • 举报
回复
to : skylkj
我觉得这种方法也行,只是操作起来太复杂和繁琐了...
to :unsigned
如你所说客户端用多线程发送文件块,那在服务端它怎么将这些写入文件?在 IdTCPServer1Execute 这里进行写文件就可以了吗?
还有就是,你是采用什么方式来断点续传的?也是用记录文件写入的信息吗?
blazingfire 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mdejtod 的回复:]
客户端和服务器端都要采用多线程的方式进行发送和接收文件,能否说明一下其中的原理?
[/Quote]
客户端在上传文件的时候,最好一个文件传,放到一个线程里传。如果把文件分块让多个线程来传,控制起来要麻烦得多。
在传文件时,客户端大概过程如下,服务端就接收返回相应状态就可以了:

procedure TXXXThread.OnExecute(Sender: TObject);
type
TFileBlock = record
FileName: string[225];
Start: Integer;
Size: Integer;
BlockData: array[1..1024] of byte;
end;
var
ABlock: TFileBlock;
Remain: Integer;
AFile: TFileStream;
Flag: Integer;
begin
//.....
ABlock.Start := XXX//从传输日志取已经传完的位置信息;
ABlock.FileName := YourFileName;
repeat;
AFile.Position := ABlock.Start;
ABlock.Size := AFile.Read(ABlock.BlockData, SizeOf(ABlock.BlockData));
ABlock.Start := AFile.Position;

IdTCPClient.WriteBuffer(ABlock, SizeOf(ABlock));
IdTcpClient.ReadBuffer(Flag, SizeOf(Flag));//由服务器接收返回
if Flag = 成功 then
begin
记录当前传输的日志
Remain := AFile.Size - ABlock.Start;
end
else
begin
Self.Terminate;
Break;
end;
until Remain <=0;
end;

注:楼主还先在网上下载一些示例代码,再学一下控件。然后再看看考虑考虑说不定问题就解决了
blazingfire 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mdejtod 的回复:]
谢谢楼上的兄弟...验证这边还有个问题,用户不止一个,如何保存用户名和相应的密码比较妥当?
能否具体一点说一下如何进行文件分块传输和接收?
客户端和服务器端都要采用多线程的方式进行发送和接收文件,能否说明一下其中的原理?
[/Quote]
对于一个连接(一个用户),TidTcpServer会开辟一个线程(执行一次OnExcute事件)来处理的;所以有多个用户,不用关心,你一
次处理好一个用户的验证就好了,但是要注意处理可能存在的资源冲突
大大怪老张 2008-06-03
  • 打赏
  • 举报
回复
11点54分发帖,11:59分,回帖超过18个。

有源码有实例还有解释。
大大怪老张 2008-06-03
  • 打赏
  • 举报
回复
让那些出 20 分和发在非技术区的的人看看 200 分的帖子是什么效果!
auqfiudh 2008-06-03
  • 打赏
  • 举报
回复
STUDY
mdejtod 2008-06-03
  • 打赏
  • 举报
回复
谢谢楼上的兄弟...验证这边还有个问题,用户不止一个,如何保存用户名和相应的密码比较妥当?
能否具体一点说一下如何进行文件分块传输和接收?
客户端和服务器端都要采用多线程的方式进行发送和接收文件,能否说明一下其中的原理?
加载更多回复(23)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧