用sendstream,怎么用?客户端怎么处理?
用sendstream,怎么用?客户端怎么处理?
用sendstream,怎么用?客户端怎么处理?

解决方案 »

  1.   

    我不是用TServerSocket/TClientSocket的,我用自己写的东东:
    http://mental.top263.net/mentals/share/dev/msocket.htm
    传过80几M的文件,没有问题,而且很快
      

  2.   

    (涉及表格,请放大窗口游览)我在这只能讲方法,因为没时间写代码,且代码在家。1、定义两程序间的通迅格式,我是这样定的:
       标志 + 本次传送的字符数 + 文件内容 + 结束符  = 1024
        1             2             n     +   1
       发送完后等待对方回应“OK”,再作下一批字符的发送。2、当另一程序接收到数据时,判断格式作处理。处理后发送回 “OK”。
    3、直至文件传送完
      

  3.   

    xiaohuilau兄说得方法挺好的,只是我从未写过这样的程序——
    哪里定义每次传1024个字节?
    怎样控制本次传送的字符数为定长?用stream.read吗?
    我还是有点困难,望各位点拨一下! 
      

  4.   

    程序原理:
    运行服务器端,再运行客户端,输入服务器端的ip地址建立连接
    然后发一个字符通知服务器端,吧文件写入内存流,然后吧流发送给客户端
    客户端接受的流后另存为文件
    注意:
    因为socket的限制,不能一次发送过大的数据,只能分几次发.
    所以服务器端应先发送流的大小,通知客户端这个流共有多大
    客户端根据这个数字来判断是否已经接受完毕.
    内存流对象是程序设计中用的最普遍的,他可以提高I/O的读写能力.
    因为时间限制,代码没经过调试,可能存在错误,但原理肯定没错!!!
    下面是客户端接受数据的例子unit unit1 //客户端
    ......
    var
    form1:Tform1;
    mysize:longint;
    mystream:Tmemorystream;
    implementation
    {$R*.DFM}
    procedure Tform1.formcreate(sender:Tobject);
    begin
    edit1.text:='127.0.0.1';
    button1.caption:='连接';
    button2.caption:='传输';
    mystream:=Tmemorystream.create;//建立内存流对象
    mysize:=0;//初始化
    end;procedure Tform1.button1click(sender:Tobject);
    begin
    if not clientsocket1.active
    then
    begin
    clientsocket1.address:=edit1.text;//远程IP地址
    clientsocket1.port:=3000;
    clientsocket1.open;//建立连接
    end;
    end;procedure Tform1.button2click(sender:Tobject);
    begin
    clientsocket1.socket.sendtext('FT');//发送指令通知服务器端传输文件
    end;procedure Tform1.clientsocket1read(sender:Tobject;socket:tcustomwinsocket);
    var
    mybuffer:array[0..10000]of byte;//设置接受缓冲区
    myrecevicelength:integer;
    s:string;
    begin
    if mysize=0 then //mysize威服务器端发送的字节数,如果为零表示尚未开始发送
    begin
    s:=socket.receivetext;
    mysize:=strtoint(s);//设置接受的字节数
    clientsocket1.socket.sendtext('ready');//发送指令通知服务器端传输文件
    end
    else
    begin  //以下为接受数据部分
    myrecevicelength:=socket.recevicelength;//读出包长度
    socket.receivebuf(mybuffer,myrecevicelength);//接受数据报并读入缓冲区
    mystream.write(mybuffer,myrecevicelength);//将数据写入流中
    if mystream.size>=mysize then //如果流长度大于须接受的字节数,则接受完毕
    begin
    mystream.position:=0;
    mystream.savetofile('filename');
    mystream.clear;
    mysize:=0'
    end;
    end;
    end;procedure Tform1.formclose(sender:Tobject,var action:tcloseaction);
    begin
    mystream.free;
    if clientsocket1.active then clientsocket1.close
    end;end.
      

  5.   

    DeityFox(神狐)的回答很好,回头一定给分!
    但是我最近看了些资料,发现xiaohuilau()所写,的确有道理,因为不自己写协议的话发送大文件时容易出错,
    但我想知道用DeityFox(神狐)的方法发送多大一下的文件比较合适?
      

  6.   

    anyone tell me ,please!
      

  7.   

    anyone tell me ,please! 
    再没人就结帐了!别错过阿!
    再没人就结帐了!别错过阿!
    再没人就结帐了!别错过阿!
      

  8.   

    只要把文件流分块便不会有问题,不能一次发送过大的数据
    我分为8K,no problem
      

  9.   

    10K左右吧
    mybuffer:array[0..10000]of byte;//设置接受缓冲区
    这就是每次发送流的大小