冯泽正网络应用程序设计实验报告_第1页
冯泽正网络应用程序设计实验报告_第2页
冯泽正网络应用程序设计实验报告_第3页
冯泽正网络应用程序设计实验报告_第4页
冯泽正网络应用程序设计实验报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程 序 实 践 报 告(网络应用程序设计)姓 名冯泽正学 号20134620班 级软英1301指 导 教 师刘老师程序实践名称网络应用程序设计实践程序实践内容网络应用程序设计开 设 学 期2014-2015第二学期开 设 时 间第5周第6周报告日期2015.4.18评 定 成 绩评定人签字评 定 日 期东北大学软件学院网络应用程序设计实践 1. 实践目的l (1) 通过查看HTTP协议的RFC文档,理解并掌握HTTP协议,线程和进程的区别,分布式系统的基本概念,RMI工作原理,加深理解Web的工作原理;l (2) 掌握网络应用程序的开发方法;Socket机制的工作原理;布式系统应用程序的开发方

2、法;l (3) 能够用Java语言编写简单的HTTP 1.0客户端和服务器端的程序; 能够用Java语言多线程机制,编写多线程服务器端的程序;能够用Java语言RMI机制,编写RMI程序。2. 预习内容 l (1) TCP/IP协议栈;l (2) Web技术相关知识和HTTP协议;l (3) Java的网络编程相关知识;l (4) 网络应用程序的开发方法;l (5) Socket机制;l (6) Java多线程编程相关知识;l (7) RMI机制;3. 实践内容和实践过程1. 编写简单的HTTP 1.0 客户端程序;编写简单的HTTP 1.0 服务器程序;(1) 实践内容: 对比HTTP1.0

3、与HTTP1.1的差异要求:利用网络资源查询HTTP协议的RFC文档,并分析和归纳HTTP1.0与HTTP1.1的差异;编写简单的HTTP 1.0 客户端程序要求:通过命令行接口构建简单的HTTP1.0客户端程序命令行要求能够带一个唯一的表示服务器域名的参数(例如);简单的HTTP1.0客户端程序要求能够和Internet上的Web服务器建立TCP连接;Internet上的Web服务器能够处理使用该客户端程序发送的简单请求(例如HTTP的GET请求);简单的HTTP1.0客户端程序能够接受服务器响应,在命令行上显示出服务器的应答头部,把服务器的应答内容保存在一个文件中。编写简单的HTTP 1.

4、0 服务器程序要求:构建端口为8000的简单HTTP1.0服务器程序;该服务器能够对所有的请求(不论是否合法)都给予应答,其中要求对HTTP的GET方法根据RFC规定给予成功的响应;在任何情况下,服务器都要能够提供服务;通过给命令行传递参数指定服务器的默认访问目录(例如把c:www作为命令行参数传递给服务器,那么如果客户发送请求GET /test/index.html,那么服务器应该把文件C:wwwtestindex.html发送给客户端,如果文件不存在应该提示出错);(可选)服务器在成功地给予响应的同时,应该能够根据文件的扩展名,推断出至少2种文件的MIME类型(例如如果文件的扩展名为.ht

5、m 或者.html,那么文件的MIME类型为text/html);服务器能够响应嵌入JPEG文件的HTML页面;能够通过Netscape or Internet Explorer浏览器访问HTTP1.0服务器中存放的Web页;(2) 实现过程客户端:构建Socket服务器端:构建ServerSocket通过Socket连接服务器构建Socket接收客户端连接发送请求报文分析请求报文并返回响应报文接收响应报文并处理Socket断开关闭连接(3) 关键技术accept()等待客户端与服务器连接private static String basePath=”"本机地址URLDecoder.

