知识大全 编写可在线收发E-mail的Java Applet
Posted 知
篇首语:学问是心灵的慧眼。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 编写可在线收发E-mail的Java Applet相关的知识,希望对你有一定的参考价值。
编写可在线收发E-mail的Java Applet 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
说起Java 有些人可能会想到一些用于修饰主页的Applet 例如著名的水光倒影Lake class等 其实这些Applet只是Java应用的很小一个方面 作为一种新兴的网络语言 Java用于编写基于TCP/IP的应用才算用到了点子上 在编写TCP/IP的应用方面 Java是我所用过的编程语言中最简洁 最快速的 本文将讨论如何用Java来编写可根据SMTP和POP 协议来收发E mail的Java Applet
一 Java网络编程初步
建立TCP/IP连接
Socket类中的构造函数Socket(String host int port)用于创建一个Socket 并与指定的主机(host)及端口(port)连接 由于受到Java Applet安全机制的限制 主机名不可以任意指定 而应和被调用的Applet所在主机的名字相同 因此 可先由GetCodeBase方法取得浏览器当前读取的CLASS文件所在的URL 再通过GetHost方法从该URL返回用字符串表示的该主机的名称 例如从~caveman/这个URL中可以返回用字符串表示的主机名
关于标准端口地址的值一般是 SMTP为 POP 为 FTP为 等 当然也有的主机用的是非标准的端口 在使用之前最好先确定一下
数据的发送与接收
使用Socket类中的GetOutputStream方法可以取得与当前Socket对应的输出数据流 用DataOutputStream类中的WriteBytes方法可以逐个字符地将数据写入到输出数据流中
使用Socket类中的GetInputStream方法可以取得与当前Socket对应的输入数据流 用DataInputStream类中的ReadLine方法可以逐行地读取输入数据流中的数据
关闭TCP/IP连接
可以用Socket类中的close方法来关闭TCP/IP连接
二 基于SMTP协议发送E mail的Java Applet
SMTP协议和服务器
SMTP(Simple Mail Transfer Protocol)协议是目前网上流行的发送E mail的协议 SMTP协议共有 条命令 不过 发一封E mail只需用如下 条命令就足够了(见表 )
表
命 令 功 能
HELO <SP> <domain> <CRLF> 与SMTP服务器握手 传送本机域名
MAIL <SP> FROM <reverse path> <CRLF>传送发信者的信箱名称
RCPT <SP> TO <forward path> <CRLF> 传送接收者的信箱名称
DATA <CRLF> 发送信件数据(包括信头和信体)
QUIT <CRLF> 退出与SMTP服务器的连接
除了ISP提供的SMTP服务器以外 国内一些存放免费个人主页的服务器的SMTP端口也是打开的 如果该服务器对外来的E mail没有增加RELAY限制(例如网易就有此限制) 那么也可以把它当作SMTP服务器来用 如等 在这些服务器上放一个下面要编的Java Applet和调用它的文件 用户就可以实现在线发送E mail了
SMTPtester java中的主要程序
该Java Applet用了三个文本条(TextField)部件tf tf 和tf 它们分别用来供用户输入发信者的信箱名称 接收者的信箱名称和信件的标题 还用了两个文本区(TextArea)部件ta 和ta ta 供用户输入信体内容 ta 用来显示Smtp服务器的应答信息和出错信息等 当然还用了一个按钮(Button)部件bu 用户输入正确的信息后 用鼠标点击一下它 信件就可以被发出去了
事件捕获处理程序见程序
public boolean handleEvent(Event event )
if ((event target != bu ) || (event id != ))
/*如果不是按钮bu 被鼠标按下*/
return false
if (!((tf getText() length() == ) || (tf getText() length() == )))
/*如果发信者和收信人的信箱名称都填好了 执行发信程序Bu run*/
bu disable()
bu run()
return true
ta appendText( Please give me enough information to send your email!\\n )
return true
(程序 )
发送E mail程序bu run见程序
public void bu run()
try
Socket socket = new Socket(getCodeBase() getHost() )
/*建立与smtp服务器的连接*/
DataOutputStream dataout = new DataOutputStream(socket getOutputStream())
DataInputStream dataIn = new DataInputStream(socket getInputStream())
GetReply(dataIn )
dataout writeBytes( HELO \\r\\n )
/*开始按SMTP协议发信*/
GetReply(dataIn )
dataout writeBytes( MAIL FROM + tf getText() + \\r\\n )
GetReply(dataIn )
dataout writeBytes( RCPT TO + tf getText() + \\r\\n )
GetReply(dataIn )
dataout writeBytes( DATA\\r\\n )
GetReply(dataIn )
dataout writeBytes( From + tf getText() + \\r\\n )
dataout writeBytes( To + tf getText() + \\r\\n )
dataout writeBytes( Subject +tf getText()+ \\n\\n +ta getText()+ \\r\\n \\r\\n )
GetReply(dataIn )
dataout writeBytes( QUIT\\r\\n )
GetReply(dataIn )
socket close()
/*退出连接*/
bu enable()
return
catch (java io IOException IOException ) /*捕获IO错误*/
ta appendText( Error!\\n )
bu enable()
return
(程序 )
接收服务器应答程序GetReply见程序
void GetReply(DataInputStream dataIn )
String string
string =
try
string = dataIn readLine()
ta appendText(string + \\n )
catch (java io IOException IOException )
ta appendText( Error!\\n )
bu enable()
return
(程序 )
实例运行
在~caveman上已经放了编译好的SMTPtester class和调用它的 图 是该Applet在运行时的画面 这时这封信已被发往了!
图
三 基于POP 协议读取E_mail的Java Applet
POP 协议和服务器
POP (Post Office Protocol version )是一种常用的网络协议 用于从远程服务器的信箱里收取E_mail 它的常用命令根据连接时的不同状态有
( )授权状态(AUTHORIZATION state)
User<SP><name><CRLF> 用户名
Pass<SP><string><CRLF> 用户密码
Quit<CRLF> 退出
( )执行状态(TRANSACTION state)
STAT<CRLF> 信箱状态 即信箱内共有几封信 总共大小( 进制表示)等
LIST<SP><msg><CRLF> 不用msg参数时显示每封信的大小列表 用msg参数时显示编号为msg的信件的长度( 进制表示)
TOP<SP><msg><SP><n><CRLF> 取编号为msg的信件的信头(head)和部分信体(body) n= 时只取信头 n≠ 时取信头和信体的前n行 该命令为可选命令 有些POP 服务器软件不支持它
RETR<SP><msg><CRLF> 读取编号为msg的信件
DELE<SP><msg><CRLF> 删编号为msg的信件 其实只是作个标记 真正删除要到更新状态
( )更新状态(UPDATE state)
QUIT<CRLF> 退出并把做过DELE标记的邮件删掉
另外还有NOOP LAST RSET RPOP等命令用得较少
与SMTP服务器的情况相似 除了ISP提供的POP 服务器外 国内的一些存放免费个人主页的服务器也提供POP 服务(例如网易) 用户在获得免费主页的同时也可以得到一个POP 信箱 例如我的信箱为 在服务器上放一个下面要编写的Applet和调用它的文件 在线运行它 输入正确的用户名和密码后就可以读取E mail了
POP tester java中的主要程序
该Java Applet共用了三个文本条(TextField)部件tf tf 和tf 它们分别用来供用户输入用户名 密码和要读取的E mail的编号(为 时 只取信箱状态不读信) 还用了一个文本区(TextArea)部件ta 用来显示POP 服务器的应答信息 信件内容和出错信息等 当然还用了一个按钮(Button)部件bu 用户输入正确的信息后 用鼠标点击一下它 就可以读取指定的信件了
事件捕获处理程序与SMTPtester中的一样 读取E mail程序bu run见程序
public void bu run()
try
Socket socket = new Socket(getCodeBase() getHost() )
/*连接POP 服务器*/
DataOutputStream dataout = new DataOutputStream(socket getOutputStream())
DataInputStream dataIn = new DataInputStream(socket getInputStream())
GetReply(dataIn )
dataout writeBytes( USER + tf getText() + \\r\\n )
GetReply(dataIn )
dataout writeBytes( PASS + tf getText() + \\r\\n )
GetReply(dataIn )
dataout writeBytes( STAT\\r\\n )
/*信箱状态*/
GetReply(dataIn )
dataout writeBytes( LIST\\r\\n )
/*信件长度列表*/
GetReply (dataIn )
ta appendText( \\n )
if (tf getText() equals( ) == false)
dataout writeBytes( RETR + tf getText() + \\r\\n )
/*读取指定信件*/
GetReply (dataIn )
ta appendText( \\n )
dataout writeBytes( QUIT\\r\\n )
GetReply(dataIn )
socket close()
bu enable()
return
catch (java io IOException IOException )
ta appendText( Error!\\n )
bu enable()
return
(程序 )
接收服务器应答程序GetReply和GetReply 见程序
void GetReply (DataInputStream dataIn )
String string
string =
try
for (string =dataIn readLine()
(string equals( )=false)
string =dataIn readLine())
/*List和Retr命令的应答虽然有多行 但都用一句 作为结束 可据此取应答信息*/
ta appendText(string + \\n )
catch (java io IOException IOException )
ta appendText( Error!\\n )
bu enable()
return
(程序 )
读取单句应答的程序GetReply和SMTPtester中的相同 因为在与POP 服务器对话时 List和Retr的应答不只一句 因此又编了一个GetReply 程序来处理这个问题
实例运行
在~caveman上已经放了编译好的POP tester class和调用它的l 图 是该Applet运行时的画面 刚才在上用SMTPtester发出的那封信已到了我网易的信箱里了
四 程序的改进
cha138/Article/program/Java/hx/201311/26368相关参考
通过E-mail共享Java对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JDK的新功能序
PHP是一种功能强大的Web开发语言开发效率高语法简单为动态网站量身定做加强面向对象(向C++靠拢与JAVA搭了点边)可惜单线程(这是至命弱点据说PHP是用CC++编写的)也能用CC++JAVA开
Java如何处理ICMP报文的收发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 前言 jav
知识大全 Java Socket通信技术收发线程互斥的解决方法
JavaSocket通信技术收发线程互斥的解决方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
使用Java编写的B*算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 使用Java编写的B*
Java进阶:Java编写通过代理访问的应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
JAVA代码编写的30条建议 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ()类名首字母应该大
自己编写的Java数组操作工具 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 看到网上的一段关于
Java进阶:跨平台编写Java程序注意事项 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 使用
时尚:用Java编写手机应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 不知从什么时候开