我用IdtcpServer和IdTcpClient传文件,请问怎么能够同时传输多个文件。就象qq的传文件功能一样。

解决方案 »

  1.   

    client端需要建多个连接,而且是在进程中建,一个进程一个连接。
      

  2.   

    to erhan(二憨) 要是服务端不监听多个端口的话?客户端怎么建立多个连接。
    还有是多个文件同时传送。
    也许服务端把所选的文件全部读到一个文件流中,然后向不同的客户端发送?但是多个客户端能够连接同一个服务端的端口?很多我不是很清楚还请指教。我的qq254527732
      

  3.   

    to :erhan(二憨) :按照你的思路向下走的话。那么我如何才能够将不同的文件写入一个文件流(各个文件之间以特定的符号分割开),特别是当前一个文件已经开始传输的情况下,我又要开始传一个文件应该怎么操作呢?我对同一个文件流进行操作不会出什么错吗?
      

  4.   

    晕,一个文件一个文件流哈。
    一个服务端会针对每个客户端启一个进程,然后建立一个文件流。
    各个客户端分别传它们各自负责的文件。
    如果你的客户端只有一个,但又想同时传多个文件的话,应该在客户端启多个进程,每个进程一个idtcpclient,向服务端发起连接,并传送文件,一个进程负责一个文件。不鸡道我说明白了木
      

  5.   

    没必要,本来IdtcpServer就是多线程的,所以,一个线程就可以传一个文件,互不干扰,
    erhan(二憨) 说的基本上没错
      

  6.   

    很感激大家的积极回答:小弟还有个问题想请教各位。
    按照上面的说法,我是不是应该在IdTcpServer的onconnection时间里面建立文件留和传输文件给客户端?还有我是serevr传 client的。那位大哥最好能够给我的demo。小弟先在这谢谢了。
      

  7.   

    很郁闷啊,我按照各位高手的思路还是不行,同时传多个个文件就这么难?
    假如一个文件已经开始传输了,同时我又想向同一个客户端传输另文件我应该怎么做?
    是直接创建文件流,然后发送?关键是这些代码我应该写在什么地方?
    我写在onexcute里面不行啊,他还是要等前一个文件传完了才有反映。还有多个文件流要怎么定义才能够实现?
      

  8.   

    To:jadeluo(秀峰)
    首先很感谢你的回复,其实我也基本上是按照你那么做的。但是中间出了些问题。
    1。我也是每个文件传输开始时,先发一个通讯包,包括以下内容:文件大小、文件名、文件编号,其中文件编号为标识每个文件的唯一编号。
    2。等收到接收方的同意接收信号后开始传输,这样的话传一个文件很正常,现在的关键问题是如何处理当已经有文件正在传输又想开始传输其他的文件。
    请指教!!
      

  9.   

    补充一句:用的是indy 的Tidtcpserver和Tidtcpclient
      

  10.   

    server 传 client
    改为client 传 server不就行了多加两个控件而已
      

  11.   

    多线程啊ID有DEMO,你可以看看
      

  12.   

    thanks .问题正在研究实现中…………。
      

  13.   

    我看了demo基本上晓得思想但是有些地方还是模糊。
    demo在idtcpserver的onconnect事件把一些东西保存进了线程的data里面,但是那些都不是客户端 传过去的信息。请问我是不是要换其他的控件来把信息先传过去?信息包括文件的id,name,size
      

  14.   

    OnConnect事件中记录的是客户端的连接信息, 你现在要传输文件的话, 文件数据的传输是要按照你自己的通讯协议来进行的, 与这个通讯协议相关的信息, 你需要在线程中另外保存起来。
      

  15.   

    也就是说我要用其他方法来先把文件信息传输过去,当idtcpclient连接的时候idtcpserver就建立线程并把文件信息保存在线程的数据中。??
      

  16.   

    http://community.csdn.net/Expert/topic/4917/4917510.xml?temp=.2059442
      

  17.   

    那我以后怎么区分那个文件该发给那个。说明:不能够根据IP地址,因为我是同一个机子上创建N个客户端连接到服务器端。现在还没有确定服务端是发送还是接受。那种方式好些呢?另外我想问一下我到底是IdTcpServer向IdTcpClient发送文件好还是反过来呢?给点建议。
    好象:sever向-->多个client也可以,多个client-->server也可以到底哪个好操作一些呢?
    谢谢。
      

  18.   

    以TCP协议当中,由于TCP协议的特点就是保障性,所以在这个传输过程当中,网络可能存在着间隔空隙时间,所以一次一个文件的传输未必达得到最快,从而允许多文件同时传输(当然,如果传的太多了,由于网络带宽被分配掉,单个文件来说,它的传输速率会随之下降).由于TCP每个连接当中的传输是保障顺序性的,所以要传输多个文件就得开出多个连接(楼楼楼...上有说过每个进程一个连接,其实这种说法不知道是打了个错字,还是对进程和线程的概念不清析,当然也并不是说一进程一连接不可以,只是那样子相比使用多线程来说实在是一种浪费^_^).TCP的服务器端每接受一个连接就会得到一个不同的SocketHandle(SOCKET,相当于ListenSocket的一个服务Session,与ListenSocket有着极密切的关联,继承了ListenSocket的相关信息,同时由于是从属于ListenSocket的一个Session,所以它的关闭不对于ListenSocket产生影响,但是ListenSocket的关闭会有所影响),从而可以从中识别出来,各数据属于谁谁谁(假设使用的是非阻塞模式^_^).此时就已经完成了一个多线程(多文件)的传输模型.但是这当中又存在一个问题,就是用户可能会由于某种原因需要取消传输.在这个问题上,原来在BSD当中考虑使用一种超前(超优先级)控制包(OOB Data,Out of Band Data,发送send或接受recv时flag参数带MSG_OOB),从而达到控制,但是由于这种数据包的特殊性,就很可能被Hacket利用(甚至在此之前还有针对如Win95的139端口等进行OOB攻击的DoS软件^_^),从而不再建议使用.为了解决楼主所提出来的问题,建议在每一次连接即在传输文件前连接作为"命令连接"(职业用来传输命令的一条链路)用以发送控制信息(有点类似于FTP的那种意味^_^),而后传输文件另外连接,这样子当需要取消某个传输时,可以直接closesocket来关闭文件传输的连接,并同时从"命令连接"发送控制信息,用以取消在服务器端所分配下的资源.
      

  19.   

    比较深奥,现在的问题是服务器端怎么取消的问题。客户端取消问题已经解决。我通过遍历Idtcpserver.threadlist.locklist找到对应的连接来关闭。但是关闭的时候总是出错。不晓得是不是我使用的locklist和unlocklist 出了问题,但是我已经配对使用。