为何 Socket 发送流后,接收端接收的大小与发送的大小不一致(接收的数据总是大于发送的数据)?(100分)

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

wanggongqin

Unregistered / Unconfirmed
GUEST, unregistred user!
这是客户端接收流的代码:
procedure TScreenfrm.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Buf: array[0..100000] of Byte;
Len: Integer;
Bmp: TBitmap;
TmpStr: string;
begin
if FStreamSize = 0 then
begin
TmpStr := Trim(Socket.ReceiveText);
if TmpStr = '' then Exit;
try
FStreamSize := StrToInt(TmpStr); //接收服务端发过来的准备发送的流的大小
Socket.SendText(CMD_ReadySend); //给服务端发送已准备好的消息,以便服务端开发发送流
except end;
end else
begin
Len := Socket.ReceiveLength;
Socket.ReceiveBuf(Buf, Len);
FSecondStream.Write(Buf, Len);
if FSecondStream.Size >= FStreamSize then
begin
try
FSecondStream.Position := 0;
Bmp := TBitmap.Create;
Bmp.LoadFromStream(FSecondStream);
ImgScreen.Picture.Bitmap.Assign(Bmp);
Bmp.Free;
finally
Socket.SendText(CMD_BeginCapScr); //连续抓屏
FSecondStream.Clear;
FStreamSize := 0;
end;
end;
end;
end;

当 FSecondStream.Size >= FStreamSize 时,并且服务端还没有发过来流大小的时候,
还会触发 ClientSocketRead 事件?怎么回事。

另外!求一个快速压缩流的算法。必须快才能满足我的要求,请各位帮帮忙。

全部源代码可从下面的网址下载:
http://bbs.2ccc.com/attachments/2006/wgqsoft_2006102085843.rar
其中 LibCompress、SpzLibrary 两个单元是照抄 DynamicSkinForm 组件包中的代码
 
顶上,学习~
 
我也看看。学习中。
不过windows 那个网络连接中的收收发送数据都不一样的。
不懂!
 
用delphi自带的压缩算法
 
自带的什么压缩算法!
 
zlib单元里面,你自己看看,是delphi自带的,可能是行程编码
 
自带的压缩还是太慢了!比我上面的程序中用到的压缩还慢!有没有更快的压缩算法!
我但压缩代码要求很简单,只要将流数据中的 '0' 压缩掉就行。
需要说明一下,我是先将后一张图片的流与前一张图片的流进行比较,如果同位置相同就用 '0' 代替,因此只要能将 '0' 压缩掉就行!
 
s1, s2 第一次,第二次的流, s3 输出的结果
procedure Comparestream(s1, s2, s3: TMemoryStream);
var
buf1, buf2, buf3: PByteArray;
i, j: Integer;
begin
buf1:= s1.Memory;
buf2:= s2.Memory;
buf3:= s3.Memory;

for i:= 0 to s1.Size - 1 do
buf3:= buf1 xor buf2; //相同就变成 0
end;

你现在那种方法绝对慢得很。
 
压缩可以选级别的,有快的
 
那个不是木马灰鸽子的代码?
 
后退
顶部