网上看到这个代码但是用这个怎样先传送文件名后在传送文件呢?
还有文件大的话多个客户端上这种方式传送的话有没有问题?客户端procedure TForm1.Button1Click(Sender: TObject);
Var
 s : TWinSocketStream;
 f : TFileStream;
 filename:string;
begin
  ClientSocket1.Active:=true;
 If Not OpenDialog1.Execute Then Exit;
 ClientSocket1.Open;
 s := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
 f := TFileStream.Create(OpenDialog1.FileName, fmShareDenyWrite);
 filename:=OpenDialog1.FileName;
 Try
   s.CopyFrom(f, 0);
 Finally
   s.Free;
   f.Free;
   ClientSocket1.Close;
 End;
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('c:\afile.exe', fmCreate); //这里应该是客户端传送的文件名才对
    try
      FillChar(ReceiveBuffer, 10, 0);
      If SocketStream.WaitForData(5000) Then  begin
         Repeat
           BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
           if BytesRead = 0 then
             ClientSocket.Close
           Else
            F.WriteBuffer(ReceiveBuffer, BytesRead);
         Until  Not SocketStream.WaitForData(2000);
      end;
    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;end.

解决方案 »

  1.   

    还有如果我想客户端上用record方式传数据的话怎样传呢?
    服务端怎样接受呢?
    请指点。
    谢谢。
      

  2.   

    先建立一个Tmemorystrem,将一个结构体写入内存流,然后再将文件写入内存流,再发送。
    接收的时候,可以先读取结构体,然后,再将文件取出来。计算机数据,socket通信,都是以字节为单位的。
      

  3.   

    先转为字节数组,再用Stream.write(Buffer, count).
    记录类型转字节数组function RecordToByteArray(ARec: TRecordType): Bytes;//注:TRecordType是泛型表达
    var
      Src: PAnsiChar;
    begin 
      Src:= PAnsiChar(@ARec);
      SetLength(Result, SizeOf(TRecordType));
      Move(ARec[0], Result[0], SizeOf(TRecordType));
    end;