我想在socket中多连接传大文件,需要用到多线程,只是不知道如何写,是用ServerType属性吗?有人肯指点吗?

解决方案 »

  1.   

    直接调API函数,手动创建SOCKET.
      

  2.   

    是的,将ServerType设为stNonBlocking就可以啦。
      

  3.   

    TMultiThread = class(TServerClientThread)
        constructor Create(CreateSuspended: Boolean; ASocket:
                                TServerClientWinSocket);
        procedure ClientExecute;override;
      end;procedure TfrmServer.sskProvideServerGetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    begin
      CSocket:= ClientSocket;
      SocketThread:= TMultiThread.Create(false,ClientSocket);
    end;
      

  4.   

    不对啊,楼上的huangrenguang(湖) ,你是不是少了Create函数的实现了?
    没写全啊
      

  5.   

    {***************************************************************
     * 方 法 名  : ClientExecute
     * 编写目的   : 处理与客户端的信息交流
     * 作    者  : 黄仁光
     * 参    数  : None
     * 结    果  : None
     * 编写日期   :2002年10月08日
     ****************************************************************}
    procedure TMultiThread.ClientExecute;
    var
      SktStream : TWinSocketStream;
      f: file of Byte;
      FileToSendName:String;
      CommandSend:String;
      SendFileSize:int64;
    begin
      UserHost := CSocket.RemoteHost;
      FillChar(objSegInfo,sizeof(objSegInfo),0);
      SktStream:= TWinSocketStream.Create(CSocket,5000);
      if SktStream.WaitForData(8000) then
      begin
        SktStream.ReadBuffer(objSegInfo,sizeof(objSegInfo));
        //响上传应请求
        if StrPas(objSegInfo.RequstSendCommand) = '要求上传文件' then
        begin
          if Application.MessageBox(PChar('客户'+UserHost+'请求上传文件,同意吗?'),'客户请求',MB_OKCANCEL) = IDOK then
          begin
            CommandSend := '允许发送文件';
            StrPCopy(objSegInfo.RequstSendCommand,CommandSend);
          end
          else
          begin
            CommandSend := '不允许发送文件';
            StrPCopy(objSegInfo.RequstSendCommand,CommandSend);
          end
        end;
        //获取上传来的文件名
        if Trim(StrPas(objSegInfo.FileName)) <> '' then
        begin
          FileToSendName := StrPas(objSegInfo.FileName);
          frmServer.sbrInformation.Panels.Items[1].Text := ExtractFileName(StrPas(objSegInfo.FileName));
          AssignFile(f, GetFTPRoot+'\'+ExtractFileName(FileToSendName));
          try
            Reset(f);
          except
            Application.MessageBox('文件打开错误', '提示', MB_OK);
            SktStream.Free;
            exit;
          end;
          //判断是否接收完毕
          SendFileSize := objSegInfo.FileSize;//发送方所发送的文件大小,当发送方认为发送完毕时传送过来
          objSegInfo.FileSize:= FileSize(f);//FileSize(f)实际接收到的文件大小,续传和完毕时要用到
          if FileSize(f) = SendFileSize then
          begin
            StrPCopy(objSegInfo.FileSendComplete,'文件接收完毕');
            //objSegInfo.FileSendComplete := '文件接收完毕';
            frmServer.memInformation.Lines.Add('接收来自'+UserHost+'的文件完毕');
            frmServer.memInformation.Lines.Add('文件名为:'+ExtractFileName(FileToSendName));
            frmServer.memInformation.Lines.Add('文件大小为:'+IntToStr(SendFileSize));
          end
          else
          begin
            frmServer.memInformation.Lines.Add(UserHost+'准备续传文件');
            frmServer.memInformation.Lines.Add('续传的文件名为:'+ExtractFileName(FileToSendName));
          end;
          CloseFile(f);
        end;
        SktStream.WriteBuffer(objSegInfo,sizeof(objSegInfo));
        SktStream.Free;
      end;
    end;constructor TMultiThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
    begin
      inherited;
      FreeOnTerminate:= true;
    end;