关于使用Indy中的IdUDPServer的一个问题(100)

  • 主题发起人 主题发起人 zhhg975
  • 开始时间 开始时间
Z

zhhg975

Unregistered / Unconfirmed
GUEST, unregistred user!
现在要使用IdUDPServer来监听端口获取数据,IdUDPServer有自带的方法可以自动监听某端口,如:procedure TUDPMainForm.IdUDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);end;这个是在一个Form中的控件直接形成的方法,如果我不使用控件,比如现在的页面不是一个Form,直接定义IdUDPServer1:TIdUDPServer ;这样如何让IdUDPServer1实现这个方法能够自动的监听,有数据时自动打开类似上述的方法获取数据呢,望高手不吝赐教!!
 
事件属性
 
就是不能拖一个IdUDPServer控件到Form上,而是直接使用IdUDPServer1:TIdUDPServer;这样的定义,怎么得到监听端口的数据
 
网站人好少啊,哪位大侠指点一下吧
 
没有人能指教一下吗?
 
写一个过程IdUDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);然后在创建这个控制时把这个过程和OnUdpRead相联
 
另外还要创建一下IdUDPServer1:=TIdUDPServer.create(nil)程序结束时或者使用完毕后释放IdUDPServer1.free;这和拖个控件没什么区别,只是拖个控件的话创建和释放的工作编辑器替你做了。
 
IdUDPServer1:=TIdUDPServer.create(nil)IdUDPServer1.onread:=IdUDPServerUDPRead...激活,就完了吧
 
哪位能给个详细点的源码,最好编译通过的写一个过程IdUDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); 这个直接这样定义就可以了?IdUDPServer1.onread:=IdUDPServerUDPRead...这个关联又该怎么做呢,并且IDUDPServer没有onread 只有onUDPRead
 
知道的来说说吧[:(]
 
unit uUDPCommunicate ;interfaceuses SysUtils, Classes, IdUDPClient, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, IdAntiFreezeBase, IdAntiFreeze, IdSocketHandle, Dialogs, Forms ;type //定义一个事件格式,要传参数的格式 后面必须要加上of object UDPRecDataEvent = procedure(RecData: String) of object;type TUDPCommunicate = class(TObject) procedure UDPServUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); private { Private declarations } FUDPRecDataEvent: UDPRecDataEvent ; UDPRecString : String ; UDPServ: TIdUDPServer; UDPClient: TIdUDPClient; AntiFreeze: TIdAntiFreeze; procedure InitComUDP ; function InitUDPServer(Active:boolean): boolean ; function InitUDPClient: boolean ; function ReceiveUDPData(AData: TStream; ABinding: TIdSocketHandle): Boolean; public { Public declarations } constructor Create; destructor Destroy; override; function UDPSendData(SendStr:String; Ip:String):boolean ; property OnUDPRecDataEvent: UDPRecDataEvent read FUDPRecDataEvent write FUDPRecDataEvent ; end;implementation{ TdRoomSynch }constructor TUDPCommunicate.Create;begin inherited; AntiFreeze := TIdAntiFreeze.Create(Application.MainForm) ; InitComUDP ; UDPRecString := '' ;end;destructor TUDPCommunicate.Destroy;begin UDPClient.Free ; UDPServ.Free ; AntiFreeze.Free ; inherited;end;function TUDPCommunicate.ReceiveUDPData(AData: TStream; ABinding: TIdSocketHandle): Boolean;var DataStringStream : TStringStream ;begin Result := False ; if Assigned(FUDPRecDataEvent) then begin UDPRecString := '' ; DataStringStream := TStringStream.Create('') ; DataStringStream.CopyFrom(AData, AData.Size) ; UDPRecString := DataStringStream.DataString ; FUDPRecDataEvent(UDPRecString) ; DataStringStream.Free ; Result := True ; end;end;procedure TUDPCommunicate.InitComUDP;begin InitUDPClient ; InitUDPServer(True) ;end;function TUDPCommunicate.InitUDPClient: boolean;begin UDPClient := TIdUDPClient.Create(Application.MainForm) ; Randomize; UDPClient.BroadcastEnabled := False ; UDPClient.Host := '127.0.0.1' ; UDPClient.Port := TUDPComPort ; UDPClient.BufferSize := TRmSynchBuffer ; UDPClient.ReceiveTimeout := TRmSynchTimeOut ;end;function TUDPCommunicate.InitUDPServer(Active: boolean): boolean;begin UDPServ := TIdUDPServer.Create(Application.MainForm) ; UDPServ.BroadcastEnabled := False ; UDPServ.DefaultPort := TUDPComPort ; UDPServ.BufferSize := TRmSynchBuffer ; UDPServ.OnUDPRead := UDPServUDPRead ; UDPServ.Active := Active ;end;function TUDPCommunicate.UDPSendData(SendStr:String; Ip:String): boolean;begin //发送end;procedure TUDPCommunicate.UDPServUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);begin ReceiveUDPData(AData, ABinding); //接收end;end.
 
多人接受答案了。
 
后退
顶部