delphi中TIdUDPServer是如何监听端口数据的

delphi中TIdUDPServer是如何监听端口数据的,第1张

TIdUDPServer控件

用来实现一个UDP服务器

所在单元

IdUDPServer

属性

property Bindings: TIdSocketHandles

用来收集f TIdSocketHandle实例。包含ID_SOCK_DGRAM类型的socket。

property DefaultPort: integer

监听新连接的端口。

property ThreadedEvent: boolean

指示UDP读事件的执行方式。是否以线程的形式执行

property Active: Boolean

是否开始监听。

property Binding: TIdSocketHandle

只读属性。指示读写传送的socket句柄。

property BroadcastEnabled: Boolean

是否广播传送数据

property BufferSize: Integer

UDP包的尺寸。

property ReceiveTimeout: Integer

从一个服务中读取数据的超时时间。

property LocalName: string

本地计算机名称。

property Version: string

只读属性,用来获取Indy部件的版本号码。

方法

procedure Broadcast(const AData: stringconst APort: integer)

在网络上发送数据到所有的计算机。

unction ReceiveBuffer(var ABufferconst ABufferSize: Integerconst AMSec: Integer =

IdTimeoutDefault): integeroverload

function ReceiveBuffer(var ABufferconst ABufferSize: Integervar VPeerIP: stringvar

VPeerPort: integerAMSec: Integer = IdTimeoutDefault): integeroverload

从远程连接中读取数据

function ReceiveString(const AMSec: Integer = IdTimeoutDefault): stringoverload

function ReceiveString(var VPeerIP: stringvar VPeerPort: integerconst AMSec: Integer =

IdTimeoutDefault): stringoverload

从远程连接中读取数据

procedure Send(AHost: stringconst APort: Integerconst AData: string)

向远程计算机系统发送数据。

procedure SendBuffer(AHost: stringconst APort: Integervar ABufferconst AByteCount:

integer)

向远程计算机系统发送数据

事件

property OnUDPRead: TUDPReadEvent

UDP读取事件发生时执行。

参数

ABinding

接受UDP数据报的socket。

AData

在UDP数据报中接受数据的流。

property OnStatus: TIdStatusEvent

指示当前连接状态的句柄。

参数

aaArgs

用来构造当前状态文本消息的格式化参数。

axStatus

当前连接状态。取值范围与TIdUDPClient类中的OnStatus事件相同。

procedure BeginWork(AWorkMode: TWorkModeconst ASize: Integer = 0)virtual

当OnBeginWork事件触发时执行

AWorkMode可以取的值:

wmRead--从远程连接中读取数据。

wmWrite-- 向远程连接发送数据。

procedure DoWork(AWorkMode: TWorkModeconst ACount: Integer)virtual

当OnWork事件触发时执行。

procedure EndWork(AWorkMode: TWorkMode)virtual

当OnEndWork事件触发时执行。

Delphi是Inprise(前Borland)公司的优秀的可视化编程工具 它自带的Mediaplayer控件是开发多媒体的利器 用它几分钟就可以做出一个象解霸一样可以播放多媒体文件的程序来 但可能很少人知道 用它也可以做一个录音程序

运行Delphi 在System页拖一个Mediaplayer控件到窗体上 默认名为Mediaplayer 由于我们的程序是采用自己的按钮 所以将Mediaplayer 的Visible属性设置为False 其它属性保持默认值 再放两个按钮Button 和Button Button 的属性Name改为BtStart Caption改为 开始录音 Button 的属性Name改为BtStop Caption改为 停止录音 Enabled属性改为False 然后切换窗口到代码窗口 开始书写代码

程序中 我们定义了一个Wav文件的文件头格式 录音时先创建一个只有文件头的Wav文件 然后将Mediaplayer 录制下来的声音写进文件 其中CreateWav过程的几个参数意义如下 第一个channels代表声道 取 时代表单声 取 时代表立体声 resolution也只有两个值可以选择 取 时代表 位声音 取 时代表 位声音 rate则代表声音频率 如 值越大则声音越清晰 当然 所录制的文件也越大 最后一个参数则代表对应的文件名称了 所以CreateWav可以有以下形式

