大侠,请教了:我曾经看到你说socket最好不要用ReceiveLength
最好用ReceiveBuf 但是里面的integer参数传什么好呢?
下面一段代码我收到的是一个传输错误的图象,请问问题出在什么地方?
如果用ReceiveLength的方法我在本机上接收无误,在其他机子上也无法正确接收,怎么回事阿?
多谢了!!!!急用!!!
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  buffer:array [0..10000] of byte; //设置接收缓冲区
  len,size:integer;
  ll:string;
  b:Tbitmap;
  j:Tjpegimage;begin
  if c=0 then //C为服务端发送的字节数,如果为0表示为尚未开始图象接收
  begin
    ll:=socket.ReceiveText;
    c:=strtoint(ll); //设置需接收的字节数
    LeftSIze:=strtoint(ll);
    clientsocket1.Socket.SendText('okok'); //通知服务端开始发送图象
  end
  else
  begin //以下为图象数据接收部分
//    len:=socket.ReceiveLength; //读出包长度
    if LeftSize>8192 then recvsize:=8192
   else   recvsize:=LeftSize;
    socket.ReceiveBuf(buffer,recvsize); //接收数据包并读入缓冲区内
    m.Write(buffer,recvsize); //追加入流M中
   LeftSize:=LeftSize-recvsize;
    size:=m.Size;
    if m.Size>=c then //如果流长度大于需接收的字节数,则接收完毕
    begin
      m.Position:=0;
      b:=Tbitmap.Create;
      j:=Tjpegimage.Create;
      try
        j.LoadFromStream(m); //将流M中的数据读至JPG图像对象J中
        j.SaveToFile('C:\receive.jpeg');
        Image1.Picture.Bitmap.Assign(j); //分配给image1元件
        finally //以下为清除工作
        b.free;
        j.free;
        clientsocket1.Active:=false;
        clientsocket1.Active:=true;
        m.Clear;
        c:=0;
      end;
    end;
  end;end;

解决方案 »

  1.   

    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      s,s1:string;
      desk:tcanvas;
      bitmap:Tbitmap;
      jpg:Tjpegimage;
      myrect1,myrect2,Destrect1,Destrect2:Trect;
        i,SendSize:integer;
       Buf:array[0..BufSize-1] of char;
    begin
      s:=socket.ReceiveText;
      if s='gets' then //客户端发出申请
      begin
        bitmap:=Tbitmap.Create;
        jpg:=Tjpegimage.Create;
        desk:=Tcanvas.Create; //以下代码为取得当前屏幕图象
        desk.Handle:=getdc(0);
        m1:=tmemorystream.Create; //初始化流m1,在用sendstream(m1)发送流后,
        //它将保留到socket对话结束,
        //不能用手工free掉,否则会触发异常
        MyRect1:=Rect(0,0,screen.Width , Screen.Height );
        DestRect1:=MyRect1;
        bitmap.Width:=screen.Width ;
        bitmap.Height:=Screen.Height ;
        bitmap.Canvas.CopyRect(DestRect1,desk,MyRect1);
        // bitmap.SaveToFile('C:\socket.bmp');
        jpg.Assign(bitmap); //将图象转成JPG格式
        //jpg.SaveToFile('C:\socket.jpeg');
        jpg.SaveToStream(m1); //将JPG图象写入流中
         //   LeftSize:=m1.Size;
        jpg.free;
        m1.Position:=0;
        s1:=inttostr(m1.size);
        Socket.sendtext(s1); //发送图象大小
      end;
      if s='okok'then //客户端已准备好接收图象
      begin
        m1.Position:=0;
      {  if LeftSize>BufSize then SendSize:=BufSize
        else   SendSize:=LeftSize;
        m1.ReadBuffer(Buf,SendSize);
        LeftSize:=LeftSize-SendSize;
        if LeftSize=0 then m1.Clear;}{ 清空流 }
        Socket.SendStream(m1); //发送JPG图象
      end;
    end;
      

  2.   

    你先理解TCP通讯几个关键地方,等空了我再具体说说你代码。
    1,TCP相对比较耗时的是连接过程,(这点不涉及错误,只涉及优化)。
    2,TCP是基本数据流的通讯,它自身并没有把传出的数据流作什么分隔同步机制,需要自己
       实现。
    3,根据2点,在异步SOCKET中,整个数据流是保持可靠的,但单个OnClientRead不一定
    会是完整数据。