一个简单的问题,高手来拿分。。。 ( 积分: 100 )

  • 主题发起人 主题发起人 wzwcn
  • 开始时间 开始时间
W

wzwcn

Unregistered / Unconfirmed
GUEST, unregistred user!
我用INDY的IdUDPServer和IdUDPClient发送图片。在客户端打开一张JPEG图,然后发给服务端,服务端接收并显示出来。我现在的问题是,服务端接到后显示不出来,好象格式不对,代码如下,请高手指点,谢谢:
客户端发送代码:
procedure TForm1.BitBtn2Click(Sender: TObject);
var mem:Tmemorystream;
buf:array[0..1023] of char;
len,posi:integer;
RecStr:string;
jpeg:Tjpegimage;
begin
mem:=Tmemorystream.Create;
jpeg:=Tjpegimage.Create;
jpeg.LoadFromFile(OpenDialog1.FileName);
jpeg.SaveToStream(mem);
//image1.Picture.Graphic.SaveToStream(mem);

posi:=0;
IdUDPClient1.Host:=edit1.Text;
IdUDPClient1.Port:=strtoint(edit2.text);
IdUDPClient1.Active:=true;
IdUDPClient1.Send('start');
RecStr:=IdUDPClient1.ReceiveString();
if RecStr='ok' then
begin
While Posi<Mem.Size do
begin
len:=1024;
if Mem.Size-Posi<1024 then
Len:=Mem.Size-Posi;
Mem.Read(buf,len);
IdUDPClient1.SendBuffer(buf,Len);
inc(posi,len);
RecStr:=IdUDPClient1.ReceiveString();
if RecSTr<>'ok' then
break;
Application.ProcessMessages;
end; //end while
IdUDPClient1.Send('end');
end;
mem.Free;
jpeg.Free;
end;

端务端接收代码:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var Str:string;
jpeg:Tjpegimage;
begin
AData.Seek(0,0);
SetLength(Str,AData.Size);
AData.Read(Str[1],AData.Size);

if Str='start' then
begin
mem:=Tmemorystream.Create;
str:='ok';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
end
else if Str='end' then
begin
jpeg:=Tjpegimage.Create;
jpeg.LoadFromStream(mem);
//showmessage(inttostr(mem.Size));
//jpeg.SaveToFile('e:/okok.jpg');
Image1.Picture.Assign(jpeg);
jpeg.Free;
mem.Free;
end
else
begin
Mem.Seek(0,2);
AData.Seek(0,0);
Mem.CopyFrom(AData,AData.Size);
str:='ok';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
Application.ProcessMessages;
end;
end;
 
我用INDY的IdUDPServer和IdUDPClient发送图片。在客户端打开一张JPEG图,然后发给服务端,服务端接收并显示出来。我现在的问题是,服务端接到后显示不出来,好象格式不对,代码如下,请高手指点,谢谢:
客户端发送代码:
procedure TForm1.BitBtn2Click(Sender: TObject);
var mem:Tmemorystream;
buf:array[0..1023] of char;
len,posi:integer;
RecStr:string;
jpeg:Tjpegimage;
begin
mem:=Tmemorystream.Create;
jpeg:=Tjpegimage.Create;
jpeg.LoadFromFile(OpenDialog1.FileName);
jpeg.SaveToStream(mem);
//image1.Picture.Graphic.SaveToStream(mem);

posi:=0;
IdUDPClient1.Host:=edit1.Text;
IdUDPClient1.Port:=strtoint(edit2.text);
IdUDPClient1.Active:=true;
IdUDPClient1.Send('start');
RecStr:=IdUDPClient1.ReceiveString();
if RecStr='ok' then
begin
While Posi<Mem.Size do
begin
len:=1024;
if Mem.Size-Posi<1024 then
Len:=Mem.Size-Posi;
Mem.Read(buf,len);
IdUDPClient1.SendBuffer(buf,Len);
inc(posi,len);
RecStr:=IdUDPClient1.ReceiveString();
if RecSTr<>'ok' then
break;
Application.ProcessMessages;
end; //end while
IdUDPClient1.Send('end');
end;
mem.Free;
jpeg.Free;
end;

端务端接收代码:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var Str:string;
jpeg:Tjpegimage;
begin
AData.Seek(0,0);
SetLength(Str,AData.Size);
AData.Read(Str[1],AData.Size);

if Str='start' then
begin
mem:=Tmemorystream.Create;
str:='ok';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
end
else if Str='end' then
begin
jpeg:=Tjpegimage.Create;
jpeg.LoadFromStream(mem);
//showmessage(inttostr(mem.Size));
//jpeg.SaveToFile('e:/okok.jpg');
Image1.Picture.Assign(jpeg);
jpeg.Free;
mem.Free;
end
else
begin
Mem.Seek(0,2);
AData.Seek(0,0);
Mem.CopyFrom(AData,AData.Size);
str:='ok';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
Application.ProcessMessages;
end;
end;
 
建议使用TIdTrivialFTPServer及IdTrivialFTPClient来做,很简单。
 
上面是接到流了,但我不知道怎么把流转成Jpeg显示出来。。。。
 
放一个图像控件,然后loadfromstream
 
>>但我不知道怎么把流转成Jpeg显示出来。。。。
把流里面的数据保存到一个IMAGE控件里面,用这个控件来显示!!!
 
TImage.Picture.LoadFromStream, 好像是,不知道在Picture后面需要不要griph什么什么的
 
TImage.Picture.griph.LoadFromStream这样也不行~~
我声明一个Tjpegimage,然后再从接到的流那里加载,然后再
Timage.picture.assign(Tjpegimage);
但还是不行~~
 
你先savetofile保存成文件看接受正常不?

如果正常的话就
image1.picture.gri*&amp;*.loadfromstream()
否则
网络传输部分有问题
 
我好像在说废话
之前只做过tcp传文件的udp没接触过
 
我savetofiles保存文件后文件的大小和原文件完全一样,但是就是打不开。
 
兄弟!不要着急!
www.51merit.com
上有socket 专区
While Posi<Mem.Size do
begin
这种拼死烂明的传不好!
end; //end while
end;
另外,你服务器也没有读出最后一帧!
其实你首先要保证客户端发送的a.jpg和服务器端接收到a.jpg 100%相同,你才能保证正确!
 
我savetofiles保存文件后文件的大小和原文件完全一样,但是就是打不开。

本身这里就不对,怎么可能100%相同,还大不开呢!你用photoshop能打开吗?
 
晕,刚才没说清楚,大小安全一样。但是就是打不开~~
 
问题解决了,真他妈的气人,就忘了加这么一句mem.posison:=0;就这么一句,害得我搞了半个下午,以后打死我都不会忘这句。。。。。。
 
呵呵,解决了就好!
 
多人接受答案了。
 
后退
顶部