1、实验七应用层网络编程浙江大学城市学院实验报告课程名称 计算机网络应用 实验项目名称 实验七 应用层网络编程(一) 实验成绩 指导老师(签名) 日期 2014-06-03 一. 实验目的和要求1. 通过实现使用Java应用层客户端和服务器来获得关于使用Java Socket网络编程的经验(SMTP、POP3)。二. 实验内容、原理及实验结果与分析1. SMTP编程(参考电子讲义“网络编程参考资料-应用层.pdf”及教材“第2章 Socket编程”)阅读 “网络编程参考资料-应用层.pdf”中 8.3.1部分,实现“SMTP客户机实现”的源代码(SMTPClientDemo.java),并在机器上
2、编译运行通过。(注:可输入城院SMTP邮件服务器或其他邮件服务器作为SMTP服务器)【程序源代码】SMTPClientDemo.javaimport java.io.*;import .*;import java.util.*;/ Chapter 8, Listing 1public class SMTPClientDemo protected int port = 25; protected String hostname = localhost; protected String from = ; protected String to = ; protected String subje
3、ct = ; protected String body = ; protected Socket socket; protected BufferedReader br; protected PrintWriter pw; / Constructs a new instance of the SMTP Client public SMTPClientDemo() throws Exception try getInput(); sendEmail(); catch (Exception e) System.out.println (Error sending message - + e);
4、public static void main(String args) throws Exception / Start the SMTP client, so it can send messages SMTPClientDemo client = new SMTPClientDemo(); / Check the SMTP response code for an error message protected int readResponseCode() throws Exception String line = br.readLine(); System.out.println(
5、+msg); / Close all readers, streams and sockets protected void closeConnection() throws Exception pw.flush(); pw.close(); br.close(); socket.close(); / Send the QUIT protocol message, and terminate connection protected void sendQuit() throws Exception System.out.println(Sending QUIT); writeMsg(QUIT)
6、; readResponseCode(); System.out.println(Closing Connection); closeConnection(); / Send an email message via SMTP, adhering to the protocol known as RFC 2821 protected void sendEmail() throws Exception System.out.println(Sending message now: Debug below); System.out.println(- + -); System.out.printl
7、n(Opening Socket); socket = new Socket(this.hostname,this.port); System.out.println(Creating Reader & Writer); br = new BufferedReader(new InputStreamReader(socket.getInputStream(); pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(); System.out.println(Reading first line); int code
8、 = readResponseCode(); if(code != 220) socket.close(); throw new Exception(Invalid SMTP Server); System.out.println(Sending helo command); writeMsg(HELO +InetAddress.getLocalHost().getHostName(); code = readResponseCode(); if(code != 250) sendQuit(); throw new Exception(Invalid SMTP Server); System.
9、out.println(Sending mail from command); writeMsg(MAIL FROM:); code = readResponseCode(); if(code != 250) sendQuit(); throw new Exception(Invalid from address); System.out.println(Sending rcpt to command); writeMsg(RCPT TO:); code = readResponseCode(); if(code != 250) sendQuit(); throw new Exception(
10、Invalid to address); System.out.println(Sending data command); writeMsg(DATA); code = readResponseCode(); if(code != 354) sendQuit(); throw new Exception(Data entry not accepted); System.out.println(Sending message); writeMsg(Subject: +this.subject); writeMsg(To: +this.to); writeMsg(From: +this.from
11、); writeMsg(); writeMsg(body); code = readResponseCode(); sendQuit(); if(code != 250) throw new Exception(Message may not have been sent correctly); else System.out.println(Message sent); / Obtain input from the user protected void getInput() throws Exception / Read input from user console String da
12、ta=null; BufferedReader br = new BufferedReader(new InputStreamReader(System.in); / Request hostname for SMTP server System.out.print(Please enter SMTP server hostname: ); data = br.readLine(); if (data = null | data.equals() hostname=localhost; else hostname=data; / Request the senders email addres
13、s System.out.print(Please enter FROM email address: ); data = br.readLine(); from = data; / Request the recipients email address System.out.print(Please enter TO email address :); data = br.readLine(); if(!(data = null | data.equals() to=data; System.out.print(Please enter subject: ); data = br.read
14、Line(); subject=data; System.out.println(Please enter plain-text message (. character + on a blank line signals end of message):); StringBuffer buffer = new StringBuffer(); / Read until user enters a . on a blank line String line = br.readLine(); while(line != null) / Check for a ., and only a ., on
15、 a line if(line.equalsIgnoreCase(.) break; buffer.append(line); buffer.append(n); line = br.readLine(); buffer.append(.n); body = buffer.toString(); 【实验结果与分析】2. POP3编程(参考电子讲义“网络编程参考资料-应用层.pdf”及教材“第2章 Socket编程”)阅读 “网络编程参考资料-应用层.pdf”中 8.3.2部分,实现“POP3客户实现”的源代码(Pop3ClientDemo.java),并在机器上编译运行通过。(注:可输入城院P
16、OP3邮件服务器或其他邮件服务器作为POP3服务器)【程序源代码】Pop3ClientDemo.javaimport java.io.*;import .*;import java.util.*;public class Pop3ClientDemo protected int port = 110; protected String hostname = localhost; protected String username = ; protected String password = ; protected Socket socket; protected BufferedReader
17、 br; protected PrintWriter pw; / Constructs a new instance of the POP3 client public Pop3ClientDemo() throws Exception try / Get user input getInput(); / Get mail messages displayEmails(); catch(Exception e) System.err.println (Error occured - details follow); e.printStackTrace(); System.out.println
18、(e.getMessage(); / Returns TRUE if POP response indicates success, FALSE if failure protected boolean responseIsOk() throws Exception String line = br.readLine(); System.out.println( +line); / 和 SMTP 不同的地方,POP3 的回覆不再是一个 number 而是 / +OK 来代表要求成功。失败则以 -ERR 来代表。 return line.toUpperCase().startsWith(+OK)
19、; / Reads a line from the POP server, and displays it to screen protected String readLine(boolean debug) throws Exception String line = br.readLine(); / Append a character to indicate this is a server protocol response if (debug) System.out.println( +msg); / Close all writers, streams and sockets pr
20、otected void closeConnection() throws Exception pw.flush(); pw.close(); br.close(); socket.close(); / Send the QUIT command, and close connection protected void sendQuit() throws Exception System.out.println(Sending QUIT); writeMsg(QUIT); readLine(true); System.out.println(Closing Connection); close
21、Connection(); / Display emails in a message protected void displayEmails() throws Exception BufferedReader userinput = new BufferedReader( new InputStreamReader (System.in) ); System.out.println(Displaying mailbox with protocol commands + and responses below); System.out.println(- + -); / Open a con
22、nection to POP3 server System.out.println(Opening Socket); socket = new Socket(this.hostname, this.port); br = new BufferedReader(new InputStreamReader(socket.getInputStream(); pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(); / If response from server is not okay if(! responseIs
23、Ok() socket.close(); throw new Exception(Invalid POP3 Server); / Login by sending USER and PASS commands System.out.println(Sending username); writeMsg(USER +this.username); if(!responseIsOk() sendQuit(); throw new Exception(Invalid username); System.out.println(Sending password); writeMsg(PASS +thi
24、s.password); if(!responseIsOk() sendQuit(); throw new Exception(Invalid password); / Get mail count from server . System.out.println(Checking mail); writeMsg(STAT); / . and parse for number of messages String line = readLine(true); StringTokenizer tokens = new StringTokenizer(line, ); / +OK tokens.n
25、extToken(); / number of messages int messages = Integer.parseInt(tokens.nextToken(); / size of all messages int maxsize = Integer.parseInt(tokens.nextToken(); if (messages = 0) System.out.println (There are no messages.); sendQuit(); return; System.out.println (There are + messages + messages.); Sys
26、tem.out.println(Press enter to continue.); userinput.readLine(); for(int i = 1; i = messages ; i+) System.out.println(Retrieving message number +i); writeMsg(RETR +i); System.out.println(-); line = readLine(false); while(line != null & !line.equals(.) line = readLine(false); System.out.println(-); S
27、ystem.out.println(Press enter to continue. To stop, + type Q then enter); String response = userinput.readLine(); if (response.toUpperCase().startsWith(Q) break; sendQuit(); public static void main(String args) throws Exception Pop3ClientDemo client = new Pop3ClientDemo(); / Read user input protected void getInput() throws Exception String data=null; BufferedReader br = new BufferedReader(new InputStreamReader(System.in); System.out.print(