2022年阻塞编程 .pdf
《2022年阻塞编程 .pdf》由会员分享,可在线阅读,更多相关《2022年阻塞编程 .pdf(5页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、使用 TServerSocket 构件提供多线程服务对于一个 socket 来说,很容易提供一个侦听消息的多线程服务。Delphi 自身也提供了这样的构件: TServerSocket 。不过这里边也需要一点小技巧。为此,我们要做以下几件事:- 将 TServerSocket 加入 main 窗体中- 设置 Servertype属性为 stThreadBlocking - 生成一个新单元(如下)来包含服务线程将下面的代码赋给OnGetThread事件响应函数 procedure TfrmMain.fSocketGetThread(Sender: TObject; ClientSocket: T
2、ServerClientWinSocket; var SocketThread: TServerClientThread); begin / 在每次一个新连接建立的时候为它生成一个新的TServerThread 对象。SocketThread := TServerThread.Create(FALSE, ClientSocket); end; 下面是我自己生成的TServerThread 对象代码 . 该对象从TServerClinetThread继承而来,包含从socket 读写数据的代码。 unit serverthread; interface uses windows, scktcom
3、p, SysUtils, Classes, Forms; type EServerThread = class(Exception); / TServerThread服务线程类是 TServerClientThread的派生类TServerThread = class(TServerClientThread) private fSocketStream: TWinSocketStream; public procedure ClientExecute; override; / ClientExecute过程将覆盖 TServerClientThread.ClientExecute过程/ 并包含
4、实际执行的代码于线程开始时。end; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - implementation procedure TServerThread.ClientExecute; begin inherited FreeOnTerminate := TRUE; try fSocketStream := TWinSocketStream.Create(ClientSocket, 100000); / 设置 10000
5、0毫秒的充许超时 . try while (not Terminated) and (ClientSocket.Connected) do try / 在此处加入你对输入、读、写的等待 / 下面的示范你可以拿来照搬在此 except on e: exception do begin / 一旦错误发生就关闭并退出 ClientSocket.Close; Terminate; end; end; finally fSocketStream.Free; end; except on e: exception do begin / 一旦错误发生就关闭并退出 ClientSocket.Close; Te
6、rminate; end; end; end; 一旦连接建立,线程需要等待数据到来 . 你可以使用下面的代码来等待数据: if (not Terminated) and (not fSocketStream.WaitForData(1000000) then begin / 超时处理end; / 数据到达 ! 为了读取数据,我们需要建立一个数据缓冲区存取到达的数据,可以使用PByteArray 或一个 char 型的数组 . 在此例中我设置了一个名为fRequest 的 char 型数组缓冲。此外我将其设为定长,其大小由 REQUESTSIZE常量决定 . var ac, readlen: i
7、nteger; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - begin FillChar(fRequest, REQUESTSIZE, 0); ac := 0; repeat readlen := fSocketStream.Read(fRequestac,1024); / 每次读取 1024 bytes 直到缓冲区满 ac := ac + readlen; until (readlen = 0) or (ac = REQU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年阻塞编程 2022 阻塞 编程
限制150内