TStream问题,比较简单(20分)

  • 主题发起人 主题发起人 shangjintong
  • 开始时间 开始时间
S

shangjintong

Unregistered / Unconfirmed
GUEST, unregistred user!
请问高手用TClientSocket和TServerSocket如何配合使用进行TStream数据的收发,下面是我的源代码,但不可行,请您指正。(两者已经CONNNCET上)。

//发TStream
procedure TForm1.Button1Click(Sender: TObject);
var
dm:TMemoryStream;
begin
dm:=TMemoryStream.Create;
image1.Picture.Bitmap.SaveToStream(dm);
dm.Position:=0;
ClientSocket1.Socket.SendStream(dm);
dm.Free;
end;
//收TStream
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
dm:TMemoryStream;
begin
dm:=TMemoryStream.Create;
Socket.ReceiveBuf(dm,Socket.ReceiveLength);
image2.Picture.Bitmap.LoadFromStream(dm);
dm.Free;
end;
 
应该是此句错误:
Socket.ReceiveBuf(dm,Socket.ReceiveLength);

改为:
dm.setsize(Socket.ReceiveLength);
dmSocket.ReceiveBuf(dm,Socket.ReceiveLength);
即需要预先留出STREAM空间。
 
wint你好:
dm.setsize(Socket.ReceiveLength);
dmSocket.ReceiveBuf(dm,Socket.ReceiveLength);
是可以的只是
image2.Picture.Bitmap.LoadFromStream(dm);的执行为什么报错?而且是比较严重的错误。
我的本意是想通过TClientSocket和TServerSocket控件,将Client端的图片传到Server端,
并显示出来。
 
试一试:
dm.setsize(Socket.ReceiveLength);
dmSocket.ReceiveBuf((dm.Memory)^,Socket.ReceiveLength);
 
可能的原因:传输过程中有信息丢失。
你先把收到的STREAM保存进一个文件内,用图片工具看看能不能打开。

另外每个包的大小有限制,要传大文件,应该使用TCP连接,或者分成多个小包发送。
 
wint你好:
我用如下语句想存成文件,但在执行 dm.SaveToFile('shang.bmp');语句时报错,
好象与image2.Picture.Bitmap.LoadFromStream(dm);的错误相同
dm.SetSize(Socket.ReceiveLength);
Socket.ReceiveBuf(dm,Socket.ReceiveLength);
dm.SaveToFile('shang.bmp');
 
memorystream没有savetofile方法啊?!

跟踪调试一下收到的字节数。

调试技术 <font color='red'>必须</font> 掌握。
 
Tmemorystream有savetofile方法啊,我的程序编译通过了
 
能否给个传送图片的例子(不要用到DELPHI4。0上的控件)
若给,分数没问题
 
真SORRY,没仔细看就说没有SAVETOFILE。。。。

编译通过了?运行还是出错?
例子嘛,不好办,又大又难懂,我没怎么写注释。用的也不是TCLIENTSOCKET。
分数嘛,不重要啦。
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
514
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
782
import
I
后退
顶部