有一个客户端和服务端,客户端有一个image控件和一个按钮,image控件里有一张图片,点击按钮后,将image中的图片以流的形式发送给服务端,服务端接收后利用image空间在服务端窗体上显示出来,请问该如何实现!我写的代码总是不停的报错!求救!!

解决方案 »

  1.   

    unit MySocketUnit;interfaceuses Windows, SysUtils, Classes, ScktComp, uMain;type
      TFileServerThread=class(TServerClientThread)
      public
        constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
        procedure   ClientExecute; override;
      end;
      
      TFileClientThread = class(TThread)
      private
        FStream: TMemoryStream;
        FClientSocket: TClientSocket;
      protected
        procedure   ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
      public
        constructor Create(Host: string; Port: Integer; CreateSuspended: Boolean; aStream: TMemoryStream);
        destructor  Destroy;override;
        procedure   Execute;override;
      end;  TFileInfo = record
        FileName: string[128];
        FileSize: Int64;
      end;implementation{ TFileServerThread }procedure TFileServerThread.ClientExecute;
    var
      Stream:TWinSocketStream;
      FI:TFileInfo;
      Buffer:PChar;
      ReadLen, TotalLen:Integer;
    begin
      GetMem(Buffer,4096);
      Stream := TWinSocketStream.Create(ClientSocket, 5000);
      try
        Stream.ReadBuffer(FI,SizeOf(FI));
        try
          TotalLen := 0;
          while TotalLen < FI.FileSize do
          begin
            ReadLen:=Stream.Read(Buffer^,4096);
            Form1.aStream.WriteBuffer(Buffer^,ReadLen);
            TotalLen := TotalLen + ReadLen;
          end;
        except
          on E:Exception do;
        end;
      finally
        Stream.Free;
        FreeMem(Buffer);
      end;
    end;constructor TFileServerThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
    begin
      inherited Create(CreateSuspended,ASocket);
    end;{ TFileClientThread }procedure TFileClientThread.ClientSocketError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      ErrorCode := 0;
    end;constructor TFileClientThread.Create(Host:String;Port:Integer;CreateSuspended: Boolean; aStream: TMemoryStream);
    begin
      FreeOnTerminate:=True;
      FStream := aStream;
      FClientSocket:=TClientSocket.Create(nil);
      FClientSocket.ClientType:=ctBlocking;
      FClientSocket.Host:=Host;
      FClientSocket.Port:=Port;
      FClientSocket.OnError:=ClientSocketError;
      inherited Create(CreateSuspended);
    end;destructor TFileClientThread.Destroy;
    begin
      FClientSocket.Free;
      inherited;
    end;procedure TFileClientThread.Execute;
    var
      Stream:TWinSocketStream;
      FI:TFileInfo;
    begin
      FClientSocket.Active:=True;
      if FClientSocket.Active then
      begin
        Stream  := TWinSocketStream.Create(FClientSocket.Socket, 5000);
        FI.FileSize := FStream.Size;
        try
          try
            Stream.WriteBuffer(FI,SizeOf(FI));
            Stream.CopyFrom(FStream, FStream.Size);
          except
            on E:Exception do;
          end;
        finally
          Stream.Free;
        end;
      end;
    end;end.
    主窗体上放两个Image,ImgClient里放JPG图片,代表客户端要传的图。
    ImgServer为空,点“发送后”,ImgServer里显示图片。代码如下:
    unit uMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp, StdCtrls, ExtCtrls, jpeg;type
      TForm1 = class(TForm)
        ServerSocket1: TServerSocket;
        Button1: TButton;
        Button2: TButton;
        ImgClient: TImage;
        ImgServer: TImage;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure ServerSocket1GetThread(Sender: TObject;
          ClientSocket: TServerClientWinSocket;
          var SocketThread: TServerClientThread);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
        aStream: TMemoryStream;
        procedure RecEnd(Sender: TObject);
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    uses MySocketUnit;procedure TForm1.Button1Click(Sender: TObject);
    var
      Stream: TMemoryStream;
    begin
      Stream := TMemoryStream.Create;
      ImgClient.Picture.Graphic.SaveToStream(Stream);
      Stream.Position := 0;
      with TFileClientThread.Create('127.0.0.1',9000,True, Stream) do
      begin
        OnTerminate:=RecEnd;
        Resume;
      end;end;procedure TForm1.ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    begin
      SocketThread := TFileServerThread.Create(False,ClientSocket);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      ServerSocket1.Close;
      Close;
    end;procedure TForm1.RecEnd(Sender: TObject);
    var
      pic: TJPEGImage;
    begin
      aStream.Position := 0;  pic := TJPEGImage.Create;
      pic.LoadFromStream(aStream);
      ImgServer.Picture.Assign(pic);
      ImgServer.Refresh;  pic.Free;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      aStream := TMemoryStream.Create;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      aStream.Free;
    end;end.
      

  2.   

    补充:主窗体上还要放一个TServerSocket控件。
    Active为True。Port为9000
    ServerType为stThreadBlocking。还有两个按钮: