每年至少学习一种新语言。不同语言以不同方式解决相同的问题。通过学习若干不同的方法,可以帮助你拓宽你的思维,并避免墨守成规。此外,现在学习许多语言已容易了许多,感谢可从网上自由获取的软件财富(参见267页)。
l 每季度阅读一本技术书籍。书店里摆满了许多书籍,讨论与你当前的项目有关的有趣话题。一旦你养成习惯,就一个月读一本书。在你掌握了你正在使用的技术之后,扩宽范围,阅读一些与你的项目无关的书籍。
l 也要阅读非技术书籍。记住计算机是由人——你在设法满足其需要的人——使用的,这十分重要。不要忘了等式中人这一边。
l 上课。在本地的学院或大学、或是将要来临的下一次会展上寻找有趣的课程。
l 参加本地用户组织。不要只是去听讲,而要主动参与。与世隔绝对你的职业生涯来说可能是致命的;打听一下你们公司以外的人都在做什么。
l 试验不同的环境。如果你只在Windows上工作,就在家玩一玩Unix(可自由获取的Linux就正好)。如果你只用过makefile和编辑器,就试一试IDE,反之亦然。
l 跟上潮流。订阅商务杂志和其他期刊(参见262页的推荐刊物)。选择所涵盖的技术与你当前的项目不同的刊物。
l 上网。想要了解某种新语言或其他技术的各种特性?要了解其他人的相关经验,了解他们使用的特定行话,等等,新闻组是一种很好的方式。上网冲浪,查找论文、商业站点,以及其他任何你可以找到的信息来源。
持续投入十分重要。一旦你熟悉了某种新语言或新技术,继续前进。学习另一种。
//
前言
在和形形色色的EMAIL客户端软件打交道中,我们不难发现,几乎所有这些软件都是通过SMTP协议发送邮件和通过POP3协议来接收邮件的。同时,大多数的软件通过使用WINSOCK接口来实现TCP/IP连接。
用WINSOCK进行网络编程很难吗?SMTP和POP3协议实现起来很复杂吗?其实不然,在MICORSOFT VISUAL BASIC 5.0中提供了一个叫做MSWINSCK.OCX的WINSOCK控件,通过它,既不需要对WINSOCK..DLL进行复杂的调用,也不需要购买昂贵的专用EMAIL控件,你也可以较为轻松的编写的基于SMTP协议和POP3协议的的EMAIL客户端软件。
第一部分 WINSOCK控件使用简介
在使用 WinSock 控件时,首先需要考虑使用什么协议。微软的WinSock 控件可以使用的协议包括 TCP 和 UDP。UDP 协议是一种无连接协议,在编写EMAIL软件时,一般选用标准的有连接的TCP/IP协议。即把它的属性Protocol 设为sckTCPProtocol。
WINSOCK控件在编程中用到的其它重要属性包括:
LocalPort 本地端口号,作为TCP连接时的收听(listen)端口,一般应取和标准端口不冲突的值(可考虑取1000以上),如果取0,每次程序启动会自动随机分配一个端口。
RemoteHost 远程主机名称,可以是IP地址或相对应的域名
RemotePort 远程端口,一般为标准端口,SMTP为25,POP3为110
用到的重要方法:
Connect 要求连接到远程计算机
SendData 将数据发送给远程计算机
GetData 当DataArrival事件出现时,调用GetData方法可获取远程计算机传来的数据,
Close 对客户机和服务器应用程序关闭 TCP 连接
用到的重要事件:
DataArrival 当从远程服务器来的新数据到达本地机器时出现该事件
第二部分 编写基于POP3协议的EMAIL接收软件
1. POP3协议
POP3(Post Office Protocol -version 3)是一种常用的网络协议,用于从远程服务器的信箱里收取EMAIL,它的常用命令根据连接时的不同状态,有:
l 授权状态(AUTHORIZATION state):
User<SP><name><CRLF> 用户名
Pass<SP><string><CRLF> 用户密码
Quit<CRLF> 退出
l 执行状态(TRANSACTION state):
STAT<CRLF> 信箱状态,信箱内共有几封信,总共大小(8进制表示)等
LIST<SP><msg><CRLF> 不用msg参数时,显示每封信的大小列表,用msg参数,显示编号为msg的信件的长度(8进制表示)
TOP<SP><msg><SP><n><CRLF>
取编号为msg的信件的信头(head)和部分信体(body), n=0,只取信头,n≠0,取信头和信体的前n行。该命令为可选命令,有些pop3 服务器软件不支持。
RETR<SP><msg><CRLF> 取编号为msg的信件
DELE<SP><msg><CRLF> 删编号为msg的信件,其实只是做个标记,实际删除要到更新状态
l 更新状态(UPDATE state)
QUIT<CRLF> 退出,顺便把做过DELE标记的邮件删掉
还有NOOP,LAST,RSET,RPOP等命令,较少用到。
2.界面布局
下面这个小程序只是为了测试一下用winsock控件实现pop3协议收信的情况,因此界面布局比较简单,使用了一些文本框来输入和显示需要的信息。
3.主要程序设计
在frame1里加入一个WINSOCK控件,起名为WINSOCK1,属性Protocol 设为sckTCPProtocol ,RemotePort设为110,LocalPort设为1001。
Ⅰ.连接POP3服务器
填入正确的用户名,密码,POP3服务器名后,按"进行连接"键,执行以下指令:
Private Sub Start_Click()
On Error GoTo Getfail
Winsock1.RemoteHost = Svrname.Text '设置远程服务器的IP或域名
Winsock1.Connect '连接远程服务器
Waiting '等待应答
Winsock1.SendData "USER " + Acou.Text + Chr(13) + Chr(10) '发送用户名
Waiting '等待应答
Winsock1.SendData "PASS " + Passwd.Text + Chr(13) + Chr(10)'发送用户密码
Waiting '等待应答
Winsock1.SendData "STAT " + Chr(13) + Chr(10) '取信箱状态
Waiting '等待应答
Winsock1.SendData "LIST" + Chr(13) + Chr(10) '信件大小列表
Waiting '等待应答
End If
Exit Sub
Getfail:
Info.Text = Info.Text + Chr(13) + Chr(10) + "网络错误!" + Chr(13) + Chr(10)
Winsock1.Close '关闭WINSOCK连接
End Sub
Ⅱ.接收POP3服务器的应答
l 延时程序waiting
Public Sub Waiting()
Dim PauseTime, Start
PauseTime = 60 ' 设置等待响应时间的最长时间60s。
Start = Timer ' 设置开始时刻。
Do While Timer < Start + PauseTime And Not Answerf
DoEvents ' 将控制权让给其他进程,避免在PauseTime期间不接收数据,假死机。
Loop
Answerf = False
End Sub
l 接受数据程序, 当DataArrival事件出现时,调用GetData方法可获取所有远程计算机传来的数据
(包括命令应答,信头,信体数据等等),放在文本框Info中显示
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Comedata As String
Winsock1.GetData Comedata '调用GetData方法,将传来的数据放到Comedata中
Info.Text = Info.Text + Comedata '在文本框Info中显示传来的数据
Answerf = True '应答标志为真
End Sub
Ⅲ.取信头,取信,删信,断开连接等功能的实现
Private Sub Head_Click()
Info.Text = Info.Text + Chr(13) + Chr(10) + "取序号为" + Num.Text + "的信件的信头" + Chr(13) + Chr(10)
Winsock1.SendData "TOP " + Num.Text + " 0" + Chr(13) + Chr(10)
Waiting
End Sub
Private Sub Getm_Click()
Info.Text = Info.Text + Chr(13) + Chr(10) + "取序号为" + Num.Text + "的信件内容" + Chr(13) + Chr(10)
Winsock1.SendData "RETR " + Num.Text + Chr(13) + Chr(10)
Waiting
End Sub
Private Sub Delm_Click()
Info.Text = Info.Text + Chr(13) + Chr(10) + "给序号为" + Num.Text + "的信件做删除标记" + Chr(13) + Chr(10)
Winsock1.SendData "DELE " + Num.Text + Chr(13) + Chr(10)
Waiting
End Sub
Private Sub Quitb_Click()
Winsock1.SendData "NOOP" + Chr(13) + Chr(10)
Waiting
Winsock1.SendData "QUIT" + Chr(13) + Chr(10)
Waiting
Winsock1.Close
End Sub
第三部分 编写基于SMTP协议的EMAIL发送软件
会用WINSOCK控件编POP3收信软件后,编写基于SMTP(Simple Mail Transfer Protocol)协议的发信软件就很简单了。
1.SMTP协议
SMTP总共有 14条命令,不过发一封EMAIL,用如下5条命令就足够了
HELO <SP> <domain> <CRLF> 于POP3服务器握手,传送本机域名
MAIL <SP> FROM:<reverse-path> <CRLF> 传送发信者的信箱名称
RCPT <SP> TO:<forward-path> <CRLF> 传送接收者的信箱名称
DATA <CRLF> 发送信件数据(包括信头和信体)
QUIT <CRLF> 退出与POP3服务器的连接
2.界面布局
同POP3测试程序一样,下面这个小程序只是为了测试一下用winsock实现smtp协议发信的情况,因此界面布局比较简单,靠一些文本框来输入和显示需要的信息。读者可以发现,和POP3不同,这里不需要填写用户名称和密码,这是因为SMTP服务器是不校验用户身份的,你可以用网上的任一个SMTP服务器发信,只要它反应够快的话。
3.主要程序设计
在frame1里加入一个WINSOCK控件,起名为WINSOCK1,属性Protocol 设为sckTCPProtocol ,RemotePort设为25,LocalPort设为1002。
因为都使用WINSOCK控件,基本原理也相同,这个测试程序的延时Waiting子程序和Winsock接受数据的程序段Winsock1_DataArrival等与POP3 TESTER的完全相同,这里就不重复了。
正确填写SMTP服务器名称,本机域名(如没有,可填Default或其它),信件的发信人地址,收信人地址,标题SUBJECT和内容后,按一下发送键,程序执行以下代码:
Private Sub Send_Click()
Answerf = False
On Error GoTo Sendfail
Winsock1.RemoteHost = Servername.Text '设置远程SMTP服务器的IP或域名
Winsock1.Connect '连接远程SMTP服务器
Waiting '等待应答
Winsock1.SendData "HELO " + Frsvr.Text + Chr(13) + Chr(10)
'握手,发送本机域名
Waiting
Winsock1.SendData "MAIL FROM:" + Fromxx.Text + Chr(13) + Chr(10)
'发送发信人信箱名称
Waiting
Winsock1.SendData "RCPT TO:" + Toyy.Text + Chr(13) + Chr(10)
'发送接收人信箱名称(这一句可重复多次,实现同一封信发给多人)
Waiting
Winsock1.SendData "DATA" + Chr(13) + Chr(10)'准备开始传送信件数据
Waiting
Winsock1.SendData "Subject:" + Subj.Text + Chr(13) + Chr(10)'发送标题
Winsock1.SendData "Reply-To:" + Fromxx.Text + Chr(13) + Chr(10)'发送回信地址
Winsock1.SendData "To:" + Toyy.Text + Chr(13) + Chr(10)
'发送接收人信箱名称,该信箱名称将出现在信件的HEAD(信头里),如果想暗送
'(bcc)可不发这句
Winsock1.SendData "X-mailer: Smtp tester" + Chr(13) + Chr(10)
'发送该邮件软件的名称,可任意取名
Winsock1.SendData Body.Text + Chr(13) + Chr(10)'发送信件的内容
Winsock1.SendData Chr(13) + Chr(10) + "." + Chr(13) + Chr(10)'根据协议,"."
'号代表信件数据传送完毕。
Waiting
Winsock1.SendData "QUIT" + Chr(13) + Chr(10)'断开连接
Waiting
Info.Text = Info.Text + Chr(13) + Chr(10) + "发送结束!" + Chr(13) + Chr(10)
Winsock1.Close
Exit Sub
Sendfail:
Info.Text = Info.Text + Chr(13) + Chr(10) + "发送失败!" + Chr(13) + Chr(10)
Winsock1.Close
Answerf = False
End Sub
第四部分 程序改进和WINSOCK控件的其它用途
以上只是用VB5的WINSOCK控件进行EMAIL客户端软件开发的一些基本方法,要设计一个较实用的EMAIL软件,还应将取来的信件写入文件供以后调阅;要对中文和附件进行编码和解码,加强错误捕获等等,我上面的程序需要改进的地方很多,这就留给有兴趣的读者去实践了。
另外,通过改变WINSOCK控件的属性RemotePort,例如改为21(ftp),23(telnet)
再根据FTP或TELNET协议,也可以用WINSOCK控件设计其它的客户端软件,限于篇幅,我这里就不多讲了。
欢迎大家和我来信探讨用WINSOCK控件编程,我的EMAIL是yangjie@poboxes.com,需要上面程序完整代码的朋友,也可用上面的信箱与我联系。
------------------end of this file---------------------------------------
作者:杨捷
单位:浙大中控自动化有限公司
通讯地址:杭州市朝晖六区73-1-502
邮编:310014
电话:(0571)5132404
EMAIL: yangjie@mh.hz.col.com.cn