一下的代码。我原本在d5下可以通过的。但是现在换了d7.编译可以通过。但是运行没反应。请各位指教~~~!!client端
procedure Tform1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
 var DataLen: Integer);
var
MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
MyReceviceLength: integer;
S: string;
MyBmp: TBitmap;
MyJpg: TJpegimage;
begin
StatusBar1.SimpleText := '正在接收数据......';
if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}
begin
S := tcpclient1.Receiveln;
MySize := Strtoint(S); {设置需接收的字节数}
TcpClient1.Sendln('ready'); {发指令通知服务端开始发送图象}
end
else
begin {以下为图象数据接收部分}
MyReceviceLength := tcpclient1.BytesReceived; {读出包长度}
StatusBar1.SimpleText := '正在接收数据,数据大小为:' + inttostr(MySize);
tcpclient1.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}
MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中}
if MyStream.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕}
begin
MyStream.Position := 0;
MyBmp := tbitmap.Create;
MyJpg := tjpegimage.Create;
try
MyJpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
MyBmp.Assign(MyJpg); {将JPG转为BMP}
StatusBar1.SimpleText := '正在显示图像';
form1.Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }
form1.Image1.Picture.Bitmap.Assign(MyBmp);
finally {以下为清除工作 }
MyBmp.free;
MyJpg.free;
TcpClient1.Sendln('cam');
MyStream.Clear;
MySize := 0;
end;
end;
end;
end;
server端procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
var
s:string;               //接受的指令
s1:string;              //字符型后的流
MyBmp: TBitmap;
Myjpg: TJpegimage;
MyStream: TMemorystream;//内存流对象beginS := clientsocket.Receiveln;if s='cam'then       //屏幕
  begin
    try
     MyStream := TMemorystream.Create;{建立内存流}
     MyBmp := TBitmap.Create;
     Myjpg := TJpegimage.Create;
     Cjt_GetScreen(MyBmp, True); {True表示抓鼠标图像}
     Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
     Myjpg.CompressionQuality := 50; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
     Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
     Myjpg.free;
     MyStream.Position := 0;{注意:必须添加此句}
     s1 := inttostr(MyStream.size);{流的大小}
     Tcpserver1.Sendln(s1); {发送流大小}
     finally
     MyBmp.free;
  end;
 end;
     if s = 'ready' then {客户端已准备好接收图象}
       begin
        MyStream.Position := 0;
        tcpserver1.SendStream(MyStream); {将流发送出去}
end;

解决方案 »

  1.   

    看看我的代码,希望能对你有所帮助//--定义常量
    const
      MP_Read='1';   //--准备发送数据
      MP_Info='2';   //--发送的数据信息
      Mp_Data='3';   //--发送数据
    ----------Server----------------
    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      linkcmd:string;
      Mybmp: Tbitmap;
      //Buf:pointer;
      buf:array[1..8192] of byte;
      sendsize: integer;                 //每次发送的大小
      bufsize:integer;begin
     linkcmd:=trim(Socket.ReceiveText);
     case linkcmd[1] of
       MP_Read:
         begin
            MyStream := TMemoryStream.Create;
            MyJpg:=Tjpegimage.Create;
            Mybmp := TBitmap.Create;
            GetScreen(mybmp);
            //bmpmap.PixelFormat :=pf8bit;   //监看颜色降至为256色
            Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
            Myjpg.CompressionQuality := 50; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
            image1.Picture.Assign(myjpg);   //--显示取得的图
            //image1.Picture.Bitmap.Assign(mybmp);
            MyStream.Clear;
            Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
            Myjpg.free;
            Jpgsize:=mystream.Size;
            socket.SendText(Mp_Info+inttostr(jpgsize));
            mystream.SaveToFile('c:\temp\55.jpg');
            mystream.Position:=0;
            edit2.Text:=inttostr(jpgsize);
            fssize:=0;           //--传送字节数置0
            MyBmp.free;
          end;
        MP_Data:
           begin
            bufsize:=sizeof(buf);
            if JpgSize > BufSize then
              SendSize := BufSize
            else
              SendSize := JpgSize;
            mystream.ReadBuffer(Buf, SendSize);
            JpgSize := JpgSize - SendSize;
            fssize:=fssize+sendsize;
            edit3.Text :=inttostr(fssize);
            if JpgSize = 0 then
            begin
              MyStream.Clear; { 清空流 }
              MyStream.Free;
            end;
            socket.SendBuf(buf,SendSize);  { 将数据发到主控机 }
          end;
       end;
    end;
    ----------Client----------------
    procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      myjpg:tjpegimage;
      ilen:integer;
      buf:array[1..8192] of byte ;
      BufSize:integer;
      scmd:string;
    begin
      if  bReadText then
        begin
          scmd:=socket.ReceiveText;
          if scmd[1]=MP_Info then
          begin
            ilen:=length(scmd);
            jpgsize:=strtoint(copy(scmd,2,ilen-1));
            edit3.Text:=inttostr(jpgsize);         //--显示所接收的总字节数        
            mystream:=TMemorystream.Create;
            mystream.clear;
            socket.SendText(Mp_Data);
            bReadText:=false;
          end;
        end
      else
       begin
        BufSize:=sizeof(buf);
        if jpgsize > BufSize then
          RecSize := BufSize
        else
          RecSize := jpgsize;
        socket.ReceiveBuf(buf, RecSize);
        jpgSize := jpgSize - RecSize;
        edit4.Text:=inttostr(jpgsize);         //--显示还剩余的字节数
        mystream.WriteBuffer(buf,recsize);
        if jpgsize = 0 then   //读完数据
        begin
           mystream.Position := 0;
           myjpg:=Tjpegimage.Create;
           myjpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
           image1.Picture.Assign(myjpg);     //--显示图片
           mystream.SaveToFile('c:\temp\555.jpg');   //--将收到的图片临时保存
        end
        else
          socket.SendText(MP_data);
    end;
    end;