这是客户端接收流的代码:
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 事件?怎么回事。另外!求一个快速压缩流的算法。必须快才能满足我的要求,请各位帮帮忙。
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 事件?怎么回事。另外!求一个快速压缩流的算法。必须快才能满足我的要求,请各位帮帮忙。
解决方案 »
- delphi怎么和asp通用加解密呢?
- 关于 infoPowerstudio2011提示没有注册的问题
- 如何繁简体转换!
- 简单ADO问题,答了就的分
- 如何使用API实现串行通讯?
- 急急急!!客户端主从表关系的两个clientdataset,如果从表关联的主表记录在clientdataset提交之前被修改或删除了怎么办!
- 一个很菜的问题,知道的一定要告诉我,千万必笑我
- 关于在向固定格式的Word模版中导入数据的问题。(来者有分)
- 5.1放假了,走时再替我解决一个问题好了!
- 我在书上看到Access数据库在delphi中不支持中文字段名,那我该采用什么样的数据库格式呢???
- 如何在ravereport里显示 form中edit等控件的内容
- 出题:这两个结构的大小是多少?
FStreamSize := StrToInt(TmpStr); //接收服务端发过来的准备发送的流的大小
Socket.SendText(CMD_ReadySend); //给服务端发送已准备好的消息,以便服务端开发发送流
except end;这个异常except end;中中间没有处理,是一个隐患~~
也就是说,你的ClientSocketRead 事件中,第一次接收到长度,之后就会接收到指定长度的数据区;
接收完了,就存入BMP,显示图片文件;并清空缓冲区,设置FStreamSize回0;也就是说,FSecondStream.Size >= FStreamSize,这个条件,是不会出现>的情况,
而只有FSecondStream.Size == FStreamSize这种情况这面说的是理想的情况下.也就是说,你的通讯是一对一的通讯,你的客户端不会同时接收来自多个IP的数据;
从下面的网址中可下载全部的源程序,请帮忙调试调试。http://bbs.2ccc.com/attachments/2006/wgqsoft_2006102085843.rar其中 LibCompress、SpzLibrary 两个单元是照抄 DynamicSkinForm 组件包中的代码
>> Caption := FCntName+' 的屏幕';
>> ClientSocket.Host := FAdress;
>> ClientSocket.Port := StrToInt(FPort);
>> ClientSocket.Open;
在它的事件里,一直这样Open,怪怪的,不知道楼主是出于什么考虑?怕连接断开?
begin
FSecondStream := TMemoryStream.Create;;
GetScreen(FSecondStream);
FSecondStream.Position := 0;//加上这一句,楼主忘记把Stream的Position 复位
if FFirstStream.Size = 0 then
FFirstStream.LoadFromStream(FSecondStream)
else
CompareStream(FFirstStream, FSecondStream);
CompressStream(FSecondStream);
Size := FSecondStream.Size;
TmpStr := IntToStr(Size);
Socket.SendText(TmpStr);
end;这样就可以了
不过我怎么调着还是一样啊?还是 FSecondStream.Size >= FStreamSize 后继续执行 ServerSocketClientRead 事件!至于那个计时器,很惭愧,我本来是想计时开始时,马上执行 Timer.Enabled := False; 来着,结果忘了!
我是初学网络编程,后来听说 TServerSocket/TClientSocket 已经淘汰不用了,
所以又想用 TIdTCPServer/TIdTCPClient 来实现相同的功能,可是又受阻,就是我
开的另一个帖子,你也看了!唉!也没这方面的书籍!真是郁闷!
不是吧,你用的delphi是哪个版本呀,是没有没有打补丁呀,,我的开发环境,编译你的代码,没有问题的呀,图像已经正确传回来了
至于 TServerSocket/TClientSocket在一些简单的应用中,还是可以用的,简单直接~~~
另外如果将比较流和压缩流的代码去掉,运行一段时间后,只要托动一下客户端的窗体,图像传输就会停止!能重点调试一下我另一个帖子的问题吗!我现在准备放弃 TServerSocket/TClientSocket 了!