Delph7中TcpClient和TcpServer用法分析

http://blog.csdn.net/quicmous/article/details/4263115

最近使用了Delphi7提供的TcpCLient和TcpServer两个VCL控件,发现这两个控件使用非常简单,不像网上不少帖子说的那样难用、性能差。

TcpClient和TcpServer没有采用事件驱动的模式,而是采取了同步方法调用的策略(网上有帖子称之为阻塞模式),大大简化了编写Sockets通讯程序的过程。如果我们还停留在事件驱动的思维习惯上,就会发现很难使用这两个控件。

Delphi7提供了一个名为NetChat的演示程序,该程序展示了TcpClient和TcpServer的初步用法。

一、 数据的发送与接收

//数据发送代码:
procedure TForm1.btnSendClick(Sender: TObject);
varI: Integer;
beginTcpClient1.RemoteHost := edtRemoteHost.Text; //服务器IPTcpClient1.RemotePort := edtRemotePort.Text; //服务器端口号tryif TcpClient1.Connect thenfor I := 0 to memSend.Lines.Count - 1 doTcpClient1.Sendln(memSend.Lines[I]);finallyTcpClient1.Disconnect;end;
end;//在OnAccept事件中接收数据(此处作了简化):
procedure TForm1.TcpServer1Accept(sender: TObject;ClientSocket: TCustomIpClient);
vars: string;
begins := ClientSocket.Receiveln;while s <> '' dobegin//此处对s做适当处理,代码略。s := ClientSocket.Receiveln;end;
end;

TcpServer在接收到数据后,只产生一个OnAccept事件。在OnAccept时间响应函数中,我们循环调用ClientSocket参数的Receiveln方法接受数据。让该方法返回空字符串时,意味着连接已经断开。

需要注意的是:
1.Receiveln方法在客户端没有传送数据时一直处于等待状态。
2.演示程序用s <> ''判断连接是否断开,下面我们可以看到其它判断方法。

二、 TcpServer的OnAccept事件中的参数ClientSocket

OnAccept事件响应函数带一个名为ClientSocket的参数,该参数是一个TCustomIpClient类型的对象。利用该参数可以方便我们访问客户端信息(客户端IP、端口等),并管理连接。

前面我们看到可以利用Receiveln返回空值的条件判断连接是否结束。如果希望实现超时断开连接功能的话,可以采用ClientSocket对象的WaitForData方法,等待数据。该方法允许指定等待时间,方法声明如下:

function WaitForData(TimeOut: Integer = 0): boolean;

可以调用ClientSocket的Disconnect方法在退出前断开连接。

三、 关于OnAccept多线程的问题

在同时收到多个客户端信息时,OnAccept应该在内存存在多个线程实例。因此,在OnAccept的代码,必须符合多线程设计原则。

Delphi的VCL库和其它一些组件是面向单线程设计的。这表明对VCL控件等组件的调用,必须通过TThread类的Synchronize方法调用。在NetChat这个演示程序中,提供了相应的代码供参考。更多资料请参考Delphi多线程编程的相关资料。

四、从服务器返回数据

如果需要从服务器返回数据的话,只需要在OnAccept中调用ClientSocket.Sendln方法即可。

客户端需要做的就是在执行完TcpClient1.Sendln后,直接调用 TcpClient1.Receiveln即可。该方法会等待服务器传回的信息。当然如果希望超时断开的话,也可以调用WaitForData方法,判断在给定时间内是否有数据返回。

四、 常见问题

问题:为什么TcpClient的OnReceive事件不响应服务器传回的数据?

原因很简单,OnReceive事件是由TcpClient的Receiveln等函数激发的,用于在Receiveln等函数接受到数据之前过滤数据用。

因此,如果你不调用TcpClient的Receiveln等函数,OnReceive事件就永远不会被激发。

posted on 2016-08-02 16:57 HiRong 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/zhrong/p/5729940.html

