网络编程技术第十周.ppt
第五次课 Socket 编程(3)JavaMail编程(1),Socket编程(2),零、习题讲解,一、数据报式套接字,五、小结和作业,二、常用的邮件协议,三、环境配置,一、数据报式套接字,1、UDP协议,用户数据报协议:User Datagram Protocol一种面向无连接的传输层协议,提供面向操作的简单的不可靠数据传送服务。在网络中它与TCP协议一样用于处理数据包。UDP协议在发送数据时并不刻意追求数据包会完全发送出去,也不能担保它们抵达的顺序与它们发出时一样,所以它是一种不可靠协议。UDP传输数据之前客户端和服务器端不建立连接,当它想发送数据时则获取来自应用程序的数据,并尽可能快地把它放到网络上。由于传输数据时不需建立连接,不需维护连接状态,因此一台服务器可同时向多个客户传输相同的数据。,一、数据报式套接字,2、数据报式套接字中所需的类,DatagramPacket类数据报包封装类。把具体的要传输的信息,包含IP地址,端口号和需要传输的数据等封装在称为数据报包(Datagram)的UDP包中。DatagramSocket类用于收发UDP数据报的套接字接口类。为发送数据,要将数据封装到DatagramPacket中,使用DatagramSocket发送该包。为接收数据,要从DatagramSocket中接收一个DatagramPakcet对象,然后解析该包的内容,一、数据报式套接字,3、DatagramSocket类,功能该类表示用来发送和接收数据报包的套接字(Socket)。要收发DatagramPacket,必须创建一个数据报套接字DatagramSocket。,构造方法public DatagramSocket()throws SocketException功能:创建用于数据报通信的socket对象,由本地主机自动指定的一个可用的端口号。DatagramSocket socket=new DatagramSocket();/创建一个用于收发数据报的DatagramSocket对象,一、数据报式套接字,3、DatagramSocket类,构造方法public DatagramSocket(int port)throws SocketException功能:创建用于数据报通信的socket对象,并且把它绑定到本地主机指定的端口port。public DatagramSocket(int port,InetAddress addr)throws SocketException功能:创建用于数据报通信的socket对象,并绑定到指定的本地地址addr的指定端口port。DatagramSocket socket=new DatagramSocket(3000);/在端口3000创建用于通信的Socket对象,一、数据报式套接字,3、DatagramSocket类,常用方法一、发送方法public void send(DatagramPacket p)throws IOException功能:将数据报包p发送出去。二、接收方法public synchronized void receive(DatagramPacket p)throws IOException从网络接收一个UDP数据报包,并存储在DatagramPacket类对象p中。该数据报包p还包含发送方的IP 地址和发送方主机的端口号。,一、数据报式套接字,3、DatagramSocket类,public int getLocalPort()功能:获取该socket绑定的本地主机的端口号。public void close()功能:释放该数据报socket所占用的端口。,常用方法public InetAddress getLocalAddress()功能:获取该socket绑定的本地地址。,一、数据报式套接字,4、DatagramPacket类,功能是进行数据报通信的基本单位。包含了IP地址、端口号和需要传输的数据等。在发送和接收数据报时,要创建DatagramPakcet类对象作为数据的载体。,构造方法之一:发送用的数据报public DatagramPacket(byte ibuf,int ilength,InetAddress iaddr,int iport)构造方法之二:接收用的数据报public DatagramPacket(byte ibuf,int ilength),一、数据报式套接字,4、DatagramPacket类,构造方法之一:发送用的数据报public DatagramPacket(byte ibuf,int ilength,InetAddress iaddr,int iport)功能:创建一个用于发送数据报的DatagramPacket类对象。参数:ibuf:存储数据报的缓冲区。ilength:发送数据报的长度,必须小于等于ibuf.length。iaddr:数据报要发送到的目的IP地址。iport:数据报要发送到的目的地址的端口号。,一、数据报式套接字,4、DatagramPacket类,构造方法之一:发送用的数据报public DatagramPacket(byte ibuf,int ilength,InetAddress iaddr,int iport)举例:String date=new Date().toString();/获取服务器当前时间buf=date.getBytes();/将当前日期时间存入字节数组bufpacket=new DatagramPacket(buf,buf.length,addr,port);/构造发送数据报包socket.send(packet);/发送数据报,一、数据报式套接字,4、DatagramPacket类,构造方法之一:接收用的数据报public DatagramPacket(byte ibuf,int ilength)功能:创建一个用于接收数据报的DatagramPacket类对象。参数:ibuf:存储数据报的缓冲区。在数据报通信中,发送和接收一个数据报,都需提供一个缓冲区,用来安置发送和接收到的数据报。ilength:接收数据报的长度,必须小于等于ibuf.length。举例:DatagramPacket packet=new DatagramPacket(buf,buf.length);socket.receive(packet);/接收数据报包,一、数据报式套接字,4、DatagramPacket类,常用方法之解析数据报包的方法(1)public synchronized InetAddress getAddress()功能:返回存放在接收或发送的数据报中的IP地址。(2)public synchronized int getPort()功能:返回存放在接收或发送的数据报中的端口号。(3)public synchronized byte getData()功能:返回存放在数据报中的数据。(4)public synchronized int getLength()功能:返回数据报中数据的长度。,一、数据报式套接字,4、DatagramPacket类,常用方法之解析数据报包的方法举例InetAddress addr=packet.getAddress();int port=packet.getPort();/解析收到的数据报包packet,返回客户端的IP地址和端口号String time=new String(packet.getData();/解析数据报包,获取其中的数据内容,一、数据报式套接字,4、DatagramPacket类,常用方法之封装数据报包的方法(5)public synchronized void setAddress(InetAddress iaddr)功能:设置发送数据报的目的地址为iaddr。(6)public synchronized void setPort(int iport)功能:设置发送数据报的目的地址的端口号为iport。(7)public synchronized void setData(byte ibuf)功能:设置数据报中的数据内容为字节数组ibuf的数据。(8)public synchronized void setLength(int ilength)功能:设置数据报中的数据的长度为ilength。,一、数据报式套接字,5、编程基本步骤,开发基于UDP协议的网络应用程序时,需分别编写客户端和服务器端两个应用程序,这两个程序的基本架构相似。基本步骤如下:(1)建立一个DatagramSocket对象;(2)创建用于发送数据的DatagramPacket对象;封装:数据内容,数据长度,目的IP地址,目的端口号或创建用于接收数据的DatagramPacket对象;封装:存储数据报的缓冲区ibuf及缓冲区长度(3)利用DatagramSocket类方法receive()或send()接收或发送数据报包。,一、数据报式套接字,5、编程基本步骤,举例-1:TimeServer_UDP.java和TimeServer_UDP.java服务器开启了一个查询本机时间的服务,客户机如果需要查询服务器当前时间,就向服务器发送一个UDP数据报包,服务器将其当前的系统时间封装在一个UDP数据报包中发送给客户机。,TimeServer_UDP.java运行界面,TimeClient_UDP.java运行界面,一、数据报式套接字,5、编程基本步骤,举例-2:TimeServer_UDP.java和TimeServer_UDP.java服务器开启了一个查询本机时间的服务,客户机如果需要查询服务器当前时间,就向服务器发送一个UDP数据报包,服务器将其当前的系统时间封装在一个UDP数据报包中发送给客户机。思路1.客户机向服务器发送一个UDP数据报包2.服务器从收到的DatagramPacket包中解析出客户机的IP地址和端口号3.然后将本机当前时间封装在一个以客户机IP地址和端口号的数据报包中,发送给客户机。4.客户机收到后将时间解析出来显示。,一、数据报式套接字,5、编程基本步骤,举例-1:服务器端,在端口3000创建DatagramSocket对象socket,构造接收数据报包的DataPacket对象packetsocket.receive(packet);,进入循环,继续接收其他客户机的数据报包,获取系统当前时间并转换为字符串:String date=new Date().toString();buf=date.getBytes();,从客户端收到的数据报包中packet中解析出客户机的IP地址和端口号,创建确定数据内容、IP地址和端口号的数据报包,并通过socket.send(packet)将其发送给客户机,一、数据报式套接字,5、编程基本步骤,举例-1:TimeServer_UDP.java关键代码1.构造DatagramSocketDatagramSocket socket=new DatagramSocket(3000);2.构造接收数据报包byte buf=new byte256;DatagramPacket packet=new DatagramPacket(buf,buf.length);socket.receive(packet);,一、数据报式套接字,5、编程基本步骤,举例-1:TimeServer_UDP.java关键代码3.解析数据报包InetAddress addr=packet.getAddress();int port=packet.getPort();,4.构造发送数据报包String date=new Date().toString();buf=date.getBytes();packet=new DatagramPacket(buf,buf.length,addr,port);socket.send(packet);,一、数据报式套接字,5、编程基本步骤,举例-1:TimeClient_UDP.java程序流程图,创建要发送的数据报包packet,以客户机的任意端口号创建DatagramSocket对象socketsocket.send(packet);将packet数据报包发送给服务器,创建接收的数据报包packet通过socket.receive(packet)从服务器接收数据报包,存放在packet中,通过packet.getData()方法从packet中解析出服务器发送过来的时间,并显示,关闭socket,一、数据报式套接字,5、编程基本步骤,举例-1:TimeClient_UDP.java关键代码1.构造socketDatagramSocket socket=new DatagramSocket();2.构造发送数据报包并发送DatagramPacket packet=new DatagramPacket(msg,msg.length,InetAddress.getByName(host),port);DatagramSocket socket=new DatagramSocket();socket.send(packet);,一、数据报式套接字,5、编程基本步骤,举例-1:TimeClient_UDP.java关键代码,3.构造接收数据报包并解析packet=new DatagramPacket(msg,msg.length);socket.receive(packet);String time=new String(packet.getData();System.out.println(侦听服务器:+host+的当前时间是:+time);,一、数据报式套接字,6、编程总结,举例-1:TimeClient_UDP.java和TimeClient_UDP.java问题1.客户端发送给服务器的数据报包中封装的数据部分的内容是什么?2.服务器发送给客户端的数据报包中封装的数据部分的内容是什么?3.服务器端是如何知道客户端的IP地址和端口号的?4.DatagramPacket构造的发送数据报包和接收数据报包对象有何不同?,一、数据报式套接字,6、编程总结,举例-1:TimeClient_UDP.java和TimeClient_UDP.java程序的执行流程?,服务器,客户端,封装一个数据报包,DatagramSocket socket=new DatagramSocket(3000);System.out.println(等待接收数据.);,启动后监听客户的请求,String host=localhost;byte msg=new byte256;InetAddress addr=InetAddress.getByName(host);System.out.println(侦听主机为:+addr);DatagramPacket packet=new DatagramPacket(msg,msg.length,addr,3000);,一、数据报式套接字,6、编程总结,举例-2:TimeClient_UDP.java和TimeClient_UDP.java程序的执行流程?,将封装好的数据报包发送给服务器,服务器,客户端,封装一个数据报包,启动后监听客户的请求,DatagramSocket socket=new DatagramSocket();socket.send(packet);,接收此数据报包,byte buf=new byte256;DatagramPacket packet=new DatagramPacket(buf,buf.length);socket.receive(packet);,一、数据报式套接字,6、编程总结,举例-2:TimeClient_UDP.java和TimeClient_UDP.java,将封装好的数据报包发送给服务器,服务器,客户端,封装一个数据报包,启动后监听客户的请求,接收此数据报包,解析此数据报包,取得客户端主机的IP地址和端口号addr和port,InetAddress addr=packet.getAddress();int port=packet.getPort();,取得服务器当前时间time,将其封装在数据报包packet中,并发送给客户端。,packet=new DatagramPacket(buf,buf.length,addr,port);socket.send(packet);,接收服务器端发送过来的数据报包packet,packet=new DatagramPacket(msg,msg.length);socket.receive(packet);,解析收到的数据报包packet,String time=new String(packet.getData();System.out.println(侦听主机为+host+的当前日期时间为:+time);,关闭socket:socket.close();,一、数据报式套接字,7、问题,思考:1.UDP套接字与TCP套接字编程存在什么区别?2.观察TimeClient_UDP.java,如何将下图红色框线表示的部分去掉?,一、因特网电子邮件系统的组成,二、常用的邮件协议,用户代理邮件服务器简单邮件传输协议SMTP1.用户代理user agent,又称为邮件阅读器,允许用户阅读、回复、转发、保存和撰写报文。俗称电子邮件客户端软件。常用的电子邮件客户端软件Foxmail,Outlook,Dreammail,KooMail,IncrediMail,Becky!,PocoMail,Thunderbird,The Bat!,Eudora,一、因特网电子邮件系统的组成,二、常用的邮件协议,2.邮件服务器mail server,电子邮件体系结构的核心。每个用户可以在某个邮件服务器上注册一个邮箱,来管理和维护发送给他的邮件。如126,163邮件服务器等。发送邮件服务器和接收邮件服务器发送邮件服务器:使用邮件发送协议SMTP来发送邮件到接收服务器,又称为SMTP服务器。接收邮件服务器:使用邮件接收协议POP3或者IMAP协议接收邮件,又称为POP3服务器或者IMAP服务器。,一、因特网电子邮件系统的组成,二、常用的邮件协议,3.简单邮件传输协议SMTP使用TCP可靠数据传输服务,在端口25进行监听,将邮件从发送方的邮件服务器发送到接收方的邮件服务器。SMTP的两个组成部分:SMTP客户端:当一个邮件服务器向其他邮件服务器发送邮件时,表现为SMTP客户机。SMTP服务器:当一个邮件服务器从其他邮件服务器接收邮件时,表现为一个SMTP的服务器。,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP邮件传送过程:第一步客户端发送MAIL命令,代表发送邮件的开始。服务器则以250 OK作为响应,表明准备接收。MAIL命令的一般格式为:MAIL FROM:reverse-pathCRLFreverse-path为发送者邮箱地址,如。CRLF为回车、换行符。SMTP命令均以CRLF作为结束,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP邮件传送过程:第二步客户端发送RCPT命令,以标识该电子邮件的接收者,可以有多个RCPT。RCPT命令的一般格式为:RCPT TO:forward-pathCRLFforward-path为各个邮件接收者的地址。如果命令被接收,服务器发送250 OK作为响应;若接收者地址无效则返回550 Failure作为响应。,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP邮件传送过程:第三步用DATA命令发送邮件。此时客户端在DATA命令成功后向服务器发送邮件内容如果服务器接收到DATA命令,则向客户端发送354应答作为响应。此时客户端在接收到这个响应后需立即发送包含邮件的文本信息。SMTP协议规定邮件以一个只包含一个句号“.”的行作为邮件结束。当服务器接收到这样一行后,结束邮件内容的接收并以250 OK作为响应。,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP邮件发送过程Server:220 SMTP service ready 服务器已准备好。Client:HELO mypc主机mypc要与服务器交互信息Server:250 says hello to mypc服务器同意与mypc交互信息Client:MAIL FROM:发送邮件(发送者地址)Server:250 sender OK okClient:RCPT TO:接收者地址Server:250 recipient OK ok,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP邮件发送过程Client:DATA 开始发送邮件内容Server:354 send mail;end with“.”on a line by itself 同意发送邮件内容Client:Hello,I miss you very muchServer:250 message accept 邮件内容已接收完Client:QUIT 请求结束本次交互Server:221 wgx closing connection 同意结束本次交互。,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP邮件发送过程,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP的常用命令,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP的常用命令,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP应答码,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP应答码,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP应答码,二、协议简介,二、常用的邮件协议,1.简单邮件传输协议SMTPSMTP应答码,二、协议简介,二、常用的邮件协议,2.邮件访问协议POP3第三版邮局协议IMAP因特网邮件访问协议HTTP,二、协议简介,二、常用的邮件协议,2.邮件访问协议,1)POP3第三版邮局协议:POP协议(Post Office Protocol)又称邮局协议,它使工作站可以从服务器上取得邮件,而服务器为它暂时保存邮件。它运行于TCP之上,默认在110端口侦听。POP3协议适用于Client/Server模式。它主要工作在离线方式下。目前的邮件服务器基本上都支持通过POP3协议接收。POP3协议规定,邮件客户端程序需要接收电子邮件时,它必须同POP3邮件服务器建立一个双向连接。,二、协议简介,二、常用的邮件协议,2.邮件访问协议-POP3第三版邮局协议,1.建立连接阶段用户代理打开一个到邮件服务器110端口的TCP连接后,POP3协议就开始工作。2.用户验证阶段用户代理以明文形式传输用户名和口令以鉴别用户。,3.邮件操作阶段取回报文,对邮件做或取消删除标记,获取邮件统计信息。,4.断开连接阶段客户机发出quit命令结束该POP会话,邮件服务器删除那些被标记为删除的报文。,POP3邮件服务器的应答码只有两种:+OK和-ERR。+OK表示正常-ERR表示错误。,二、协议简介,二、常用的邮件协议,2.邮件访问协议2)IMAP协议Internet Mail Access Protocol,又称Internet邮件访问协议,是更高级的用于接收邮件的协议。它对POP3的存储转发限制提供了重要的改进。,二、协议简介,二、常用的邮件协议,2.邮件访问协议传统电子邮件协议及其通信实体,用户代理,邮件服务器,邮件服务器,用户代理,撰写邮件,SMTP,报文发送队列中排队,TCP连接,SMTP,接收者的邮箱,POP3,IMAP,二、协议简介,二、常用的邮件协议,2.邮件访问协议3)HTTP基于Web的电子邮件,使用浏览器收发电子邮件。,浏览器,邮件服务器,邮件服务器,浏览器,撰写邮件,HTTP,报文发送队列中排队,TCP连接,SMTP,接收者的邮箱,HTTP,二、协议简介,二、常用的邮件协议,3.MIME协议MIME,Multipurpose Internet Mail Extensions and Secure MIME,多用途网际邮件扩充协议。MIME不是邮件传输协议,而是对邮件格式所做的规范。MIME说明了如何安排消息格式使消息在不同的邮件系统内进行交换。MIME 的格式灵活,允许邮件中包含任意类型的文件。MIME 消息可以包含文本、图象、声音、视频及其它应用程序的特定数据。,二、协议简介,二、常用的邮件协议,3.MIME协议邮件首部行,Client:From:Client:To:Subject:,报文首部之后紧接着一个空白行,然后是以ASCII格式表示的报文主体。SMTP要求每个报文都使用7位ASCII码,当报文中包含音频、视频等非ASCII码格式的报文时,需要使用MIME协议中定义的附加首部行。Content-TypeContent-Transfer-Encoding,三、环境配置,1.javaMail API:javamail-1_4_1.zip解压缩后,将其中的mail.jar复制到C:Program FilesJavajdk1.6.0_10jrelibext中2.JavaBeans Activation Framework:jaf-1_1_1.zip解压缩后,将其中的activation.jar复制到C:Program FilesJavajdk1.6.0_10jrelibext中3.MyEclipse中的配置打开Properties对话框-java Build path-Libraries选项卡。,1)所需的jar包及其在MyEclipse中的配置,三、环境配置,3.MyEclipse中的配置,1)所需的jar包及其在MyEclipse中的配置,三、环境配置,2)邮件服务器的安装,安装一个本地邮件服务器:merak配置本地邮件服务器merak,,安装过程按照默认的步骤安装即可安装到最后的步骤时,需要Hostname,Domain,Username和Password,填入如下信息:,例题-1配置本地邮件服务器merak,二、例题,Domain配置窗口:Hostname:Domain:Username:adminPassword:1234,三、环境配置,2)邮件服务器的安装,启动merak开始所有程序-IceWarp Merak Mail Server-Administration,三、环境配置,2)邮件服务器的安装,设置merakManagementUnknown Accouts选择Forward to(Cache-all),三、环境配置,2)邮件服务器的安装,2)邮件服务器的安装,例题-1设置merak,二、例题,这里改为imap,三、环境配置,例题-1更改虚拟SMTP的设置,不进行此项设置,可能会出现:SMTP server response:550 5.7.1 Unable to relay for 的错误,三、环境配置,2)邮件服务器的安装,四、小结和作业,小结1.准备实验四程序2.准备实验三程序,下周实验课抽查3.搭建JavaMail环境,