Z
zjrivaldo
Unregistered / Unconfirmed
GUEST, unregistred user!
我是用的winsocket进行的图像数据传输,直接在clientsocket组件的读取事件里进行的连续抓屏.但是这个程序在win2000(win98里好像没有问题)里抓屏时客户端经常出现'jpeg error#52'或'jpeg error#67'或者就是乱码信息尤其是有其它窗口在显图像窗口上移动时或改变显示图像窗口大小时更会出现这种情况.这时候显示的图像就是花的.下面是我的这段程序:
客户端程序:
var
mysize:longint;
mystream:tmemorystream;
procedure Tform1.formCreate(Sender: TObject);
begin
MyStream := TMemorystream.Create; {建立内存流对象}
MySize := 0; {初始化}
end;
procedure Tform1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
MyReceviceLength: integer;
S: string;
MyBmp: TBitmap;
MyJpg: TJpegimage;
begin
form2.Caption:= '屏幕监视——正在接收数据......';
if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}
begin
S := Socket.ReceiveText;
MySize := Strtoint(S); {设置需接收的字节数}
Clientsocket1.Socket.SendText('ready'); {发指令通知服务端开始发送图象}
end
else
begin {以下为图象数据接收部分}
MyReceviceLength := socket.ReceiveLength; {读出包长度}
form2.Caption:= '屏幕监视——正在接收数据,数据大小为:' + inttostr(MySize);
Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}
MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中}
if MyStream.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕}
begin
MyStream.Position := 0;
MyBmp:=tbitmap.Create;
MyJpg:=tjpegimage.Create;
try
MyJpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
MyBmp.Assign(MyJpg); {将JPG转为BMP}
form2.Caption:= '屏幕监视——正在显示图像';
form2.Image1.Picture.Bitmap.Assign(nil);
form2.Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }
finally {以下为清除工作 }
MyBmp.free;
MyJpg.free;
Socket.SendText('screen');{添加此句即可连续抓屏 }
MyStream.Clear;
MySize := 0;
end;
end;
end;
end;
客户端程序:
var
mysize:longint;
mystream:tmemorystream;
procedure Tform1.formCreate(Sender: TObject);
begin
MyStream := TMemorystream.Create; {建立内存流对象}
MySize := 0; {初始化}
end;
procedure Tform1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
MyReceviceLength: integer;
S: string;
MyBmp: TBitmap;
MyJpg: TJpegimage;
begin
form2.Caption:= '屏幕监视——正在接收数据......';
if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}
begin
S := Socket.ReceiveText;
MySize := Strtoint(S); {设置需接收的字节数}
Clientsocket1.Socket.SendText('ready'); {发指令通知服务端开始发送图象}
end
else
begin {以下为图象数据接收部分}
MyReceviceLength := socket.ReceiveLength; {读出包长度}
form2.Caption:= '屏幕监视——正在接收数据,数据大小为:' + inttostr(MySize);
Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}
MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中}
if MyStream.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕}
begin
MyStream.Position := 0;
MyBmp:=tbitmap.Create;
MyJpg:=tjpegimage.Create;
try
MyJpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
MyBmp.Assign(MyJpg); {将JPG转为BMP}
form2.Caption:= '屏幕监视——正在显示图像';
form2.Image1.Picture.Bitmap.Assign(nil);
form2.Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }
finally {以下为清除工作 }
MyBmp.free;
MyJpg.free;
Socket.SendText('screen');{添加此句即可连续抓屏 }
MyStream.Clear;
MySize := 0;
end;
end;
end;
end;