系列文章目录链接:
- windows 服务程序和桌面程序集成(一)概念介绍
- windows 服务程序和桌面程序集成(二)服务程序
- windows 服务程序和桌面程序集成(三)UDP监控工具
- windows 服务程序和桌面程序集成(四)桌面程序
- windows 服务程序和桌面程序集成(五)集成为一个EXE
- windows 服务程序和桌面程序集成(六)集成安装、启动、卸载功能
- windows 服务程序和桌面程序集成(七)效果演示及源程序下载
在开发windows服务程序和桌面程序中,经常需要UDP监控工具来获取程序运行状态,特别是对于windows服务程序或者是线程,没有界面,很难感知实时运行效果,这样开发一个简单的通用UDP监控工具,就可以监测到windows服务程序或者线程的事实运行状态,如果把UDP消息保存成文件,也就是一种监测日志了。
程序很简单,就是使用Indy的TidUDPServer控件,来实现UDP消息的监听接收。可以指定监听的端口,默认是8192。
提醒:
如果这里的端口号更改了,那么windows服务中使用的发送UDP消息的客户端端口号也需要修改,需要修改成和这里一样的端口号!
使用的时候打开UDP服务即可,关闭UDP服务就停止监测了。
程序的uMainForm_UDP.pas单元代码如下:
unit uMainForm_UDP;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdUDPServer, IdGlobal, IdSocketHandle,IdBaseComponent, IdComponent, IdUDPBase, Vcl.StdCtrls, Vcl.ExtCtrls,Vcl.Samples.Spin;typeTForm_UDP_Server = class(TForm)IdUDPServer: TIdUDPServer;Memo1: TMemo;Panel1: TPanel;Button1: TButton;Button2: TButton;Button3: TButton;SpinEdit1: TSpinEdit;Label1: TLabel;procedure IdUDPServerUDPRead(AThread: TIdUDPListenerThread;const AData: TIdBytes; ABinding: TIdSocketHandle);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm_UDP_Server: TForm_UDP_Server;implementation{$R *.dfm}procedure TForm_UDP_Server.Button1Click(Sender: TObject);
beginIdUDPServer.Active := False; //首先关闭IdUDPServer.DefaultPort := SpinEdit1.Value;tryIdUDPServer.Active := True;Memo1.Lines.Add('UDP 服务打开成功,端口号: ' + IdUDPServer.DefaultPort.ToString);except on E: Exception dobeginMemo1.Lines.Add(E.Message);end;end;
end;procedure TForm_UDP_Server.Button2Click(Sender: TObject);
beginIdUDPServer.Active := False; //关闭Memo1.Lines.Add('UDP 服务已经关闭!');
end;procedure TForm_UDP_Server.Button3Click(Sender: TObject);
beginMemo1.Clear;
end;procedure TForm_UDP_Server.IdUDPServerUDPRead(AThread: TIdUDPListenerThread;const AData: TIdBytes; ABinding: TIdSocketHandle);
vardata : string;
begin//接收到数据,界面//处理接收到的数据data := ABinding.PeerIP + ':' + ABinding.PeerPort.ToString + ' ' + TEncoding.UTF8.GetString(TBytes(AData));Memo1.Lines.Add(data);
end;end.
下一篇:windows 服务程序和桌面程序集成(四)桌面程序