在Delphi6 下如何用 ServerSocket 和 ClientSocket 编写流传输图像的程序,希望能提供源码。

解决方案 »

  1.   

    傳送文件可用, 將 FileStream 改為你的 流图像就可
    unit Unit1; interface uses 
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
      Dialogs, ScktComp, StdCtrls; type 
      TForm1 = class(TForm) 
        ClientSocket1: TClientSocket; 
        ServerSocket1: TServerSocket; 
        btnTestSockets: TButton; 
        procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); 
        procedure FormCreate(Sender: TObject); 
        procedure FormDestroy(Sender: TObject); 
        procedure ClientSocket1Disconnect(Sender: TObject; 
          Socket: TCustomWinSocket); 
        procedure ClientSocket1Connect(Sender: TObject; 
          Socket: TCustomWinSocket); 
        procedure ServerSocket1ClientConnect(Sender: TObject; 
          Socket: TCustomWinSocket); 
        procedure btnTestSocketsClick(Sender: TObject); 
      private 
        FStream: TFileStream; 
        { Private-Deklarationen } 
      public 
        { Public-Deklarationen } 
      end; var 
      Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ClientSocket1Read(Sender: TObject; 
      Socket: TCustomWinSocket); 
    var 
      iLen: Integer; 
      Bfr: Pointer; 
    begin 
      iLen := Socket.ReceiveLength; 
      GetMem(Bfr, iLen); 
      try 
        Socket.ReceiveBuf(Bfr^, iLen); 
        FStream.Write(Bfr^, iLen); 
      finally 
        FreeMem(Bfr); 
      end; 
    end; procedure TForm1.FormCreate(Sender: TObject); 
    begin 
      FStream := nil; 
    end; procedure TForm1.FormDestroy(Sender: TObject); 
    begin 
      if Assigned(FStream) then 
      begin 
        FStream.Free; 
        FStream := nil; 
      end; 
    end; procedure TForm1.ClientSocket1Disconnect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    begin 
      if Assigned(FStream) then 
      begin 
        FStream.Free; 
        FStream := nil; 
      end; 
    end; procedure TForm1.ClientSocket1Connect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    begin 
      FStream := TFileStream.Create('c:\temp\test.stream.html', fmCreate or fmShareDenyWrite); 
    end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    begin 
      Socket.SendStream(TFileStream.Create('c:\temp\test.html', fmOpenRead or fmShareDenyWrite)); 
    end; procedure TForm1.btnTestSocketsClick(Sender: TObject); 
    begin 
      ServerSocket1.Active := True; 
      ClientSocket1.Active := True; 
    end; end.
      

  2.   

    流图像转输与接收部份的代码,请大侠再帮我看看:-----------------Server------------------------
    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      linkcmd:string;
      Mybmp: Tbitmap;
      MyStream: TMemoryStream; //采集数据流
      MyJpg:Tjpegimage;
    begin
     linkcmd:=Socket.ReceiveText;
     if linkcmd='传送图像' then ;
     begin
        MyStream := TMemoryStream.Create;
      try
        MyJpg:=Tjpegimage.Create;
        Mybmp := TBitmap.Create;
        GetScreen(mybmp);     //--获取 mybmp 图像
        Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
        Myjpg.CompressionQuality := 50; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
        MyStream.Clear;
        Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
        Myjpg.free;
        MyStream.Position := 0
        Socket.SendStream(mystream);
      finally
        MyBmp.free;
        mystream.Free;
      end;
     end;
    end;-----------------client------------------------
    procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      mystream:TMemorystream;
      myjpg:tjpegimage;
      iLen: Integer;
      Bfr: Pointer;
    begin
      iLen := Socket.ReceiveLength;
      GetMem(Bfr, iLen);
      MyStream.Position := 0;
      try
        Socket.ReceiveBuf(Bfr^, iLen);
        mystream.Write(Bfr^, iLen);
      finally
        FreeMem(Bfr);
      end;
      myjpg:=Tjpegimage.Create;
      myjpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
      image1.Picture.Assign(myjpg);    //--将收到的图像显示出来
      image1.Free;
      mystream.Free;
    end;
      

  3.   

    MyStream.Position := 0;
    myjpg.LoadFromStream(MyStream);
    image1.Picture.Assign(myjpg);    //--将收到的图像显示出来
      

  4.   

    还是不行, 加分再求助。Server端 用 mystream.SaveToFile('c:\temp\123.jpg');
    已能将流的内容正确保存为图片,但到 client 无法接收到正确的数据,怀凝是图片太大(100-200KB)那位能够给一段把流分段传送的代码。
      

  5.   

    看看我的代码,希望能对你有所帮助//--定义常量
    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;