6、decode()转换格式InputStream getInputStream()返回输入流,实现从套接字读取信息OutputStream getOutputStream()返回输出流实现套接字写入信息getLocalPort()返回建立与客户端连接的端口号Public void close()关闭服务器端ServerSocket对象1、客户端:public void run()Socket socket;BufferedInputStream in;PrintWriter out;trysocket = new Socket(addr, port);System.out.println(&qu

7、ot;连接" +socket.getRemoteSocketAddress() + "搞定");in = new BufferedInputStream(socket.getInputStream();out = new PrintWriter(socket.getOutputStream(), true);BufferedReader stdIn = new BufferedReader(newInputStreamReader(System.in);System.out.println("请输入您要获取的资源文件名:");String in

8、put = stdIn.readLine();if (input = null)input = "index.html"while (input != null) if (input.equalsIgnoreCase("exit")System.out.println("断开" + socket.getRemoteSocketAddress()+ "连接");in.close();out.close();socket.close();System.exit(0);System.out.println("G

9、ET /" + input + "HTTP/1.0rn");out.print("GET /" + input + " HTTP/1.0rn");out.println("Host: " + addr);out.println("User-agent: Mozilla/5.0");out.println("Accept: */*");out.println("Accept-language: zh-CN");out.println("C

10、onnection: close");out.print("rn");/ 通过写入行分隔符字符串终止当前行out.flush();2:服务器public void Service(File file, Socket socket ,String type) throws IOExceptionString contentType = type;PrintWriter out = new PrintWriter(socket.getOutputStream(), true);out.print("HTTP/1.0 200 OKrn");out.p

11、rint("Server: Jerrod_Feng serverrn");out.print("Date: " + DateFormat.getDateInstance().format(new Date()+ "rn");out.print("Content-Type: "+ contentType +"rn");out.print("Content-Length: " + file.length() + "rn");out.print("rn

12、");out.flush();DataInputStream input = new DataInputStream(new FileInputStream(file);DataOutputStream output = new DataOutputStream(socket.getOutputStream();byte data = new byte(int) file.length();input.readFully(data);output.write(data, 0, (int) file.length();output.flush();input.close();out.c

13、lose();output.close();(4) 遇到的问题及解决方案用浏览器访问简单的HTTP1.0服务器程序时,无法显示图片以及部分中文乱码解决方案:将HTTP1.0服务器程序所有的输出流全部改为字节输出流,而不是字符输出流。浏览器无法解析简单HTTP1.0服务器程序返回的响应。解决方案:观察发现响应报文头部在响应实体后到达浏览器,故浏览器无法正确解析响应,所以在简单HTTP1.0服务器程序中在响应报文的响应头部后flush()一下,以保证响应头部先到达浏览器。2. 编写多线程Web服务器;(1) 实践内容编写简单的多线程HTTP 1.0 服务器程序实验4中HTTP 1.0 服务器程序要

14、求:构建端口为8000的简单HTTP1.0服务器程序;该服务器能够对所有的请求(不论是否合法)都给予应答,其中要求对HTTP的GET方法根据RFC规定给予成功的响应;在任何情况下,服务器都要能够提供服务;通过给命令行传递参数指定服务器的默认访问目录(例如把c:www作为命令行参数传递给服务器,那么如果客户发送请求GET /test/index.html,那么服务器应该把文件C:wwwtestindex.html发送给客户端,如果文件不存在应该提示出错);(可选)服务器在成功地给予响应的同时,应该能够根据文件的扩展名,推断出至少2种文件的MIME类型(例如如果文件的扩展名为.htm 或者.htm

15、l,那么文件的MIME类型为text/html);服务器能够响应嵌入JPEG文件的HTML页面;能够通过Netscape or Internet Explorer浏览器访问HTTP1.0服务器中存放的Web页;修改简单HTTP1.0服务器程序,将服务器转换成多线程服务器,使服务器能够同时处理多个客户请求。(2) 实现过程子线程1处理后返回客户端服务器端:接收客户端连接请求,并交给子线程处理,主线程继续等待客户端连接请求客户端1连接请求子线程2处理后返回客户端客户端2连接请求子线程3处理后返回客户端客户端3连接请求(3) 关键技术class MyThread extends ThreadSock

16、et client;private static String basePath = ""private static int count;public MyThread(Socket client) this.client = client;count+;public void run()while (true) Socket client = null;/ 客户端SocketMyThread t1 = null;client = threadedServer.serverSocket.accept();/ 客户已经连接到当前服务器t1 = new MyThread(cl

17、ient);t1.start();(4) 遇到的问题及解决方案不断的新线程创建,停不下来。解决方案:原因是线程类的run()方法中加了while(true)循环,实际上这个循环应该加在主线程中,使服务器一直运行,用来接收多个客户端的连接请求,而交付给子线程处理,只需执行一次即可。3. 编写RMI程序;(1) 实践内容编写RMI程序用RMI构建一个分布式共享会议议程服务。不同的客户应该能够使用共享会议议程服务,该服务提供会议的查询、增加和删除功能。会议议程服务器有允许用户注册和撤销会议的功能。用户注册功能:新的用户必须注册,注册时必须提供一个用户名和一个密码。如果新用户提供的用户名已经被其他人使

18、用了,要求提示一个出错信息。如果新用户注册成功,也要输出一个提示信息。register username password增加会议:注册用户可以在他自己的会议议程上增加会议。会议必须在两个注册用户之间召开。一个注册用户如果没有其他可用的注册用户将不能召开会议。增加会议时,需要提供会议的开始和结束时间、会议的标注、召开会议的用户名称。会议增加后,该会议要在增加会议的用户的会议议程中显示,同时要在另一个参加会议的用户的会议议程中显示。如果一个用户已有的会议和新增的会议冲突,应该提示出错信息,同时该会议将不能被增加到会议议程中。不管会议能否被增加,程序都要给用户提示信息。add username p

19、assword otherusername start end title 查询会议:注册的用户如果给定一个时间间隔可以查询自己在某个时间段的会议议程上的所有会议(既包括注册用户召开的会议,也包括注册用户被邀请参加的会议)。查询会议提供的参数包括查询时间段的起始和结束时间。查询结束后,输出在特定时间段内所有会议实体列表。该列表包括会议的开始时间、结束时间、会议的标注、召开会议的用户的名字。query username password start end 删除会议:注册用户可以删除已经创建的会议。删除会议应该提供的参数包含删除会议的执行用户和唯一能够标识会议的标识符。delete userna

20、me password meetingid清除会议:注册用户清除自己召开的所有的会议。clear username password(2) 实现过程registry客户端1连接请求调用服务对象通过loopup服务注册服务器:提供RMI服务远程服务(3) 关键技术1、 服务器端:public class MeetingServerprivate static int PORT= 9000;public static void main(String args) throws MalformedURLException,RemoteException, NotBoundExceptionSyste

21、m.out.println("运行RMI服务!");try/ 建立服务对象,并与名绑定RMIMeetingImpl service = new RMIMeetingImpl(); / 构建服务对象serviceString registry = "localhost"String registration = "rmi:/" + registry + ":" + PORT+ "/RMIMeeting"System.out.println(registration);Naming.rebind(r

22、egistration, service);System.out.println("RMIMeeting已经成功启动!");catch (Exception e) System.err.println(e);2、 客户端:public static void main(String args)client = new RMIClient();String registry = "localhost"if (args.length >= 1) registry = args0;String registration = "rmi:/&quo

23、t; + registry + ":9000" + "/RMIMeeting"tryservice = (RMIMeeting) Naming.lookup(registration); / 得到service远程对象的远程引用System.out.println("成功连接上服务器!");catch (NumberFormatException e1) e1.printStackTrace();catch (MalformedURLException e1) e1.printStackTrace();catch (RemoteException e1) System.out.println("连接服务器失败!");e1.printStackTrace();catch (NotBoundException e1) e1.pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论