CreateWav( C abc wav ) //在C盘根目录下创建一个 位单声道频率为 的名为abc wav的Wav文件

CreateWav( C abc wav ) //在C盘根目录下创建一个 位立体声道频率为 的名为abc wav的Wav文件

外国一个很出名的用Delphi编写的远程控制软件Netbus有一个声音监听功能 就是用本文的方法写的 它先把对方的声音录制下来 然后传送回来 达到监听对方的目的 当然 前提是对方必须安装有话筒 否则监听到的是对方播放的声音(如打开解霸或者Readplay播放 运行本程序 就可以把播放的声音录制下来了)

实际上 现在的网络声音传播技术已经发展到一定阶段 语音对讲和IP电话等也开始成熟 不过它们采用的是VOX格式或者ACM格式 具体代码可以在我的主页下载 但如果对VOX或者ACM格式不熟悉的朋友 也可以用本文的方法来制作自己的 录音机 至于如何调用系统自带的avifil dll来进行网络视频播放 在有机会时再跟大家交流吧

本程序在Pwin +Delphi 下通过

unit Unit interfaceusesWindows Messages SysUtils Classes Graphics Controls Forms Dialogs StdCtrls MPlayertypeavHeader = record //定义一个Wav文件头格式 rId : longint rLen : longint wId : longint fId : longint fLen : longint wFormatTag : word nChannels : word nSamplesPerSec : longint nAvgBytesPerSec : longint nBlockAlign : word wBitsPerSample : word dId : longint wSampleLength : longint endTForm = class(TForm)MediaPlayer : TMediaPlayerBtStart: TButtonBtStop: TButtonprocedure CreateWav(channels : wordresolution : wordrate : longintfn : string)//自定义写一个Wav文件头过程procedure BtStartClick(Sender: TObject)procedure BtStopClick(Sender: TObject)private{ Private declarations }public{ Public declarations }endvarForm : TForm implementation{$R * DFM}procedure TForm CreateWav( channels : word{ (单声)或者 (立体声) }resolution : word{ 或者 代表 位或 位声音 }rate : longint{ 声音频率 如 }fn : string { 对应的文件名称 } )varwf : file of avHeaderwh : avHeaderbeginwh rId := $  wh rLen :=  wh wId := $  wh fId := $ d  wh fLen :=  wh wFormatTag :=  wh nChannels := channels wh nSamplesPerSec := rate wh nAvgBytesPerSec := channels*rate*(resolution div )wh nBlockAlign := channels*(resolution div )wh wBitsPerSample := resolutionwh dId := $  wh wSampleLength :=  assignfile(wf fn){打开对应文件 } rewrite(wf){移动指针到文件头} write(wf wh){写进文件头 } closefile(wf){关闭文件 } endprocedure TForm BtStartClick(Sender: TObject)begintry//在程序当前目录下创建一个Wav文件Temp wavCreateWav( (ExtractFilePath(Application ExeName)+ Temp wav ))MediaPlayer DeviceType := dtAutoSelectMediaPlayer FileName := (ExtractFilePath(Application ExeName)+ Temp wav )MediaPlayer OpenMediaPlayer StartRecordingBtStart Enabled:=falseBtStop Enabled:=trueexceptBtStart Enabled:=TrueBtStop Enabled:=falseApplication MessageBox( 媒体设备初始化失败! 错误 MB_ICONERROR+MB_OK)endendprocedure TForm BtStopClick(Sender: TObject)begintryMediaPlayer StopMediaPlayer SaveMediaPlayer CloseApplication MessageBox( 声音录制完毕! 信息 MB_ICONINFORMATION+MB_OK)BtStart Enabled:=TrueBtStop Enabled:=falseexceptApplication MessageBox( 保存声音文件出错! 错误 MB_ICONERROR+MB_OK)BtStart Enabled:=TrueBtStop Enabled:=falseendendend

补充 录制的文件播放时可能要把音频属性的Wav调大

如果系统安装了其它一些音频驱动程序 则可能录制的Wav文件大小为零 但会同时生成一个TMP结尾的文件 将其扩展名改为Wav就是录制的声音文件 但这种情况很少发生 (机会几乎为零^ ^)

lishixinzhi/Article/program/Delphi/201311/24663


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11701719.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存