填空题
【说明】 1.SMTP是发送E-Mail的协议,常用以下5条命令发送E-Mail。 ●HEELO<SP><domain><CRLF>,与SMTP服务器握手,传送本机域名。 ●MAIL<SP>FROM:<reverse-path><CRLF>,传送发信者的信箱名称。 ●RCPT<SP>TO:<forward-path><CRLF>,传送接收者的信箱名称。 ●DATA<CRLF>,发送邮件数据e包括信头和信体)。 ●QUIT<CRLF>,退出与SMTP服务器的连接。 2.试题中直接利用的类及方法如下: 1)类ServerSocket(intport)实现TCP服务器插口(socket),它提供两种构造函数,用它们来指定服务器插口所用的端口,并监听到达的连接请求。类中的主要方法有: accept():启动服务器插口监听并等待,直到建立连接为止,一旦建立连接就返回Socket类的一个对象。 getInetAddress():返回插口所连接的主机地址。 getLocalPort():返回在服务器插口上建立了连接的端口。 close():关闭服务器插口。 2)类InetAddress包装了Internet地址。类中的主要方法有: getLocalHost():返回一个代表本机Internet地址的InetAddress对象。 getaddress():获得数字表示的IP地址。 getHostName():获得域名。 3)类Socket实现基于连接的客户插口。类中的主要方法有: getInetAddress():返回一个与插口连接的客户机的Internet地址,其类型为InetAddress。 getInputStream():用来访问与插口相关的输入流。 getOutputStream():用来访问与插口相关的输出流。 close():关闭插口。 4)readLine()是输入流类的一个方法,用于服务器或客户从对方读入一行输入流信息。 5)用户自定义类NVTInputStream(InputStream inStream,OutputStream outStream)实现了网络虚拟终端输入接口。 6)用户自定义类NVTOutputStream(OutputStream,outStream)实现了网络虚拟终端输出接口。 3.下面是用Java语言实现的一个简单SMTP服务器程序的部分代码。 【程序代码】 import java.net. *; import java.io. *; import jdg.yan. NVTInputStream; //用户自定义类包 import jdg.yan. NVTOutputStream; //用户自定义类包 public class SMTPServerApp public static void main(String args[] ) SMTPServer server = new $ MTPServer0; server, run 0; class SMTPServer static final int HELO = 1; static final int MAIL = 2; static final int RCPT = 3; static final int DATA = 4; static final iht END DATA = 5; static final int QUIT = 6; static final int FINISHED = 9; NVTOutputStream out; NVTInputStream in; String hostName; public SMTPServer( ) super( ); public void run( ) try ServerSocket server= (1) ;//在1145号端口建立TCP服务器插口 int localPort=server,getLocalPort();//监听连接端口 hostName= (2) ;//获取本地主机域名 System.out.println("listening on port"+localPort+"."); boolean finished=false; do Socket client= (3) ; //监听等待,直到建立连接,返回对象client String destName= (4) ;//获得所连接的客户主机IP地址的域名 int destPort=client,getPort();//所连接的客户主机端口号 System.Out.println("Accepted connection to"+destName+"on port"+destPort+"." //控制台显示连接 out=new NVTOutputStream(Client.getOutputStream()); in=new NVTInputStream( (5) ); //建立与连接关联的输入流 (6) ; //接收邮件 (7) ; //关闭连接对象 while(! finished); catch(UnknownHostException ex) system.out.println(*UnknownHostException occurred."); //出错处理 catch(IOException ex) System.out.println("IOException occurred."); void getMail() //实现SMTP的子集,从客户接收邮件 out.println("Server 220"+hostName+"Ready!"); int state=HELO;//设置状态为HELO,state保存与客户通信的状态 do //接收并处理从邮件客户接收到的命令 String line=" "; out.println("Server 250HELO,OK!"); try line= (8) ;//从虚拟终端读取一行 if(line==null)state=FINISHED; catch(IOException ex) System.out.println("Server IOException occurred."); System.exit(1) switch(state) case HELO: if( (9) ) //若该行信息为传送本机域名 out.println("Server 250 Hello"): System.out.println(line); state=MAIL; else out.println("Server 500 ERROR"); System.out.println(* Server*+line); state:FINISHED; break: case MAIL: //代码省略 case RCPT: //代码省略 case DATA: if( (10) ) //若该行信息为发送邮件数据 out.println("354 mail input:end with<CRLF>.<CRLF>"); System.out.println(line); state=END_DATA; else out.println(* 500 ERROR *); System.out.println(line); break; case END DATA: //代码省略 case QUIT: //代码省略 while(state!=FINISHED); //判断客户收到的命令是否与指定的命令字符串匹配 boolean commandIs (String s,String line) int n=s.length(); if(s.equaisIgnoreCase(line.substring(0,n)))return true; return false;
【正确答案】
1、{{*HTML*}}(1) new ServerSocket (1145) (2) InetAddress.getLocalHost().getHostName( ) (3) server.accept ( ) (4) client.getInetAddress().getHostName( ) (5) client.getInputStream( ),out (6) getMail() (7) client.close( ) (8) in.readLine( ) (9) commandIs("HELO", line) (10) commandIs("DATA",line)
【答案解析】
提交答案
关闭