客户端:
Var
  s : TWinSocketStream;
  f : TFileStream;
begin
if not strlib.showdlg('真的要上传数据吗?') then exit;
if not cs1.Active then cs1.Active:=true;
  s := TWinSocketStream.Create(Cs1.Socket, 60000);
  f := TFileStream.Create('c:\casher2000.rar, fmShareDenyWrite);
  Try//我用断点运行时发现f是空的
    s.CopyFrom(f, 0);//出错提示:write error 64 指定的网络名不再可用
  Finally
    s.Free;
    f.Free;
  End;服务端:
Procedure TClientThread.ClientExecute;
Var
  ReceiveBuffer : Array[0..4095] Of Char;
  SocketStream : TWinSocketStream;
  BytesRead : Integer;
  F : TFileStream;
Begin
 While Not Terminated And ClientSocket.Connected Do
  Begin
   try
     SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
     F := TFileStream.Create('d:\casher2000.rar', fmCreate);
     try
       FillChar(ReceiveBuffer, 10, 0);
       If SocketStream.WaitForData(5000) Then//不懂
        Repeat
          BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
          if BytesRead = 0 then
            ClientSocket.Close
          Else
           F.WriteBuffer(ReceiveBuffer, BytesRead);
        Until  Not SocketStream.WaitForData(2000);
     finally
       SocketStream.Free;
       ClientSocket.Close;
       f.Free;
     end;
   except
   end;
  End;
End;
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  SocketThread := TClientThread.Create(False, ClientSocket);
end;
这是我东拼西凑来的代码
d:\casher2000.rar是空的,我规定一次传60000字节,但下一次怎么传啊
要用循环吗?

解决方案 »

  1.   

    TWinSocketStream.Create(Cs1.Socket, 60000)中的60000是timeout,不是规定一次传60000字节,不需要用循环TWinSocketStream.CopyFrom自己就能处理!!!
      

  2.   

    先定义包的大小 如1024,后两端来回发送命令,直至收到的文件大小等于要发送的文件大小。我现在正做紧关于这个问题的工程,巳被我解决了,我的QQ是63654417:
    主要用的api是copyfrom,ReadBuffer,Write,
      

  3.   

    popprogrammer() 
    老大能发送点代码吗?我好急啊都几天了还没有解决?感激不尽
    [email protected]
      

  4.   

    现在我传送一个.txt的文件,完了以后发现传过去的是空的没有数据?