Delph7中TcpClient和TcpServer用法分析相关推荐

  1. python中的range_python中range()与xrange()用法分析

    本文实例讲述了python中range()与xrange()用法.分享给大家供大家参考,具体如下: 据说range比xrange开销要大,原因是range会直接生成一个list对象,而xrange每次 ...

  2. android include 控件详解,Android开发中include控件用法分析

    本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...

  3. php 类初始化 session判断,thinkphp3.x中session方法的用法分析

    本文实例讲述了thinkphp3.x中session方法的用法.分享给大家供大家参考,具体如下: 一.Session方法用于Session 设置.获取.删除和管理操作. Session 用于Sessi ...

  4. java appendto方法_jquery中append()与appendto()用法分析

    本文实例分析了jquery中append()与appendto()的用法.分享给大家供大家参考.具体分析如下: 在jQuery的文档操作方法中,append()和appentto()方法执行的任务相同 ...

  5. php unset session,PHP中session_unset()和session_destroy()用法分析

    关于session_unset()和session_destroy()的函数使用进行介绍. session_unset()释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文 ...

  6. mysql 性能分析 命令_MySQL中使用SHOW PROFILE命令分析性能的用法整理

    show profile是由Jeremy Cole捐献给MySQL社区版本的.默认的是关闭的,但是会话级别可以开启这个功能.开启它可以让MySQL收集在执行语句的时候所使用的资源.为了统计报表,把pr ...

  7. java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式

    在平时的项目开发中,应该会经常遇到上图所示的需求,就是在一个页面中有多个标签,被选中的标签颜色会高亮显示,切换不同标签显示相应的不同内容.如果内容代码过多则写在同一个html文件就会显得特别乱,所以这 ...

  8. php中msubstr,PHP学习:thinkphp中字符截取函数msubstr()用法分析

    <PHP学习:thinkphp中字符截取函数msubstr()用法分析>要点: 本文介绍了PHP学习:thinkphp中字符截取函数msubstr()用法分析,希望对您有用.如果有疑问,可 ...

  9. php simplexml 函数,PHP中SimpleXML函数用法分析

    本文实例讲述了关于php中SimpleXML 函数的用法,此函数是允许您把 XML 转换为对象,分享给大家供大家参考.具体分析如下: SimpleXML 函数允许您把 XML 转换为对象,通过普通的属 ...

最新文章

  1. 2021-2027年中国手机天线行业竞争格局分析及发展趋势预测报告
  2. 小程序:位置信息(Location)及微信小程序LBS解决方案实践
  3. (最终作业)面向对象先导课课程总结
  4. matlab等距线扫描多边形程序实现_常用的3D扫描仪都有哪些类型?
  5. No-5.变量的命名
  6. SVM入门(八)松弛变量
  7. 跨数据库调用存储过程权限问题
  8. JSP(五):属性范围
  9. Java 7:使用NIO.2进行文件过滤–第2部分
  10. VC++工程配置的大体流程 看图说话
  11. 安装oculus运行时出现问题_成品天沟在安装时会出现哪些问题?
  12. char数组转换成字符串_将字符串转换为char数组java –将字符串转换为char
  13. 【滤波器】基于matlab时变维纳滤波器设计【含Matlab源码 1870期】
  14. #pragma once 用法总结
  15. C++中的delete与delete[]
  16. PDF文件JAVA去水印源码,给pdf文件添加防伪水印logo(附工程源码下载)
  17. xz压缩解压工具的安装
  18. CP-VTON学习笔记
  19. 【Visio2003两根线重叠凸起如何让解决】
  20. 企业营销数字化转型:如何转型、如何选品、如何用好?

热门文章

  1. eja智能压力变送器工作原理_告诉你横河EJA变送器原理和故障分析!
  2. mmdetection-代码
  3. 改进地图搜索用户体验,还是完善
  4. Python 去英文标点
  5. 联想服务器如何设置uefi启动不了系统,联想uefi启动设置方法 联想电脑如何设置uefi启动...
  6. springboot获取classes目录
  7. 怎么申请免费的海外代理服务器
  8. 测量学(二)测量点坐标制图
  9. 详解JS中的原型与继承
  10. 有联机排名和屏幕反馈功能的游戏弓