填空题 【说明】
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、
【正确答案】 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)    
【答案解析】