简单Web Server实现电子邮件客户端实验报告.docx
- 文档编号:26038970
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:29
- 大小:168.58KB
简单Web Server实现电子邮件客户端实验报告.docx
《简单Web Server实现电子邮件客户端实验报告.docx》由会员分享,可在线阅读,更多相关《简单Web Server实现电子邮件客户端实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
简单WebServer实现电子邮件客户端实验报告
一.简单WebServer实现
1.引言
1.1实验目的
通过本实验,熟悉WebServer的安装和配置过程,进一步理解其工作原理。
1.2介绍
WEB服务器也称为WWW(WORLDWIDEWEB)服务器,主要功能是提供网上信息浏览服务。
WWW是Internet的多媒体信息查询工具,是Internet上近年才发展起来的服务,也是发展最快和目前用的最广泛的服务。
正是因为有了WWW工具,才使得近年来Internet迅速发展,且用户数量飞速增长。
2.任务概述
2.1实验目标
实现一个WebServer的基本功能,用户通过Chrome等浏览器向服务器端发出网页请求,服务器端接到请求,向用户返回用户所需的网页。
同时通信记录在服务器端记录现实。
2.2运行环境需求
Win7,cmd。
3.工作原理
http协议使Web服务器和浏览器可以通过Web交换数据。
它是一种请求/响应协议,即服务器等待并响应客户方请求。
HTTP不维护与客户方的连接,它使用可靠的TCP连接。
客户/服务器传输过程可分为四个基一步骤:
1浏览器与服务器建立连接;
2浏览器向服务器请求文档;
3服务器响应浏览器请求;
4断开连接。
4.程序演示
1、运行程序WebServer.java
图1:
运行WebServer.java效果
2、访问服务器URL:
http:
//localhost:
8080/
图2:
访问服务器URL:
http:
//localhost:
8080/效果
3、服务器端:
图3:
用户访问之后服务器端效果
5.程序代码:
//WebServer.javaWebServer是服务器主线程类
importjava.io.File;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
import.InetAddress;
import.ServerSocket;
import.Socket;
publicclassWebServer{
//设置静态资源的目录
publicstaticfinalStringWEB_ROOT=System.getProperty("user.dir")+File.separator;
//设置关闭命令
privatestaticfinalStringSHUTDOWN_COMMAND="/SHUTDOWN";
privatebooleanshutdown=false;
publicstaticvoidmain(String[]args){
WebServerserver=newWebServer();
server.await();
}
publicvoidawait(){
ServerSocketserverSocket=null;
//监听8080端口
intport=8080;
try{
serverSocket=newServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
}catch(IOExceptione){
e.printStackTrace();
System.exit
(1);
}
//循环等待客户端连接
while(!
shutdown){
Socketsocket=null;
InputStreaminputStream=null;
OutputStreamoutputStream=null;
System.out.println("WebServerislisteningonport"+serverSocket.getLocalPort());
try{
socket=serverSocket.accept();//当有客户端连接时
inputStream=socket.getInputStream();//获取请求字符流
outputStream=socket.getOutputStream();//输出流
//处理客户端请求---Request
Requestrequest=newRequest(inputStream);
request.parse();
//向客户端发送Response
Responseresponse=newResponse(outputStream);
response.setRequest(request);
response.sendStaticResource();
//关闭socket
socket.close();
//检查如果是shutdown命令,关闭服务器
shutdown=request.getUri().equals(SHUTDOWN_COMMAND);
}catch(Exceptione){
e.printStackTrace();
continue;
}
}
}
}
//Request.java响应HTTP协议中的Request
importjava.io.IOException;
importjava.io.InputStream;
publicclassRequest{
privateInputStreaminputStream;
privateStringuri;
publicStringgetUri(){
returnuri;
}
publicvoidsetUri(Stringuri){
this.uri=uri;
}
publicRequest(InputStreaminputStream){
this.inputStream=inputStream;
}
publicvoidparse(){
//从socket读取字符
StringBufferrequest=newStringBuffer(2048);
inti;
byte[]buffer=newbyte[2048];
try{
i=inputStream.read(buffer);
}catch(IOExceptione){
e.printStackTrace();
i=-1;
}
for(intj=0;j
request.append((char)buffer[j]);
}
System.out.println(request.toString());
uri=parseUri(request.toString());
}
/**
*从客户端请求字符串中截取请求资源uri
*@paramrequeString请求字符串,包括请求头、请求方法、请求资源的uri
*@return请求资源的uri
*/
privateStringparseUri(StringrequeString){
intindex1,index2;
//比如GET/index.htmlHTTP/1.1
//请求方法、请求资源、版本之间以空格隔开
index1=requeString.indexOf('');
if(index1!
=-1){
index2=requeString.indexOf('',index1+1);
if(index2>index1){
returnrequeString.substring(index1+1,index2);
}
}
returnnull;
}
}
//Response.java响应HTTP协议中的Response
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.OutputStream;
publicclassResponse{
privatestaticfinalintBUFFER_SIZE=1024;
Requestrequest;
OutputStreamoutputStream;
publicResponse(OutputStreamoutputStream){
this.outputStream=outputStream;
}
publicvoidsetRequest(Requestrequest){
this.request=request;
}
//发送静态资源
publicvoidsendStaticResource()throwsIOException{
byte[]bytes=newbyte[BUFFER_SIZE];
FileInputStreamfis=null;
try{
Filefile=newFile(WebServer.WEB_ROOT,request.getUri());
if(file.exists()){//如果请求的静态资源文件存在
fis=newFileInputStream(file);
intch=fis.read(bytes,0,BUFFER_SIZE);
while(ch!
=-1){
outputStream.write(bytes,0,ch);
ch=fis.read(bytes,0,BUFFER_SIZE);
}
}else{//如果静态资源不存在
StringerrorMessage="HTTP/1.1404FileNotFound\r\n"+
"Content-Type:
test/html\r\n"+
"Content-Length:
23\r\n"+
"\r\n"+
"
FileNotFound
";outputStream.write(errorMessage.getBytes());
}
}catch(Exceptione){
System.out.println(e.toString());
}
finally{
if(fis!
=null){
fis.close();
}
}
}
}
6.实验心得:
通过本次实验,我锻炼了自己的上机操作能力,并对理论知识有了进一步的理解,了解并掌握了简单WebServer的安装与配置过程,并对客户服务器模式的内部运行有了进一步的理解。
二.电子邮件客户端
1.引言
1.1实验目的
●理解并掌握简单邮件传送协议,以及SMTP的会话过程
●通过本实验,使学生能够对网络编程有进一步的理解和掌握,理解HTTP协议的技术细节以及WEB服务器的实现原理,理解SMTP协议的细节。
1.2介绍
电子邮件是因特网上最为流行的应用之一。
如同邮递员分发投递传统邮件一样,电子邮件也是异步的,也就是说人们是在方便的时候发送和阅读邮件的,无须预先与别人协同。
与传统邮件不同的是,电子邮件既迅速,又易于分发,而且成本低廉。
另外,现代的电子邮件消息可以包含超链接、HTML格式文本、图像、声音甚至视频数据。
我们将在本文中查看处于因特网电子邮件核心地位的应用层协议。
但在深入讨论这些协议之前,让我们先概览一下因特网邮件系统及其重要部件。
SMTP在RFC821中定义,它的作用是把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。
SMTP的历史比HTTP早得多,其RFC是在1982年编写的,而SMTP的现实使用又在此前多年就有了。
尽管SMTP有许多奇妙的品质(它在因特网上的无所不在就是见证),但却是一种拥有某些“古老”特征的传统战术。
例如,它限制所有邮件消息的信体(而不仅仅是信头)必须是简单的7位ASCII字符格式。
这个限制在20世纪80年代早期是有意义的,当时因特网传输能力不足,没有人在电子邮件中附带大数据量酌图像、音频或视频文件。
然而到了多媒体时代的今天,这个限制就多少显得局促了——它迫使二进制多媒体数据在文由SMTP传送之前首先编码成7位ASCII文本;SMTP传送完毕之后,再把相应的7位ASCII文本邮件消息解码成二进制数据。
HTTP不需要对多媒体数据进行这样的编码解码操作。
2.任务概述
2.1实验目标
本实验旨在开发一个能够发送和接收电子邮件的软件,用户可以利用某个网站的SMTP电子邮件发送服务器来发送电子邮件。
用户必须是该网站的注册用户,并在该网站申请了免费邮箱。
首先填入SMTP服务器地址、邮箱用户名和密码,并填入发信人。
发信地址填入用户在该网站的免费邮箱地址。
在对话框的右面填入发送电子邮件的相关信息,然后点击“发信”按钮,程序会与服务器建立TCP连接,然后按照ESMTP协议发送ELHO命令,然后发送用户名和密码,经过验证,进入SMTP会话。
通过命令交互,将邮件发送出去,然后断开连接。
2.2运行环境需求
Win7,cmd。
3.工作原理
1)客户端使用TCP协议连接SMTP服务器的25端口;
2)客户端发送HELO报文将自己的域地址告诉给SMTP服务器;
3)SMTP服务器接受连接请求,向客户端发送请求账号密码的报文(AUTHLOGIN);
4)客户端向SMTP服务器传送账号和密码,如果验证成功,向客户端发送一个OK命令,表示可以开始报文传输;
5)客户端使用MAIL命令将邮件发送者的名称发送给SMTP服务器;
6)SMTP服务器发送OK命令做出响应;
7)客户端使用RCPT命令发送邮件接收者地址,如果SMTP服务器能识别这个地址,就向客户端发送OK命令,否则拒绝这个请求;
8)收到SMTP服务器的OK命令后,客户端使用DATA命令发送邮件的数据。
9)客户端发送QUIT命令终止连接。
4.程序演示
1、运行程序SMTPClient.java:
图1:
运行程序SMTPClient.java效果
2、登陆后进入书写邮件内容界面:
图2:
书写邮件内容界面
3、发送成功:
图3:
邮件发送成功
4、收件方:
图4:
收件方效果
5.程序代码:
//SMTPClient.java
importjava.awt.BorderLayout;
importjava.awt.EventQueue;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
import.Socket;
import.UnknownHostException;
importjava.util.StringTokenizer;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.border.EmptyBorder;
classBASE64Encoder{
privatestaticchar[]codec_table={'A','B','C','D','E','F','G',
'H','I','J','K','L','M','N','O','P','Q','R','S','T',
'U','V','W','X','Y','Z','a','b','c','d','e','f','g',
'h','i','j','k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z','0','1','2','3','4','5','6',
'7','8','9','+','/'};
publicBASE64Encoder(){
}
publicStringencode(byte[]a){
inttotalBits=a.length*8;
intnn=totalBits%6;
intcurPos=0;//processbits
StringBuffertoReturn=newStringBuffer();
while(curPos intbytePos=curPos/8; switch(curPos%8){ case0: toReturn.append(codec_table[(a[bytePos]&0xfc)>>2]); break; case2: toReturn.append(codec_table[(a[bytePos]&0x3f)]); break; case4: if(bytePos==a.length-1){ toReturn .append(codec_table[((a[bytePos]&0x0f)<<2)&0x3f]); }else{ intpos=(((a[bytePos]&0x0f)<<2)|((a[bytePos+1]&0xc0)>>6))&0x3f; toReturn.append(codec_table[pos]); } break; case6: if(bytePos==a.length-1){ toReturn .append(codec_table[((a[bytePos]&0x03)<<4)&0x3f]); }else{ intpos=(((a[bytePos]&0x03)<<4)|((a[bytePos+1]&0xf0)>>4))&0x3f; toReturn.append(codec_table[pos]); } break; default: break; } curPos+=6; } if(nn==2) { toReturn.append("=="); } elseif(nn==4) { toReturn.append("="); } returntoReturn.toString(); } } publicclassSMTPClientextendsJFrame{ privatebooleandebug=true; privateJPanelcontentPane; BASE64Encoderencode=newBASE64Encoder();//用于加密后发送用户名和密码 publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{ LoginPagelp=newLoginPage(); } publicSMTPClient(Stringu,Stringp,Stringr,Stringt,Stringc)throwsUnknownHostException,IOException{ MailMessagemessage=newMailMessage(); message.setFrom(u);//发件人 message.setTo(r);//收件人 Stringserver="";//邮件服务器 message.setSubject(t);//邮件主题 message.setContent(c);//邮件内容 message.setDatafrom(u);//发件人,在邮件的发件人栏目中显示 message.setDatato(r);//收件人,在邮件的收件人栏目中显示 message.setUser(u);//登陆邮箱的用户名 message.setPassword(p);//登陆邮箱的密码 SMTPClientsmtp=newSMTPClient(server,25); booleanflag; flag=smtp.sendMail(message,server); if(flag){ JOptionPane.showMessageDialog(this,"邮件发送成功! "); } else{ JOptionPane.showMessageDialog(this,"邮件发送失败! "); } } privateSocketsocket; publicSMTPClient(Stringserver,intport)throwsUnknownHostException,IOException{ socket=newSocket(server,25); } privateintsendServer(Stringstr,BufferedReaderin,BufferedWriterout)throwsIOException{ out.write(str); out.newLine(); out.flush(); returngetResult(in); } publicintgetResult(BufferedReaderin)throwsIOException{ Stringline=""; line=in.readLine();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单Web Server实现电子邮件客户端实验报告 简单 Web Server 实现 电子邮件 客户端 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)