太大?
我从1k到1m都设过了。不会的,我试过我改动buffuer的大小,速度变换不大

解决方案 »

  1.   

    你是把8M的文件一次读到了一个Buffer里吗?
    如果是这样的话,你把它分成几份,分几次发送试试
      

  2.   

    不是啊,我不是loop until data over了吗
    一次从文件读取MaxDateLength个字节发送
      

  3.   

    你再Loop前开Buffer,Loop Finish后再释放
      

  4.   

    可能是我没说清楚,是这样
    While data not over Do
     GetMem for Buffer
     Read Data from file into Buffer
     Socket.SendBuffer
     FreeMem(Buffer)
    end;
    to redwoodnymph(红蜂鸟) 
    是不是想说Getmem和Freemem占用了太多的时间,我试了一下,这两个操作非常快,几乎不耗时。用GetTickCount计算操作之间的差值一直是0,我想不是这里的问题。
      

  5.   

    没有人做过这方面的东东吗?速度是这样的吗?
    我用icq发送(UDP)8M只用了17秒。
    在TCP上的传输很多,Smtp、rpc什么的,都挺快的啊。
    是不是Socket的Buffer太小(这里的Buffer是指Socket的,不是我读取对文件数据时键的buffer)。可是在delphi里怎么设置这个buffer呢。
      

  6.   

    我做了,用了5秒左右来着。用的是Delphi6 Indy的控件,建议你也使用Indy中的控件。idTcpserver,idtcpclient.
    我以前也是用Dephi5做的,差点搞的吐血也没有搞好,用了DELPHI6一天就OK了。
      

  7.   

    终于搞定了。
    kofxdm(八稚) 
    你说的不太正确。后来我去一些国外的论坛上看到另一种处理方式。
    server采用阻塞模式(因为有可能同时给多个客户发文件,每个连接请求创建一个线程处理),而客户端使用非阻塞模式--但如果客户端也要同时接收多个用户的文件那也必须在线程中处理。(此线程的执行代码实际上是一个空循环,由于是在线程中的循环,并不会导致程序其他操作的运行)
    接收文件时利用clientSocket的onread和ondisconnect事件。
    onread下创建buffer,然后调用Readbuffer,接着保存数据,释放buffer
    但是要注意一点,delphi的文档描述如下
    Note: Non-blocking sockets do not always receive an OnRead event for the last bit of data passed over the connection. When using a non-blocking socket, check for any unread data in the OnDisconnect event to make sure that everything is handled.
    所以还要在ondisconnect里在做一个onread里的事情。就ok了。
    后来发一个8M的文件,算上显示进度条,保存文件等收尾操作一共用了16秒
    就是它了。这下可以找mm去了。但愿还没被人拐走。呵呵来者有分!!!不会让大家白辛苦的。