关于用indy udp 控件传输图象 ( 积分: 100 )

  • 主题发起人 主题发起人 linuxwanone
  • 开始时间 开始时间
L

linuxwanone

Unregistered / Unconfirmed
GUEST, unregistred user!
每次传输完成,字节书一样,但是就是不能显示出来,请老大们指点一下
 
每次传输完成,字节书一样,但是就是不能显示出来,请老大们指点一下
 
错误消息一般是 JPEG ERROR #53 或者是 #52
 
JPEG ERROR #53是读入的文件不是jpeg格式(或内部格式已经错误)
你怎么传输的代码贴一下
 
procedure TMainForm.SendBim;
var
ReceivedString: String;
AMem, BMem: TMemoryStream;
p: Array[0..1023] of byte;
Posi, Len, i: Integer;
begin
i := 0;
AMem := TMemoryStream.Create;
try
BMem := TMemoryStream.Create;
try
FBmp.SaveToStream(BMem);
BMem.Position := 0;
ShowMessage(IntToStr(BMem.Size));
TCompressStream.CompressData(BMem, AMem);
ShowMessage(IntToStr(AMem.Size));
finally
FreeAndNil(BMem);
end;
AMem.Position := 0;
Posi := 0;
UDPClient.Send('Send File:File Length:'+IntToStr(AMem.Size));
ReceivedString := UDPClient.ReceiveString();
if UpperCase(ReceivedString) = 'RECIVED FILE LENGTH OK' then
begin
while Posi < AMem.Size do
begin
Inc(i);
Len := 1024;
if (AMem.Size - Posi) < 1024 then Len := AMem.Size-Posi;
AMem.ReadBuffer(p, Len);
UDPClient.SendBuffer(P, Len);
Inc(Posi, Len);
Gauge1.Progress := Round(Posi/AMem.Size*100);
ReceivedString := UDPClient.ReceiveString();
if UpperCase(ReceivedString) <> 'RECIVED FILE PACKAGE OK' then
Break;
Application.ProcessMessages;
end;
UDPClient.Send('Send File:File End!');
end else ShowMessage('Send file cancel!');
showmessage(inttostr(i));
finally
FreeAndNil(AMem);
end;
end;
 
此乃接收
procedure TServerForm.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
Var
Str: String;
j: Tjpegimage ;
AMem: TMemoryStream;
begin
AData.Seek(0, 0);
SetLength(Str, AData.Size);
AData.Read(Str[1], AData.Size);
if Pos('Send file:File Name:', Str)>0 then
begin
Delete(Str, 1, Length('Send file:File Name:'));
FileName := Str;
Str := 'Recived File Name OK';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
end else if Pos('Send File:File Length:',Str)>0 then
begin
Delete(Str, 1, Length('Send File:File Length:'));
FileSize := StrToIntDef(Str, 0);
Mem.Clear;
Mem.Position := 0;
Str:='Recived File Length OK';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
end else if Pos('Send File:File End',Str)>0 then
begin
if Mem<>nil then
begin
AMem := TMemoryStream.Create;
try
Mem.Position := 0;
ShowMessage(IntToStr(Mem.Size));
TCompressStream.DecompressData(Mem, AMem);
ShowMessage(IntToStr(AMem.Size));
AMem.Position := 0;
finally
FreeAndNil(AMem);
end;

Mem.Position := 0;
j := tjpegimage.Create;
try
J.LoadFromStream(Mem);
finally
Str:='Recived File OK';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
image1.Picture.Assign(j);
end;
end;
FileName:='';
FileSize:=0;
end else
begin
if Mem<>nil then
begin
// Mem.Seek(0, 2);
Mem.WriteBuffer(AData, AData.Size);
// Mem.Write(AData, AData.Size);
// AData.Seek(0, 0);
// Mem.CopyFrom(AData,AData.Size);
Gauge1.Progress:=Round(Mem.Size/FileSize*100);
Str:='Recived File Package OK';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
Application.ProcessMessages;
end;
end;
end;
 
你明明
代码:
TCompressStream.DecompressData(Mem, AMem);
了那为什么却是
代码:
J.LoadFromStream(Mem);
而不是
代码:
J.LoadFromStream(AMem);
 
不好意思,这个是我的笔误,改过来同样是这个错误,我在客户端直接LOAD一图片,客户端可以显示,但是到了服务器端以后就不行了。同样的错误发生。
 
你确定压缩和解压的过程没错么?把DecompressData和CompressData去掉试试?

另外,你单步跟一下,具体是在哪句上发生的错误?
 
把压缩去掉我也试过,都是在J.LoadFromStream(Mem);这儿出错。请帮我看看,谢谢
 
我在想会不会是传输,接收的时候。包的顺序不一样。
 
Indy有一个图片文件传输的例子
在ImageServer目录
 
TO:XIANGUO 谢谢你,但是我想做一个用UDP协议进行传输的。
 
你udp传那一定要自己控制好传输可靠性阿,包顺序、数据正确性以及是否丢包都要处理起来
你可以在发送端把AMem给SaveToFile,然后在接收端也把Mem给SaveToFile,然后拿UltraEdit比较一下两个文件是不是一致,估计是内部数据错了
不过,我在做jpeg通过stream进行传输的程序的时候发现,用stream的Read/ReadBuffer都会出问题,会把那个buf参数所指向的内存块弄丢,百思不得其解,后来我索性直接通过TMemoryStream的Memory属性直接用CopyMemory把其中的数据拷贝出来放到我的缓冲区里去,就没问题了。现在看来你是不是也是同样的问题哦,呵呵
 
先给分,试一试,不行在说
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部