版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 11 网络编程网络编程 11.1 VCL Forms Application中中Internet编程编程 Indy是完全基于Socket阻塞工作模式的开发库,阻塞模式有以下优点: (1)编程简单。所有代码能以有序的形式存在于同一位置,顺序执行,而不用分散在不同的事件处理代码段里。 (2)移植容易。由于Unix采用blocking套接字,所以用blocking套接字的程序更易于移植到Unix平台。 (3)易在多线程程序里使用。由于blocking套接字是串行的,所有很容易在线程中使用。阻塞模式的代码放在一起,可以方便地把这些代码封装在线程里面使用。 11.1.1 Indy组件包简介组件包简介
2、Delphi 2006的Indy组件包主要有5个部分,分别为: (1)Indy Clients:Indy Clients页面提供许多支持常见的Internet协议的客户端组件。这些组件简单易用,即使服务是多线程,也允许按顺序提交事务。这样可以很方便地用它们来开发各种客户端软件。 (2)Indy Servers:Indy Servers页面提供了许多常见的Internet协议的服务器端组件。利用这些组件可以简捷、灵活的开发多线程且功能强大的服务器端软件。 (3)Indy Intercepts:Indy Intercepts页面中的组件多用来对将要发送和已经接收的数据进行二次处理,入压缩解压、加密
3、解压、日志记录等。11.1 VCL Forms Application中中Internet编程编程 (4)Indy I/O Handlers:Indy I/O Handlers页面中的组件是进行数据输入输出的相关操作的。 (5)Indy Misc:Indy Misc页面中的组件提供了一些辅助功能,诸如对邮件的编码解码、查询网络状态。 所有Indy组件都以Id为前缀。这套网络组件不但功能强大,而且使用起来非常简单、方便,表11.1表11.5给出了这5部分组件的概括。表表11.1 Indy Clients主要组件说明主要组件说明组件名称组件名称描描 述述IdTCPClient封装了TCP客户端的所
4、有功能,包括套接字支持,用于编写TCP客户端软件或派生其他类。IdEcho将Echo协议中的内容封装成为TidEcho数据。IdFinger在客户端实现了应用Finger协议的功能。IdGopher在客户端实现了应用Gopher协议的功能。IdUDPClient封装了UDP客户端的所有功能,包括套接字支持,用于编写UDP客户端软件或派生其他类。IdFTP实现FTP协议,可用于编写FTP客户端软件。11.1 VCL Forms Application中中Internet编程编程IdHTTP支持HTTP协议1.0及1.1版本的客户端,可编写浏览器。IdIcmpClient发送ICMP包探测主机信息
5、。IdIRC实现IRC(Internet Relay Client)协议,用于编写即时通信类客户端软件。IdPOP3实现POP3协议,用于编写邮件接收客户端软件。IdTime在客户端实现了应用Time协议的功能。IdWhois在客户端实现了应用Whois协议的功能。IdSMTP实现SMTP协议,用于编写邮件发送客户端软件。11.1 VCL Forms Application中中Internet编程编程表表11.2 Indy Servers主要组件说明主要组件说明组件名称组件名称描描 述述IdTCPServer封装了全套TCP服务器端的功能,包括socket支持。可以直接应用到服务器端或用于制作
6、组件时作为基类。IdUDPServer封装了完整的多线程UDP服务。IdEchoServer 将Echo协议中的内容封装成为服务器端应用的TIdEchoServer数据类型。IdFingerServer在服务器端实现了应用Finger协议的功能。IdGopherServer在服务器端实现了应用了Gropher协议的功能。IdFTP实现FTP协议,用于编写FTP服务器端软件。IdHTTP支持HTTP协议1.0及1.1版本的服务器端,可编写浏览器。IdPOP3Server实现POP3协议,用于编写邮件接收服务器端软件。IdTimeServer在服务器端实现了应用Time协议的功能。IdWhoisS
7、erver在服务器端实现了应用Whois协议的功能。IdSMTPServer实现SMTP协议,用于编写邮件发送服务器端软件。11.1 VCL Forms Application中中Internet编程编程表表11.3 IndyIntercepts主要组件说明主要组件说明组件名称组件名称描描 述述IdConnectionIntercept用于制定一种socket处理架构来处理状态变化和数据传输任务。IdLogEvent基于事件的类,记录数据输入输出和状态的日志。表表11.4 Indy I/O Handlers主要组件说明主要组件说明组件名称组件名称描描 述述IdIOHandlerStrack应用
8、栈实现的输入输出控制。表表11.5 Indy Misc主要组件说明主要组件说明组件名称组件名称描描 述述IdCookieManager在Indy客户端实现了对Cookie的管理。IdEncoderMime用于对二进制数据进行Mime标准编码,而转化为文本文件。IdEncoderUUE用于对二进制数据进行UUE标准编码,而转化为文本文件。IdEncoderXXE用于对二进制数据进行XXE标准编码,而转化为文本文件。IdEncoderQuotedPrintable用于对二进制数据进行可显示打印字符编码,而转化为文本文件。IdMessage基于各种消息协议,封装了完整Internet消息。11.1
9、VCL Forms Application中中Internet编程编程11.1.2 E-Mail客户端程序开发客户端程序开发 在TCP/IP协议组中,有关电子邮件的协议主要有: (1)SMTP(Simple Mail Transfer Protocol)。SMTP即简单邮件传输协议,它着重底层邮件交付系统如何将邮件从一台机器传输到另一台机器。SMTP并没有规定如何从用户接收邮件,或者用户接口如何将收到的邮件交给用户。SMTP非常直观和简单,客户和服务器之间的通信完全是通过可读的ASCII文本组成。 (2)POP3(Post Office Protocol)。POP3即邮局协议,版本为3,它规定
10、了如何把邮件从邮件服务器上传送到本地计算机中。 (3)IMAP4(Internet Message Acsess Protocol)。Internet邮件访问协议版本4,简称为IMAP4,是POP3的一种代替协议。IMAP4和POP3使用同样的模式,但是前者与后者不同的是,前者允许用户动态创建、删除和重命名邮箱。 (4)MIME(Multipuerpose Internet Mail Extension)。为了通过电子邮件发送非ASCII数据,IEFT定义了多用途Internet邮件扩展MIME。MIME并没有改动SMTP或者POP3,而是允许用ASCII码对任意数据进行编码,然后在标准电子邮
11、件中传输。11.1 VCL Forms Application中中Internet编程编程 1. IdSMTP和和IdPOP3组件组件 IdPOP3组件是Borland从Nevrona公司引进的,用于从支持POP3协议的服务器,包括运行UNIX的主机检索电子邮件。POP组件支持身份验证登录,能够检索到用户信箱信息,如信箱中有几封邮件等。IdPOP3组件还能够直接在服务器上删除邮件。下面将简单介绍IdPOP3组件的主要属性和函数,如表11.6和表11.7所示。表表11.6 IdPOP3主要属性主要属性属属 性性描描 述述BoundIP指定客户端IPBoundPort指定本地连接的首选端口Host
12、远程主机名Password登录密码Port服务器端口ReadTimeout读取超时Username登录用户名11.1 VCL Forms Application中中Internet编程编程表表11.7 IdPOP3主要属性主要属性属属 性性描描 述述CheckMessages获取服务器上邮箱里的邮件数Connect打开客户端连接Create(AOwner:TComponent)创建连接实例Delete(const MsgNum:Integer)向服务器发出删除信息Disconnect关闭与服务器的连接GetResponse(const AAllowedResponses:array of Sm
13、allInt提供POP3协议需求的响应编码KeepAlive防止连接超时Retrieve(const MsgNum:Integer;AMsg:TIdMessage)取回邮件编号RetrieveHeader(const MsgNum:Integer;AMsg:TIdMessage)取回邮件头部RetrieveMailBoxSize获取服务器上邮箱的容量RetrieveRaw(const aMsgNo:Integer;const Dest TStrings)不经MIME解码取回邮件头和邮件正文UIDL(const ADest:TStrings;const AMsgNum:Integer=-1)取回
14、邮箱中邮件的ID列表11.1 VCL Forms Application中中Internet编程编程 IdPOP3组件的事件往往是与调用某个方法相关联的,如果事件被触发,通常表示调用成功,可以处理事件的句柄中得到POP服务器的返回信息。表11.8 列出IdPOP3的主要事件。表表11.8 IdPOP3的主要事件的主要事件事事 件件描描 述述OnConnected连接成功OnDisconnected断开连接OnStatus本组件的状态发生变化OnWork读取或写入缓冲区OnWorkBegin开始读取或写入缓冲区OnWorkEnd停止读取或写入缓冲区11.1 VCL Forms Applicati
15、on中中Internet编程编程 以上简单介绍了IdPOP3组件,它主要用于接收邮件。下面介绍的IdSMTP组件,它主要用于从SMTP服务器上发送邮件。表11.9、表11.10和表11.11简单介绍了IdSMTP组件的主要属性、函数和事件。表表11.9 IdSMTP的主要属性的主要属性属属 性性描描 述述AuthTypeSMTP的验证类型BoundIP指定客户端IPBoundPort指定本地连接的首选端口HeloName区分服务器上的客户端连接Host远程主机名MailAgent邮件代理Password登录密码Port服务器端口号ReadTimeout读取超时UseEhlo客户端向服务器请求的
16、验证类型Username登录用户名11.1 VCL Forms Application中中Internet编程编程表表11.10 IdSMTP的主要函数的主要函数函函 数数描描 述述Assign(Source:TPersistent)复制属性值到当前实例Authenticate在服务器上进行验证Connect打开服务器连接Create(AOwner:TComponent)创建连接实例Destroy销毁连接实例Disconnect关闭与服务器的连接Expand(AUserName:String;AResults:TStrings)决定邮件列表或邮箱别名的组成员QuickSend(self:cla
17、ss of TIdSMTP;const AHost:String;const:ASubject:String;const ATo:String;const AFrom:String;const AText:String)不通过Indy邮件实例发送邮件Send(AMsg:TIdMessage)向服务器发送Indy邮件Verify(AUserName:String)验证别名是否为服务器用户11.1 VCL Forms Application中中Internet编程编程表表11.11 IdSMTP的主要事件的主要事件事事 件件描描 述述OnConnected连接成功OnDisconnected断开连
18、接OnStatus本组件的状态发生变化OnWork读取或写入缓冲区OnWorkBegin开始读取或写入缓冲区OnWorkEnd停止读取或写入缓冲区 2. IdMessage组件组件 IdMessage组件完整封装了互联网消息体,即通常所说的电子邮件。在用IdPOP3接收邮件和IdSMTP发送邮件时,邮件是存放在IdMessage实体里进行传输的。IdMessage组件的主要属性和函数如表11.12、表11.13。11.1 VCL Forms Application中中Internet编程编程表表11.12 IdMessage的主要属性的主要属性属属 性性描描 述述AttachmentEncod
19、ing待发送邮件的默认编码机制BccList抄送列表Body邮件的正文文本CCList收件人列表CharSet邮件的字符集ContentDiposition邮件的介绍及存储的参数ContentTransferEncodingMIME编码方式ContentTypeMIME类型Date发送时间Encoding邮件的编码算法ExtraHeaders邮件的附加头部Flags描述邮箱的标志From邮件的原作者Headers邮件头部的取值IsEncoded邮件是否采用MIME编码11.1 VCL Forms Application中中Internet编程编程MessageParts邮件的各部分列表MIME
20、BoundaryMIME的边界记号MsgId邮件描述性标识符NewGroups接收该邮件的新闻组NoDecode收到的邮件是否不解码NoEncode发出的邮件是否不编码Organization邮件作者所属组织Priority邮件的优先级ReceiptRecipient收件人地址Recipients收件人References回复内容ReplyTo回复地址Sender发送人Subject邮件主题UID邮件标识符UseNowForDate使用当前时间作为邮件发送时间11.1 VCL Forms Application中中Internet编程编程表表11.13 IdMessage的主要函数的主要函数函
21、函 数数描描 述述AddHeader(const Value:string)添加邮件的头部Clear清空邮件实体ClearBody清空邮件体ClearHeader清空邮件头部Create构造实体Destroy销毁实体GenerateHeader创建邮件头部列表LoadFromFile(const AFileName:string;const AHeadersOnly:Boolean=False)从文件载入邮件LoadFromStream(AStream:TStream;const AHeadersOnly:Boolean=False)从输入流载入邮件ProcessHeaders刷新邮件头部信息
22、SaveToFile(const AFileName:String;const AHeadersOnly:Boolean=False)保存邮件到文件SaveToStream(const AFileName:String;const AHeadersOnly:Boolean=False)保存邮件到输出流11.1 VCL Forms Application中中Internet编程编程 【例例11.1】利用IdPOP3和IdSMTP组件实现E-Mail收发程序。此程序一共包括3个窗体,主窗体FormMain用于接收和显示邮件并管理其他窗体;FormNewMail用于写新邮件并发送;FormConfi
23、g用于用户信息设置。 (1)选择FileNewVCL Forms Application,创建一个VCL应用程序。 (2)在主窗体上放置一个IdPOP3组件来完成接收邮件的功能,一个IdMessage组件存储邮件内容,一个保存对话框来保存附件,一个ListView组件显示收到的邮件,一个Memo组件显示邮件的正文,一个ListView组件显示附件文件列表,同时窗体下方放置了一个TStatusBar组件用以显示各种显示,如图11.1所示。 主菜单设计如图11.2所示。图图11.1主窗体界面主窗体界面 图图11.2主菜单主菜单11.1 VCL Forms Application中中Internet
24、编程编程主窗体和组件的主要属性如表11.14所示。 表表11.14主窗体主要组件的属性主窗体主要组件的属性组件类型组件类型组件名组件名属性名属性名设置值设置值窗体(Form)FormMainCaption我的邮件TListViewlvMailAlignalTopCheckboxesTrueColumns0.CaptionColumns1.Caption主题Columns2.Caption发送人Columns3.Caption发送时间Columns4.Caption大小ViewStylevsReportTmemomemoMailAlignalClientScrollBarsssVerticalT
25、ListViewLvAttachAlignalRightColumns0.CaptionColumns1.Caption附件11.1 VCL Forms Application中中Internet编程编程 (3)添加一个新窗体,命名为FormNewMail。在这个窗体上主要放置了1个IdSMTP组件用来完成发送邮件的功能;1个Memo组件用来写邮件正文;4个Edit组件用来输入邮件信头信息。该窗体的设计界面如图11.3所示。图图11.3窗体窗体FormNewMail设计界面设计界面11.1 VCL Forms Application中中Internet编程编程窗体FormNewMail上的组件
26、的主要属性设置如表11.15所示。 表表11.15 FormNewMail中主要组件的属性中主要组件的属性组件类型组件类型组件名组件名属性名属性名设置值设置值窗体(Form)FormNewMailCaption写新邮件面板(Panel)Panel1AlignalTop文本框(Edit)edtToAdderssTextedtCarbonCopyTextedtSubjectText组合框(Combobox)cmbAttachText文本框(Memo)memoNewMailAlignalClient命令按钮(Button)btnSendCaption发送btnAttachCaption附件11.1
27、VCL Forms Application中中Internet编程编程(4)新增一个窗体,命名为FormConfig,用来设置信息,其设计界面如图11.4所示。图图11.4设计窗体设计窗体FormConfig11.1 VCL Forms Application中中Internet编程编程窗体FormConfig上的主要组件的属性设置如表11.16所示。 表表11.16窗体窗体FormConfig主要组件的属性设置主要组件的属性设置组件类型组件类型组件名组件名属性名属性名设置值设置值窗体(Form)FormConfigCaption设置文本框(Edit)edtPOP3TextEdtSMTPTex
28、tedtUserTextedtNameTextedtReplyToTextedtPwTextPasswordChar*复选按钮(CheckBox)CheckBox1Caption收信后在服务器上删除邮件位图按钮(BitBtn) btnOkKindbkOk11.1 VCL Forms Application中中Internet编程编程(5)编写代码。菜单项“文件|接收邮件”的OnClick事件中的代码:procedure TFormMain.N2Click(Sender: TObject);var Index: Integer; MailSum: LongWord; MailItem: TLis
29、tItem;begin FormConfig.ShowModal; lvEMail.Items.Clear; if IdPOP31.Connected then IdPOP31.Connect else begin IdPOP31.Host := FormConfig.edtPOP3.Text; IdPOP31.Port := strtoint(FormConfig.edtPOP3Port.Text); IdPOP31.Username := FormConfig.edtUser.Text; IdPOP31.Password := FormConfig.edtPw.Text; IdPOP31.
30、ReadTimeout := 20000; IdPOP31.Connect;11.1 VCL Forms Application中中Internet编程编程 MailSum := IdPOP31.CheckMessages; /获取邮件数 if MailSum 0 then StatusBar1.SimpleText := 共有 + IntToStr(MailSum) + 封邮件 else showmessage(没有邮件); for Index := 1 to MailSum do begin IdMessage1.Clear; IdPOP31.RetrieveHeader(Index,Id
31、Message1); /获取邮件头部信息 MailItem := lvEMail.Items.Add; MailItem.SubItems.Add(IdMessage1.Subject); MailItem.SubItems.Add(IdMessage1.From.Text); MailItem.SubItems.Add(FormatDateTime(yyyy-mm-dd hh:mm:ss,IdMessage1.Date); MailItem.SubItems.Add(IntToStr(IdPOP31.RetrieveMsgSize(Index) div 1024) + K); IdMessa
32、ge1.Clear; IdPOP31.Retrieve(Index,IdMessage1); /获取邮件 IdMessage1.MessageParts.CountParts; /获取邮件的分部计数 if IdMessage1.MessageParts.AttachmentCount 0 then MailItem.ImageIndex := 5 /有附件11.1 VCL Forms Application中中Internet编程编程 else MailItem.ImageIndex := 4; end; end;end;lvMail的OnClick事件中的代码:procedure TForm
33、Main.lvEmailClick(Sender: TObject);var Index: integer; AttachItem: TListItem;begin MemoMail.Lines.Clear; lvAttach.Items.Clear; IdMessage1.Clear; IdMessage1.ContentType := multipart/*; /邮件类型 StatusBar1.SimpleText := 开始接收; IdPOP31.Retrieve(lvEMail.ItemIndex + 1,IdMessage1); StatusBar1.SimpleText := 接收
34、完毕; memoMail.Lines := IdMessage1.Body; /邮件正文 for Index := 0 to Pred(IdMessage1.MessageParts.Count) do11.1 VCL Forms Application中中Internet编程编程 begin if IdMessage1.MessageParts.ItemsIndex is TIdAttachment then begin /附件 AttachItem := lvAttach.Items.Add; AttachItem.Caption := IntToStr(Index); AttachIte
35、m.SubItems.Add(TIdAttachment(IdMessage1.MessageParts.ItemsIndex).FileName); end else if IdMessage1.MessageParts.ItemsIndex is TIdText then begin MemoMail.Lines.Clear; MemoMail.Lines.AddStrings(TIdText(IdMessage1.MessageParts.ItemsIndex).Body); end; end;end;对于邮件中的附件应该另外保存,当双击附件时调用公用保存对话框来实现这一功能。LvAtt
36、ach的OnDbClick事件中的代码为:procedure TFormMain.lvAttachClick(Sender: TObject);var Index: Integer;11.1 VCL Forms Application中中Internet编程编程begin Index := StrToInt(lvAttach.ItemFocused.Caption); /这里暗藏了序号 if SaveDialog1.Execute then TIdAttachment(IdMessage1.MessageParts.ItemsIndex).SaveToFile(SaveDialog1.File
37、Name);end; 在菜单项“文件|删除邮件”将在邮件服务器上删除组件lvMail中被用户选中的邮件,OnClick事件中的代码如下:procedure TFormMain.N3Click(Sender: TObject);var i: Integer;begin for i := 0 to lvEMail.Items.Count - 1 do if lvEmail.Items.Itemi.Checked then IdPOP31.Delete(i + 1);end; 在菜单项“文件|断开连接”的OnClick事件中的代码:procedure TFormMain.N4Click(Sender
38、: TObject);begin IdPOP31.Disconnect;11.1 VCL Forms Application中中Internet编程编程 lvEmail.Items.Clear; memoMail.Lines.Clear; lvAttach.Items.Clear; end; 以上是邮件接收功能的代码,邮件发送的代码则在FormNewMail中实现。为了显示此窗体,在窗体的菜单项“文件|写新邮件”的OnClick事件中添加如下代码:procedure TFormMain.N5Click(Sender: TObject);begin FormConfig.ShowModal; F
39、ormNewMail.Show;end;FormNewMail窗体的btnAttach的OnClick事件中的代码:procedure TFormNewMail. btnAttachClick(Sender: TObject);begin if OpenDialog1.Execute then cmbAttach.Items.Add(OpenDialog1.FileName);end;FormNewMail窗体的btnSend的OnClick事件中的代码 11.1 VCL Forms Application中中Internet编程编程procedure TFormNewMail. btnSen
40、dClick(Sender: TObject);var i: Integer;begin if not IdSMTP1.Connected then begin /if FormConfig.AuthType.Checked then /IdSMTP1.AuthType IdSMTP1.Host := FormConfig.edtSMTP.Text; IdSMTP1.Port := StrToInt(FormConfig.edtSMTPPort.Text); IdSMTP1.Username := FormConfig.edtUser.Text; IdSMTP1.Password := For
41、mConfig.edtPw.Text; IdSMTP1.Connect; end; StatusBar1.SimpleText := 已和服务器建立连接; with IdMessage1 do begin From.Address := FormConfig.edtReplyTo.Text; /发件人地址 From.Name := FormConfig.edtName.Text;11.1 VCL Forms Application中中Internet编程编程 Recipients.EMailAddresses := edtToAddress.Text; /收件人地址 CCList.EMailA
42、ddresses := edtCArbonCopy.Text; ReplyTo.EMailAddresses := FormConfig.edtReplyTo.Text; Subject := edtSubject.Text; /邮件主题 CharSet := GB2312_CHARSET; ContentType := multipart/*; TIdText.Create(MessageParts,MemoNewMail.Lines); /邮件正文 end; for i := 1 to cmbAttach.Items.Count do TIdAttachmentFile.Create (I
43、dMessage1.MessageParts,cmbAttach.Items.Stringsi-1); /发送邮件 try IdSMTP1.Send(IdMessage1); finally IdSMTP1.Disconnect; end;end;11.1 VCL Forms Application中中Internet编程编程(6)编译链接后,其运行结果如图11.5、图11.6和图11.7所示。 图图11.5 接收邮件界面接收邮件界面 图图11.6设置接收和发送服务器设置接收和发送服务器图图11.7编辑、发送新邮件编辑、发送新邮件11.1 VCL Forms Application中中Inte
44、rnet编程编程 11.1.3 HTTP协议的处理协议的处理 HTTP数据包包括了标题和内容两部分。本小节通过一个示例,简单说明IdHTTP组件的使用方法。 【例例11.2】当用户输入正确的URL地址时,程序利用IdHTTP组件来解析出HTTP数据包中的各部分内容。 (1)选择FileNewVCL Forms Application,新建一个VCL工程。在窗体上依次放上如图11.8所示的组件。图图11.8窗体设计界面窗体设计界面11.1 VCL Forms Application中中Internet编程编程各组件的主要属性如表11.17所示。表表11.17 各组件的主要属性各组件的主要属性组件
45、类型组件类型组件名组件名属性名属性名设置值设置值窗体(Form)FormMainCaptionHTTP协议示例组合框(comboBox) cmbURLTextcmbProtocolItem1.01.1TextcmbMethodItemHeadGetText文本编辑框(Memo) Memo1Lines命令按钮(Button)BtnGetCaption获取btnStopCaption停止标签(Label)Label1CaptionURLLabel2Caption协议版本Label3Caption方法选择IdHTTPIdHTTP1属性均为默认值11.1 VCL Forms Application中中
46、Internet编程编程(2)编程代码。主窗体的OnCreate事件中的代码:procedure TFormMain.FormCreate(Sender: TObject);begin progressbar1.Parent := StatusBar1; ProgressBar1.Top := 2; ProgressBar1.Left := 1;end;主窗体的OnClose事件中的代码:procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);begin button2.OnClick(nil); try
47、 cmbURL.Items.SaveToFile(ExtractFilePath(ParamStr(0)+log.dat); except end;end;11.1 VCL Forms Application中中Internet编程编程主窗体的OnActivate事件中的代码:procedure TFormMain.FormActivate(Sender: TObject);begin button2.Enabled := false; cmbMethod.ItemIndex := 1; cmbProtocol.ItemIndex := 0; cmbProtocol.OnChange(nil)
48、; bPostFile := False; if FileExists(ExtractFilePath(ParamStr(0)+log.dat) then cmbURL.Items.LoadFromFile(ExtractFilePath(ParamStr(0)+log.dat);end;组件cmbProtocol的OnChange事件中的代码:procedure TFormMain.cmbProtocolChange(Sender: TObject);begin case cmbProtocol.ItemIndex of 0: IdHTTP1.ProtocolVersion := pv1_0
49、; 1: IdHTTP1.ProtocolVersion := pv1_1; end;end;11.1 VCL Forms Application中中Internet编程编程组件cmbURL的OnChange事件中的代码:procedure TFormMain.cmbURLChange(Sender: TObject);begin btnGet.Enabled := Length(cmbURL.Text) 0;end;组件btnStop的OnClick事件中的代码:procedure TFormMain. btnStop Click(Sender: TObject);begin IdHTTP1
50、.Disconnect; btnStop.Enabled := False; Screen.Cursor := crDefault;end;组件btnGet的OnClick事件中的代码:procedure TFormMain.btnGetClick(Sender: TObject);var Source: TMemoryStream; Response: TStringStream;begin11.1 VCL Forms Application中中Internet编程编程if cmbURL.Items.IndexOf(cmbURL.Text) = -1 then cmbURL.Items.Ad
51、d(cmbURL.Text); Screen.Cursor := crHourGlass; btnStop.Enabled := True; btnGet.Enabled := False; try memo1.Clear; case cmbMethod.ItemIndex of 0: begin IdHTTP1.Head(cmbURL.Text); memo1.Lines.Add(Content- Type:+IdHTTP1.Response.ContentType); memo1.Lines.Add(Date:+DateToStr(IdHTTP1.Response.Date); end;
52、1: begin memo1.Lines.Text := IdHTTP1.Get(cmbURL.Text); end; end;11.1 VCL Forms Application中中Internet编程编程finally Screen.Cursor := crDefault; btnStop.Enabled := False; btnGet.Enabled := True; end;end;组件IdHTTP1的OnStatus事件中的代码:procedure TFormMain.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
53、 const AStatusText: string);begin statusBar1.Panels1.Text := AStatusText;end;组件IdHTTP1的OnWork事件中的代码:procedure TFormMain.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);begin if ProgressBar1.Max 0 then begin StatusBar1.Panels1.Text := IntToStr(AWorkCount) + 字节共 11.1 VCL Forms
54、 Application中中Internet编程编程+ IntToStr(ProgressBar1.Max)+字节。; ProgressBar1.Position := AWorkCount; end else StatusBar1.Panels1.Text := IntToStr(AWorkCount) + 字节。;end;组件IdHTTP1的OnWorkBegin事件中的代码:procedure TFormMain.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer);begin P
55、rogressBar1.Position := 0; ProgressBar1.Max := AWorkCountMax; if AWorkCountMax 0 then StatusBar1.Panels1.Text := 已传送: + IntToStr(AWorkCountMax);end;组件IdHTTP1的OnWorkEnd事件中的代码:procedure TFormMain.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);begin StatusBar1.Panels1.Text := 完成; ProgressBar1.P
56、osition := 0;end;11.1 VCL Forms Application中中Internet编程编程(3)编译运行程序,运行结果如图11.9所示。图图11.9 HTTP示例运行结果示例运行结果11.2 Windows Forms Application中中Internet编程编程 11.2.1 在在. NET中开发邮件发送工具中开发邮件发送工具(1)单击ComponentInstalled .NET Components.,弹出Installed .NET Components对话框,如图11.10所示。图图11.10 Installed .NET Components对话框对话
57、框11.2 Windows Forms Application中中Internet编程编程 (2)在图11.10所示的图中,选择Microsoft MAPI Session Control和Microsoft MAPI Messages Control,单击“OK”按钮即可完成该组件地添加。 【例例11.3】利用Microsoft MAPI Control组件实现发送邮件。 (1)选择FileNewWindows Forms Application,新建一个WinForm工程。在窗体上依次放上如图11.11所示的组件。图图11.11发送邮件的设计界面发送邮件的设计界面11.2 Windows
58、Forms Application中中Internet编程编程(2)各组件的名称及属性如表11.18所示。表表11.18 各组件的主要属性各组件的主要属性组件类型组件类型组件名组件名属性名属性名设置值设置值窗体(Form)TwinFormText利用MAPI发送邮件标签(Label)Label1Text收信人姓名Label2Text收信人地址Label3Text主题Label4Text信息Label5Text附件文本框(TextBox)txtNameTexttxtAdderssTexttxtSubjectTexttxtMessageTexttxtAttachmentText命令按钮(Butto
59、n)btnSendText发送btnAttachmentText附件Microsoft MAPI ControlAxMAPISession1默认设置AxMAPIMessages1默认设置对话框(OpenFileDialog)OpenFileDialog1默认设置11.2 Windows Forms Application中中Internet编程编程(3)编写代码。下面为应用程序添加代码来完善各功能。btnSend组件的Click事件中的代码:procedure TWinForm.btnSend_Click(sender: System.Object; e: System.EventArgs);
60、begin AxMAPISession1.SignOn; /开始MAPI会话/当MAPI会话建立后,Session所产生的Hadle会存于SessionID属性中 if AxMAPISession1.SessionID 0 then begin/建立MAPIMessages与MAPISession间有效的关联 AxMAPIMessages1.SessionID := AxMAPISession1.SessionID; AxMAPIMessages1.Compose; /建立新的E-mail消息 AxMAPIMessages1.RecipDisplayName := txtName.Text;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年国际化工产品进出口贸易合同
- 2024年口腔医疗广告宣传合作协议
- 2024年工程款代付协议样本下载
- 2024年小学基础设施建设平整合同
- 2024年学校锅炉操作合同样本
- 2024年工程转包方标准合同
- 小学语文经典美文留一点岁月的痕迹
- 2025届高考物理一轮复习专题突破练习11电磁感应中动力学动量和能量问题含解析新人教版
- 2025届高考化学一轮复习高考必考大题专练一化工流程分析题B组-非金属类含解析
- 2024年在线课程经营权转让合同
- 提升员工营销能力的企业教育培训
- 学院(部)国际交流与合作工作考核指标体系与评分标准
- 国际贸易法与跨境业务合规的风险管理与应对策略
- 大学生社团对大学生的影响的社会调查报告
- 麻醉科临床诊疗指南2020版
- 供应商QSA-QPA评鉴表
- 餐券模板完整
- 英语48个国际音标课件(单词带声、附有声国际音标图)
- (完整文本版)货物验收单
- 广东省深圳市2023一2024学年三年级上学期科学期中核心素养提升试卷
- 分子的空间结构(第二课时)杂化轨道理论教学设计高二下学期化学人教版(2019)选择性必修2
评论
0/150
提交评论