一个客户端 用sendbuffer发送 一个服务器端接收 但总是报告 地址出错得不到正确的对象
解决方案 »
- 中国这么多牛人就不信搞不定这问题【Delphi中如何通过封装flash控件使背景透明和实现使用流播放(搞定就给分)】
- 如何Dbgrid选中行有色块??
- 请问如何在edit里面执行数学运算
- 兄弟们,帮我看看该过程有什么问题
- BDE问题!!!!!!!!!在线等
- 一个字符串转换问题
- 游戏汉化怎么做?——给点思路也好
- 如何毕业后能找到工作!!!>?>>?
- 如何用动态TQUERY动态生成TDECISION CUBE的字段及TDECISION GRAPH ???
- 请问:我需要用listview实现这种效果,有没有现存的vcl推荐几款,谢谢
- 坐标旋转的问题
- 下载!Borland Delphi 2005 设计师架构(Arichitect)版正式版!
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;