Mirror

how to transfer an object over a socket (Views: 100)

Problem/Question/Abstract:

how to transfer an object over a socket

Answer:
In my project, I have to be able to transfer an object between clients and servers. I have tried to write some codes. Unluckily, there is always an exception "out of memory while expanding memory stream". I dont know why. Hope someone can help me. thanks. By the way, I use Indy to build connections.

unit Data;

interface

uses
Classes;

Type

TData = class(TComponent)
private
FStr : String;

public
constructor Create(AnOwner : TComponent); override;
destructor Destroy; override;

published
property Str : String read FStr write FStr;
end;

implementation

constructor TData.Create(AnOwner : TComponent);
begin
inherited Create(AnOwner);
FStr := 'It is created!!!';
end;

destructor TData.Destroy;
begin
inherited Destroy;
end;

end.

??????????????????????????????????????????????????????????????????????
implementation

{$R *.dfm}

uses
Data;

procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPServer1.Active := true;
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
Button1.Caption := 'a client';
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
FData : TData;
FStream : TMemoryStream;
begin
FData := TData.Create(nil);
FStream := TMemoryStream.Create;
AThread.Connection.ReadStream(FStream);
FStream.ReadComponent(FData); // Here the exception comes up!!!
Edit1.Text := FData.Str;
FStream.Free;
FData.Free;
end;

end.


????????????????????????????????????????????????????????????????????

implementation

uses Data;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.Connect();
Button1.Caption := 'OK';
end;

procedure TForm1.Button2Click(Sender: TObject);
var
FData : TData;
FStream : TMemoryStream;
begin
FData := TData.Create(nil);
FStream := TMemoryStream.Create;
FStream.WriteComponent(FData);
IdTCPClient1.WriteStream(FStream);
FStream.Free;
FData.Free;
end;

end.


<< Back to main page