阅读以下说明和Java程序代码,将应填入(n)处的字句写在答题纸的对应栏内。
(说明)
1.SMTP是发送E-mail的协议,常用以下5条命令发送E-mail:
·HELO<SP><domain><CRLF>,与SMTP服务器握手,传送本机域名;
·MAIL<SP>FROM:<reverse-path><CRLF>,传送发信者的信箱名称;
·RCPT<SP>TO:<forward-path><CRLF>,传送接收者的信箱名称;
·DATA<CRLF>,发送邮件数据(包括信头和信体);
·QUIT<CRLF>,退出与SMTP服务器的连接。
2.试题中直接利用的类及方法如下:(1)类ServerSocket(int port)实现TCP服务器接口(socket),它提供两种构造函数,用它们来指定服务器插口所用的端口,并监听到达的连接请求。类中的主要方法有:
accept( ):启动服务器插口监听并等待,直到建立连接为止,一旦建立连接就返回Socket类的一个对象。
getInetAddress( ):返回插口所连接的主机地址。
getLocaIPort( ):返回在服务器插口上建立了连接的端口。
close( ):关闭服务器插口。(2)类InetAddress包装了Internet地址。类中的主要方法有:
getLocaIHost( ):返回一个代表本机Internet地址的InetAddress对象。
getaddress( ):获得数字表示的IP地址。
getHostName( ):获得域名。(3)类Socket实现基于连接的客户插口。类中的主要方法有getInetAddress( ):返回一个与插口连接的客户机的Internet地址,其类型为InetAd-dress。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 SMTPServer App
{
public static void main(String args[ ])
{
SMTPServer server=new SMTPServer( );
server.run( );
}
}
class SMTPServer
{
static final int HELO=1;
static final int MAIL=2;
static final int RCPT=3;
static final int DATA=4;
static final int 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();//监听连接端口
hostNama= (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"+destNama+"on port"+destPort+".");
//控制台显示连接
out=new NVTOutputStream(client.getOutputStream());
in=new NVTInputStream( (5) ); //建立与连接关联的输入流(6) ;//接收邮件(7) ;//关闭连接对象
}while(!finished) ;
}catch (UnknownHostException ex) {
System.out.println("UnknownHostException occurred.");//出错处理
}cath(IOException ex) {
System.out.println ("IOException occurred.");
}
}
void getMail(){//实现SMTP的子集,从客户接收邮件
out.println("Server220"+hostName+"Ready!");
int state=HELO;//设置状态为HELO,state保存与客户通信的状态
do{//接收并处理从邮件客户接收到的命令
String line="";
out.println("Server 250 HELO,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 withCRLF.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.equalsIgnoreCase(line.substring(0,n)))return true;
return false;
}
}
[试题]阅读以下说明和Java程序代码,将应填入(n)处的字句写在答题纸的对应栏内。(说明)在下面的Java程序代码中,类SalesTicket能够完成打印票据正文的功能,类 HeadDecorator与FootDecorator分别能够完成打印票据的台头和脚注的功能。已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。这是票据的台头!这是票据正文!-------------------这是票据的脚注!这是票据的台头!这是票据的脚注!(tava程序代码)public class SalesTic
[试题]阅读以下说明和C++程序代码,将应填入(n)处的字句写在答题纸的对应栏内。(说明)在下面的C++代码中,类SalesTicket能够完成打印票据正文的功能,类HeadDec- orator与FootDecorator分别能够完成打印票据的台头和脚注的功能。已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。这是票据的台头!这是票据正文!这是票据的脚注!---------------这是票据的台头!这是票据的脚注!(C++程序代码)#includeusing namespace std;c
[试题]试题八(共15分)阅读以下说明和Java程序代码,将应填入(n) 处的字句写在答题纸的对应栏内。[说明]在下面的 Java 程序代码中,类SalesTicket 能够完成打印票据正文的功能,类HeadDecorator 与FootDecorator 分别完成打印票据的台头和脚注的功能。已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。这是票据的台头!这是票据正文!这是票据的脚注!------------------------这是票据的台头!这是票据的脚注![Java程序代码]publ
[试题]试题三阅读下列程序说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。(说明)下面的程序功能的功能是以行为单位对字符串按下面的条件进行排序。排序条件为:从字符串中间一分为二,右边部分按字符的ASCⅡ值降序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上例如:位置:0 1 2 3 4 5 6 7源字符串:h g f e a b c d则处理后字符串:d c b a h g f e函数ReadDat()实现从文件in.dat中读取数据(
[试题]试题三阅读下列说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。(说明)本题给出四个函数,它们的功能分别是:1.int push(PNODE *top,int e)是进栈函数,形参top是栈顶指针的指针,形参e是入栈元素。2.int pop(PNODE *top,int *e)是出栈函数,形参top是栈顶指针的指针,形参e作为返回出栈元素使用。3.int enQueue(PNODE *tail,int e)是入队函数,形参tail是队尾指针的指针,形参e是入队元素。4.int deQueu
[试题]试题六阅读以下说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。(说明)本题将有向网(带权有向图)定义为类AdjacencyWDigraph。类中的数据成员n表示有向网中的顶点数;a为带权邻接矩阵,用于存储有向网中每一对顶点间弧上的权值;c为二维数组,存储有向网中每一对顶点间的最短路径长度;kay为二维数组,存储最短路径,kay[i][j]=k表示顶点i 到达顶点j的最短路径必须经过顶点k。类中的主要成员函数有:Input():输入有向网的顶点数、各条弧及权值,建立带权领接矩阵a。若顶
[试题]试题二阅读以下说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。(说明)函数MultibaseOutput(long n,int B)的功能是:将一个无符号十进制整数n转换成B(2≤B≤16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把B进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C代码中的符号常量及栈的类型定义如下:#define MAXSIZE 32typedef struct{int *elem;/*栈的存储区*/int max; /*栈的容量
[试题]试题四阅读以下说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。(说明)将一正整数序列{K1,K2,…,K9}重新排列成一个新的序列,新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面),最后调用writeDat()函数的新序列输出到文件out.dat中。在程序中已给出了10个序列,每个序列有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。例:序列 {6,8,9,1,2,5,4,7,3}经重排后成为{3,4,5,2,1,6,8,9,7}(函数)
[试题]试题四阅读以下说明和C代码,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明]函数MultibaseOutput(long n, int B)的功能是:将一个无符号十进制整数n转换成B(2≤B≤16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把B进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C代码中的符号常量及栈的类型定义如下:#define MAXSIZE 32typedef struct {int *elem; /* 栈的存储区 */int max;
[试题]试题四阅读以下说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。(说明)该程序的功能是从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后把结果xx输出到文件OUT6.DAT中。例如:原文:You He MeI am a student.结果:Me He Youstudent a am I原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号