我用clientsocket来接收数据,用serversocket来定时发送数据。双方用TWinsocketStream的read和write来读和写的,结果是读到的数据和写的数据不一样阿。而且,在server端还没有写数据的时候,client端的waitfordata(6000)就已经检测到数据,并且读出来的数据不正确。
  请问这到底是什么原因造成的?是不是在哪个地方设置什么属性阿?

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ScktComp;type
      TCon = record
        FileName : String;
        TotalSize : Integer;
        Status : Integer;
      end;  PCON = ^TCON;  TForm1 = class(TForm)
        GroupBox1: TGroupBox;
        GroupBox2: TGroupBox;
        ClientSocket: TClientSocket;
        ServerSocket: TServerSocket;
        btnServerActive: TButton;
        btnClientCon: TButton;
        btnClientDisConn: TButton;
        BtnClientSendF: TButton;
        Memo1: TMemo;
        OpenDialog: TOpenDialog;
        Edit1: TEdit;
        Label1: TLabel;
        procedure btnClientConClick(Sender: TObject);
        procedure btnClientDisConnClick(Sender: TObject);
        procedure BtnClientSendFClick(Sender: TObject);
        procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure btnServerActiveClick(Sender: TObject);
        procedure ServerSocketClientConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocketClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocketClientError(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}var  Count : Integer;function GetFileSize(const FileName: string):integer;
    var f : TFileStream;
    begin
        f := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
        Result :=f.Size;
        F.Free;
    end;procedure TForm1.btnClientConClick(Sender: TObject);
    begin
      ClientSocket.Active := True;
      with OpenDialog do
      begin
          Execute;
          if FileName <> '' then
          begin
              Edit1.Text := 'UPLOAD '+ ExtractFileName(FileName) +' '+Inttostr(GetFileSize(FileName));
              Label1.Caption := FileName;
              ClientSocket.Socket.SendText(edit1.Text);
          end;
      end;
    end;procedure TForm1.btnClientDisConnClick(Sender: TObject);
    begin
      ClientSocket.Active := False;
    end;procedure TForm1.BtnClientSendFClick(Sender: TObject);
    var fs : TFileStream;
        Buf : pointer;
    begin
      fs := TFileStream.Create(Label1.Caption ,fmOpenRead or fmShareDenyNone);
      GetMem(Buf,fs.Size);
      fs.Seek(0,soFromBeginning);
      fs.ReadBuffer(Buf^,fs.Size);
      memo1.Lines.Add('has send : '+inttostr(ClientSocket.Socket.SendBuf(Buf^,fs.Size)));
    end;procedure TForm1.ClientSocketRead(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Memo1.Lines.add(socket.ReceiveText);
    end;procedure TForm1.ClientSocketError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      ErrorCode := 0;
    end;procedure TForm1.btnServerActiveClick(Sender: TObject);
    begin
      ServerSocket.Active := True;
    end;procedure TForm1.ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var c : pcon;
    begin
      c :=new(pcon);
      c.FileName := '';
      c.TotalSize :=  0 ;
      c.Status := 0;
      Socket.Data := c;
      Socket.SendText('已经连接,请输入UPLOAD FILENAME SIZE'#13#10);
    end;procedure TForm1.ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var C : PCON;
        cmd:String;
        Buffer : pointer;
        nRetr : integer;
        fs : TFileStream;
    const bufferSize =  1024 ;begin
      C:= Socket.Data ;
      case c.Status of
       0 :
       begin
         cmd := trim(Socket.ReceiveText) ;
         if  Pos('UPLOAD ',uppercase(cmd)) >  0 then
         begin
           c.FileName := trim(Copy(cmd,Pos(' ',cmd)+1,Length(cmd)));
           c.TotalSize := StrToInt(Copy(c.FileName,Pos(' ',c.FileName)+1,Length(c.FileName)));
           c.FileName := trim(Copy(c.FileName,1,Pos(' ',c.FileName)));
           c.Status := 1;
           Socket.Data := C;
           Socket.SendText('you can send File  !'#13#10);
         end;
       end;
       1 :
       begin
         Count := count + 1;
         GetMem(Buffer,BufferSize);
         nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);
         Memo1.Lines.Add(IntToStr(Count) + ' ' + IntToStr(nRetr));
         if not FIleExists('c:\'+c.FileName) then
         begin
           fs :=TFileStream.Create('c:\'+c.FileName,fmCreate or fmShareDenyNone);
           fs.Seek(0,soFromBeginning);
         end
         else
         begin
           fs :=TFileStream.Create('c:\'+c.FileName,fmOpenWrite or fmShareDenyNone);
           fs.Seek(0,soFromEnd);
         end;
         fs.WriteBuffer(Buffer^,nRetr);
         fs.Destroy;
         FreeMem(Buffer);
       end;
      end;
    end;procedure TForm1.ServerSocketClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      ErrorCode := 0;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Count := 0;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      ClientSocket.Active := False;
      ServerSocket.Active := False;
    end;end.
      

  2.   

    我也用过这种方法,倒没有问题。
    现在我用的是Twinsocketstream的read,write来读写的。就出现了上述问题,谁能给我解释是什么原因吗?
      

  3.   

    可能是你发送和接受数据的速度不统一吧!没用过这个,但是常用COM口发送和接受数据,两边的参数一定要统一,否则过来的就是乱麻了!
      

  4.   

    我弄清楚了,原来是我在TServerClientThread的ClientExecute函数里声明用来发送数据的buffer:array of byte,是一个动态数组,将它声明为静态变量就不会有这个问题了。
    这个问题可以揭贴啦!