IdUDPServer有接收事件,IdUDPClient为何没有接收事件?它怎样接收数据呢?
解决方案 »
- 为什么我安装了oracle9i在odbc驱动程序中找不到Oracle Provider for OLE DB驱动?
- 运行时窗体设组件,功能和DELPHI的窗体设计器相同的组件,可让你的程序在运行时设计窗体
- 南京企业纳贤 --有意愿请跟帖,留下qq 或手机号码以便联系
- 数组是否可以定义成结构体
- 电脑美工已做好主页,他又该如何调用我用websnap写的密码输入框呢?
- 怎样修改文件的属性??
- 在Deplhi中,如何实现如PowerBuilder下拉式数据窗口的效果???
- 如何使form透明
- Numega BoundsChecker 集成
- 我买了一台SLE4442读写器, 为什么不能写
- 怎么用Delphi 7 读取SQL表格有多少行数据,把行数保存到一个变量里下面的能实现吗具体怎么做
- 谁能给个delphi备份sql数据库的实例啊
可能BCB2007中有,待明天上班看一看. IdUdPClient.ReceiveBuffer(),没有事件触发, 什么时候调用它呢,
难道不停地接收?
所以由 IdUDPServer Send 到 IdUDPClient 端 的Message, 沒有
event 来接收,需由类似下列的程式来接收,即 IdUDPClient Send
or Broadcast 后, 马上要由Repeat IdUDPClient1.ReceiveString();... Until 来处理
我觉得十分不便, 也不安全, 因 IdUDPClient 的 ReceiveTimeout
时间要设长一点, 否则当 IdUDPClient 是 Broadcast 后, IdUDPClient
自己來不及接收, 设太长时间, 效益又不好. 另外可以考虑调用IdUDPClient的ReceiveBuffer()方法
1。IdUDP支持多线程,除缓冲大外,这是它比NMUDP强的地方,
IdUDPClient正是为多线程支持的客户端;
2。IdUDPServer支持OnUDPRead事件,这是异步方式,如果
在客户端也要支持OnUDPRead,很简单:客户端也用IdUDPServer代替
IdUDPClient,UDP客/服是平等的,所以TNMUDP客/服干脆共用一个元
件;
就这样解决了!
1。我最近一直在研究UDP控件,结论:InDy的IdUDP比FastNet的NMUDP的功能要强多了,
所以 BCB2007取消了FastNet,前者略复杂一点点;
2。UDP会包的原因是:一方不停地发送,肯定会丢包;解决的办法:采用主/从访问,客户
端请求一次,服务端只发送一个包,如何没收到,再请求一次,这种方式就不会丢包;
如果客户端要求服务端发送一个文件过来,可这样:
客户端请求发送文件(送文件名) 服务端打开文件,返回包的个数
客户端请求文件的第一个包 服务端发送第一个包
。。
客户端请求文件的最后一个包 服务端发送最后一个包,并关闭文件
用这种主/从方式传递屏幕图像,就不会丢包;
1。我最近一直在研究UDP控件,结论:InDy的IdUDP比FastNet的NMUDP的功能要强多了,
所以 BCB2007取消了FastNet,前者略复杂一点点;
2。UDP丢包的原因是:一方不停地发送,肯定会丢包;解决的办法:采用主/从访问,客户
端请求一次,服务端只发送一个包,如果没收到,再请求一次,这种方式就不会丢包;
如果客户端要求服务端发送一个文件过来,可这样:
客户端请求发送文件(送文件名) 服务端打开文件,返回包的个数
客户端请求文件的第一个包 服务端发送第一个包
。。
客户端请求文件的最后一个包 服务端发送最后一个包,并关闭文件
用这种主/从方式传递屏幕图像,就不会丢包;
Timer.OnTimer := TimerTimer;
Timer.Interval := 9000; // 9 sec. 获取一次
Timer.Enabled := True;procedure TForm1.TimerTimer(Sender: TObject);
var
ReceivedString: String;
begin
ReceivedString := idUDPClient.ReceiveString(); if ReceivedString = '' then
memo1.Lines.Add('No response received from the server after ' + IntToStr(udpTimer.Interval) + ' millseconds.')
else
memo1.Lines.Add(ReceivedString);end;