我把一个bmp文件读入流中,通过流来传输出去,如何发送这些包?如果这个文件有600K,每次只发2048字节,要处理流吗?还是直接把一个流数据都发出去?接收方又如何处理?

解决方案 »

  1.   

    以下是CB代码,Delphi也差不多
    1.接收端
    //---------------------------------------------------------------------------#include <vcl.h>
    #pragma hdrstop#include "Unit1.h"
    #include <jpeg.hpp>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender)
    {
       ResultStream =new TMemoryStream();
       TempStream =new TMemoryStream();
       ResultStream->Size = 1024*768*3;
       TempStream->Size = 1024*768*3;
       ResultStream->Clear();
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
         delete ResultStream;
        delete TempStream;   
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::NMUDP1DataReceived(TComponent *Sender,
          int NumberBytes, AnsiString FromIP, int Port)
    {
        if(NumberBytes!=1)
         {
          TempStream->Clear();
          NMUDP1->ReadStream(TempStream);
          ResultStream->CopyFrom(TempStream,NumberBytes);
          Edit1->Text = IntToStr(ResultStream->Size)+ "字节";
          }
         else if (NumberBytes ==1)
          {
           try
              {
                ResultStream->Position = 0;
                TJPEGImage *jpeg=new TJPEGImage();
                jpeg->LoadFromStream(ResultStream);
                Graphics::TBitmap* bit = new Graphics::TBitmap();
                bit->Width = jpeg->Width;
                bit->Height = jpeg->Height;
                bit->Canvas->StretchDraw(Rect(0,0,bit->Width,bit->Height),jpeg);
                Image1->Picture->Graphic =bit;
                //ScrollBar1->Max=jpeg->Width;
                
                //Image1->Refresh();
                //Refresh();
                 //jpeg->SaveToFile("h:\rec_temp.jpg");
                delete jpeg;
                delete bit;
                }
              catch(...)
               {
                 ShowMessage("Error");
               }
               }}
    //---------------------------------------------------------------------------
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
        char Reqcode[29];
        AnsiString ReqCodeStr;
        ReqCodeStr = "Show"+ Edit2->Text;
        StrCopy(Reqcode,ReqCodeStr.c_str());
        ResultStream->Clear();
        TempStream->Clear();
        NMUDP1->RemoteHost =Edit2->Text;
        NMUDP1->SendBuffer(Reqcode,30,30);
    }
    //---------------------------------------------------------------------------
    2.截屏端
    //---------------------------------------------------------------------------#include <vcl.h>
    #pragma hdrstop#include "Unit1.h"
    #include <jpeg.hpp>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    Thehe *hehe;
    //---------------------------------------------------------------------------
    __fastcall Thehe::Thehe(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------void __fastcall Thehe::FormCreate(TObject *Sender)
    {
       BmpStream =new TMemoryStream();
       ResultStream =new TMemoryStream();
       TempStream = new TMemoryStream();
       ResultStream->Size =1024*768*3;
       
    }
    //---------------------------------------------------------------------------
     void __fastcall Cut_Screen(int LeftPos,int TopPos,int RightPos,int BottomPos)
      {
          int RectWidth, RectHeight;
          HDC SourceDC,DestDC,Bhandle;
          Graphics::TBitmap *Bitmap =new Graphics::TBitmap();
          RectWidth = RightPos-LeftPos;
          RectHeight = BottomPos-TopPos;      SourceDC = CreateDC("DISPLAY",NULL,NULL,NULL);
          DestDC = CreateCompatibleDC(SourceDC);
          Bhandle = CreateCompatibleBitmap(SourceDC,RectWidth,RectHeight);
          SelectObject(DestDC,Bhandle);
          BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,LeftPos,TopPos,SRCCOPY);
          Bitmap->Handle = Bhandle;
          hehe->BmpStream->Clear();
          Bitmap->SaveToStream(hehe->BmpStream);
          delete Bitmap;
          DeleteDC(DestDC);
          ReleaseDC(Bhandle,SourceDC);
           //保存
          hehe->BmpStream->SaveToFile("temp.bmp");
          //bmp->jmp
          Graphics::TBitmap* Bitmap1 = new Graphics::TBitmap();
          Bitmap1->LoadFromFile("temp.bmp");
          //Bitmap1->LoadFromStream(hehe->BmpStream);
          Graphics::TBitmap* tmpBitmap = new Graphics::TBitmap();
          tmpBitmap->Width = Bitmap1->Width;
          tmpBitmap->Height = Bitmap1->Height;
          tmpBitmap->Canvas->StretchDraw(TRect(0,0,tmpBitmap->Width,tmpBitmap->Height),Bitmap1);
          TJPEGImage *jpeg =new TJPEGImage();
          jpeg->PixelFormat = jf8Bit;
          jpeg->CompressionQuality =100;
          jpeg->Assign((TPersistent*) tmpBitmap);
          jpeg->Compress();      hehe->BmpStream->Clear();
          jpeg->SaveToStream(hehe->BmpStream);      //ShowMessage(hehe->BmpStream->Size);
          jpeg->SaveToFile("temp.jpg");
          delete tmpBitmap;
          delete jpeg;
          delete Bitmap1;
                
      }
    //---------------------------------------------------------------------------void __fastcall Thehe::NMUDP1DataReceived(TComponent *Sender,
          int NumberBytes, AnsiString FromIP, int Port)
    {
                Cut_Screen(0,0,Screen->Width,Screen->Height);
               // ShowMessage("已截图");
                const int ThreshHold =2048;
                
                BmpStream->Position =0;
                char* Buffer =new char[ThreshHold];
                int Buffersize = hehe->BmpStream->Size;            int Buffers = Buffersize/ThreshHold;
                //ShowMessage(Buffers);
                NMUDP1->RemoteHost = FromIP;
                Label1->Caption = "请求来源:"+FromIP;
                Label2->Caption = "已经发送:0字节";
                Refresh();
              //  Socket->SendBuf("s",1); //标志开始发送
                for(int i=0;i<=Buffers;i++)
                  {
                  // ShowMessage("已开始for");
                   if(Buffersize>=ThreshHold)
                     {
                      Sleep(1);
                      hehe->BmpStream->Read(Buffer,ThreshHold);
                      NMUDP1->SendBuffer(Buffer,ThreshHold,ThreshHold);
                     // ShowMessage(i);
                      }
                    else
                      {
                       if(Buffersize <=0)
                         break;
                       else
                         {
                         hehe->BmpStream->Read(Buffer,Buffersize);
                        NMUDP1->SendBuffer(Buffer,ThreshHold,ThreshHold);
                         }                   }
                     Buffersize-=ThreshHold;
                     Label2->Caption = "已发送:"+IntToStr(BmpStream->Size-Buffersize);
                    }
                 NMUDP1->SendBuffer("E",1,1);
                 delete Buffer;
    }
    //---------------------------------------------------------------------------
    void __fastcall Thehe::FormDestroy(TObject *Sender)
    {
           delete BmpStream;
        delete ResultStream;
        delete TempStream;
    }
    //---------------------------------------------------------------------------
      

  2.   

    delphi的源码我有,就是看人家屏幕的,要的话我可以发给你