客户端: procedure TClient.CUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); var CtrlCode:array[0..29] of char; Buf:array[0..BufSize-1] of char; TmpStr:string; SendSize,LeftPos,TopPos,RightPos,BottomPos:integer; begin CUDP.ReadBuffer(CtrlCode,NumberBytes);{ 读取控制码 } if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then begin { 控制码前4位为“show"表示主控机发出了抓屏指令 } if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 } begin TmpStr:=StrPas(CtrlCode); TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4); LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1)); TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr)); TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1)); TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr)); RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1)); BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr))); ScreenCap(LeftPos,TopPos,RightPos,BottomPos); {截取屏幕 } end; if LeftSize>BufSize then SendSize:=BufSize else SendSize:=LeftSize; BmpStream.ReadBuffer(Buf,SendSize); LeftSize:=LeftSize-SendSize; if LeftSize=0 then BmpStream.Clear;{ 清空流 } CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 } CUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的2100口 } end; end;服务器端: procedure TServer.SUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); var ReqCode:array[0..29] of char; begin SUDP.ReadStream(TmpStream); RsltStream.CopyFrom(TmpStream,NumberBytes); if NumberBytes < BufSize then { 数据已读完 } begin RsltStream.Position:=0; Image1.Picture.Bitmap.LoadFromStream(RsltStream); TmpStream.Clear; RsltStream.Clear; sleep(2); BmpFinish:=True; end else begin TmpStream.Clear; StrpCopy(ReqCode,'show'); SUDP.SendBuffer(ReqCode,30); BmpFinish:=False; end; end;
我也发一个: //客户端: //使用timer不断的发送图片内容interval设置为3000 procedure TForm1.Timer1Timer(Sender: TObject); var Buf:array[0..BufSize-1] of char; sendsize : Integer; begin //使用jpegStream1.Size来控制截取屏幕snapscreen, if jpegStream1.Size=0 then snapscreen; While LeftSize >0 do begin if LeftSize > BufSize Then sendsize:=BufSize else sendsize:=LeftSize; jpegStream1.ReadBuffer(buf,sendsize); LeftSize := LeftSize - sendsize; if LeftSize <= 0 then jpegStream1.Clear; //客户端的图片发送,一帧一帧的发送,一帧的大小由 BufSize控制 self.IdUDPClient1.SendBuffer(buf,sendsize); end; end;//服务器端: procedure Tcontrolform.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); begin if AData.Size > 0 then begin RsltStream.CopyFrom(AData,AData.Size); if AData.Size < bufSize then begin RsltStream.Position:=0; // j:=TJpegImage.Create; j.LoadFromStream(RsltStream); // Image1.Picture.Bitmap.LoadFromStream(RsltStream); image1.Picture.Assign(j); // j.Free; RsltStream.Clear; end; end; end;
procedure TClient.CUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
CtrlCode:array[0..29] of char;
Buf:array[0..BufSize-1] of char;
TmpStr:string;
SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;
begin
CUDP.ReadBuffer(CtrlCode,NumberBytes);{ 读取控制码 }
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then
begin { 控制码前4位为“show"表示主控机发出了抓屏指令 }
if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 }
begin
TmpStr:=StrPas(CtrlCode);
TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);
LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr));
TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr));
RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr)));
ScreenCap(LeftPos,TopPos,RightPos,BottomPos); {截取屏幕 }
end;
if LeftSize>BufSize then SendSize:=BufSize else SendSize:=LeftSize;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
if LeftSize=0 then BmpStream.Clear;{ 清空流 }
CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }
CUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的2100口 }
end;
end;服务器端:
procedure TServer.SUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var ReqCode:array[0..29] of char;
begin
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
if NumberBytes < BufSize then { 数据已读完 }
begin
RsltStream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(RsltStream);
TmpStream.Clear;
RsltStream.Clear;
sleep(2);
BmpFinish:=True;
end
else
begin
TmpStream.Clear;
StrpCopy(ReqCode,'show');
SUDP.SendBuffer(ReqCode,30);
BmpFinish:=False;
end;
end;
//客户端:
//使用timer不断的发送图片内容interval设置为3000
procedure TForm1.Timer1Timer(Sender: TObject);
var
Buf:array[0..BufSize-1] of char;
sendsize : Integer;
begin
//使用jpegStream1.Size来控制截取屏幕snapscreen,
if jpegStream1.Size=0 then snapscreen;
While LeftSize >0 do begin
if LeftSize > BufSize Then
sendsize:=BufSize
else
sendsize:=LeftSize;
jpegStream1.ReadBuffer(buf,sendsize);
LeftSize := LeftSize - sendsize;
if LeftSize <= 0 then jpegStream1.Clear;
//客户端的图片发送,一帧一帧的发送,一帧的大小由 BufSize控制
self.IdUDPClient1.SendBuffer(buf,sendsize);
end;
end;//服务器端:
procedure Tcontrolform.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
if AData.Size > 0 then
begin
RsltStream.CopyFrom(AData,AData.Size);
if AData.Size < bufSize then
begin
RsltStream.Position:=0;
// j:=TJpegImage.Create;
j.LoadFromStream(RsltStream);
// Image1.Picture.Bitmap.LoadFromStream(RsltStream);
image1.Picture.Assign(j);
// j.Free;
RsltStream.Clear;
end;
end;
end;