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事件就永远不会被激发。
转载于:https://www.cnblogs.com/zhrong/p/5729940.html
Delph7中TcpClient和TcpServer用法分析相关推荐
- python中的range_python中range()与xrange()用法分析
本文实例讲述了python中range()与xrange()用法.分享给大家供大家参考,具体如下: 据说range比xrange开销要大,原因是range会直接生成一个list对象,而xrange每次 ...
- android include 控件详解,Android开发中include控件用法分析
本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面 ...
- php 类初始化 session判断,thinkphp3.x中session方法的用法分析
本文实例讲述了thinkphp3.x中session方法的用法.分享给大家供大家参考,具体如下: 一.Session方法用于Session 设置.获取.删除和管理操作. Session 用于Sessi ...
- java appendto方法_jquery中append()与appendto()用法分析
本文实例分析了jquery中append()与appendto()的用法.分享给大家供大家参考.具体分析如下: 在jQuery的文档操作方法中,append()和appentto()方法执行的任务相同 ...
- php unset session,PHP中session_unset()和session_destroy()用法分析
关于session_unset()和session_destroy()的函数使用进行介绍. session_unset()释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文 ...
- mysql 性能分析 命令_MySQL中使用SHOW PROFILE命令分析性能的用法整理
show profile是由Jeremy Cole捐献给MySQL社区版本的.默认的是关闭的,但是会话级别可以开启这个功能.开启它可以让MySQL收集在执行语句的时候所使用的资源.为了统计报表,把pr ...
- java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式
在平时的项目开发中,应该会经常遇到上图所示的需求,就是在一个页面中有多个标签,被选中的标签颜色会高亮显示,切换不同标签显示相应的不同内容.如果内容代码过多则写在同一个html文件就会显得特别乱,所以这 ...
- php中msubstr,PHP学习:thinkphp中字符截取函数msubstr()用法分析
<PHP学习:thinkphp中字符截取函数msubstr()用法分析>要点: 本文介绍了PHP学习:thinkphp中字符截取函数msubstr()用法分析,希望对您有用.如果有疑问,可 ...
- php simplexml 函数,PHP中SimpleXML函数用法分析
本文实例讲述了关于php中SimpleXML 函数的用法,此函数是允许您把 XML 转换为对象,分享给大家供大家参考.具体分析如下: SimpleXML 函数允许您把 XML 转换为对象,通过普通的属 ...
最新文章
- 2021-2027年中国手机天线行业竞争格局分析及发展趋势预测报告
- 小程序:位置信息(Location)及微信小程序LBS解决方案实践
- (最终作业)面向对象先导课课程总结
- matlab等距线扫描多边形程序实现_常用的3D扫描仪都有哪些类型?
- No-5.变量的命名
- SVM入门(八)松弛变量
- 跨数据库调用存储过程权限问题
- JSP(五):属性范围
- Java 7:使用NIO.2进行文件过滤–第2部分
- VC++工程配置的大体流程 看图说话
- 安装oculus运行时出现问题_成品天沟在安装时会出现哪些问题?
- char数组转换成字符串_将字符串转换为char数组java –将字符串转换为char
- 【滤波器】基于matlab时变维纳滤波器设计【含Matlab源码 1870期】
- #pragma once 用法总结
- C++中的delete与delete[]
- PDF文件JAVA去水印源码,给pdf文件添加防伪水印logo(附工程源码下载)
- xz压缩解压工具的安装
- CP-VTON学习笔记
- 【Visio2003两根线重叠凸起如何让解决】
- 企业营销数字化转型:如何转型、如何选品、如何用好?