分布式系统实验指导书Word格式.docx
《分布式系统实验指导书Word格式.docx》由会员分享,可在线阅读,更多相关《分布式系统实验指导书Word格式.docx(13页珍藏版)》请在冰点文库上搜索。
Thread、Runnable;
4.实验前认真听讲,服从安排。
尽可能独立思考并完成实验。
实验环境
a)独立计算机或计算机网络;
b)Windows操作系统。
c)Jdk工具包
d)JCreatororothers
实验原理
1.分布式计算的核心是进程通信。
操作系统、网卡驱动程序等应用从不同抽象层面提供了对进程通信的支持,例如Winsock、.*。
SocketAPI是一种作为IPC提供对系统低层抽象的机制。
尽管应用人员很少需要在该层编写代码,但理解socketAPI非常重要,因为:
1,高层设施是构建于socketAPI之上的,即他们是利用socketAPI提供的操作来实现;
2,对于以响应时间要求较高或运行于有限资源平台上的应用来说,socketAPI可能是最适合的。
在Internet网络协议体系结构中,传输层上有UDP和TCP两种主要协议,UDP允许在传送层使用无连接通信传送,被传输报文称为数据包。
(是否存在面向连接的数据包socket?
)因此数据包socket是基于UDP的不可靠IPC。
Java为数据包socketAPI提供两个类:
(1)针对socket的datagramSocket类
(2)针对数据包交换的datagramPacket类
希望使用该API发送和接收数据的进程须实例化一个datagramSocket对象,每个socekt被绑定到该进程所在及其的某个UDP端口上。
为了向其他进程发送数据包,进程必须创建一个代表数据包本身的对象。
该对象通过实例化一个datagramsocket对象创建。
在接收者进程中,datagramPacket对象也必须被实例化并绑定到一个本地端口上,该端口必须与发送者数据包的定义一致。
接收进程创建一个指向字节数组的DatagramPacket,并调用datagramSocket对象的receive方法,将DatagramPacket对象指针作为参数定义。
2.并行编程(以Java为例)
一个线程是比进程更小的执行粒度。
Java虚拟机允许应用程序有多个执行线程同时运行。
有两种方法来创建一个新线程的执行。
一个是声明一个类是一个线程的子类。
这个子类应重写Thread类的run方法。
一个子类的实例可以被分配和启动。
另一种方法创建一个线程,并同时声明一个类实现了Runnable接口(这个类要实现run方法)。
一个类的实例可以被分配并作为参数传递给创建的线程,并启动线程。
例如:
◆创建一个类是Thread的子类:
classSomeThreadextendsThread{
SomeThread(){
}
publicvoidrun(){
...
SomeThreadp=newSomeThread();
p.start();
◆创建一个实现Runnable接口的类并传递给线程:
classSomeRunimplementsRunnable{
SomeRun(){
SomeRunp=newSomeRun(143);
newThread(p).start();
当一个实现Runnable接口的类被执行时,可以没有子类。
实例化一个Thread实例,并通过自身作为目标线程。
在大多数情况下,如果你只打算重写的run()方法,并没有其它的线程方法,应使用Runnable接口。
因为类不应该被继承,除非程序员有意修改或增强类的基本行为。
实验内容
1.构建客户端程序
(1)构建datagramSocket对象实例
(2)构建DatagramPacket对象实例,并包含接收者主机地址、接收端口号等信息
(3)调用datagramSocket对象实例的send方法,将DatagramPacket对象实例作为参数发送。
2.构建服务器端程序
(1)构建datagramSocket对象实例,指定接收的端口号。
(2)构建DatagramPacket对象实例,用于重组接收到的消息。
(3)调用datagramSocket对象实例大家receive方法,进行消息接收,并将DatagramPacket对象实例作为参数。
实验报告
1.客户端和服务器端程序的伪代码;
2.试验过程中的问题和解决途径;
3.上机完成P128-P130之5、6、7三题并填写实验报告。
(请参考第一章习题2)
思考题
1.如何避免数据包丢失而造成的无限等待问题?
2.如何实现全双工的数据包通信?
实验二流式socket应用
1.理解流式socket的原理
2.实现流式socket通信
3.预习实验指导书及教材的有关内容,了解流式socket的通信原理;
4.熟悉java环境和程序开发过程;
5.实验前认真听讲,服从安排。
a)独立计算机;
b)Windows操作系统;
SocketAPI是一种作为IPC提供低层抽象的机制。
在Internet网络协议体系结构中,传输层上有UDP和TCP两种主要协议,UDP允许使用无连接通信传送,被传输报文称为数据包。
而TCP则允许面向连接的可靠通信,这种IPC称为流式socket。
Java为流式socketAPI提供两类socket
(1)式用于连接的连接socket
(2)式用于数据交换的数据socket。
1.构建客户端程序和服务器端程序都需要的MystreamSocket类,定义继承自javaSocket的sendMessage和receiveMessage方法
2.构建客户端程序
(1)创建一个MyStreamsocket的实例对象,并将其指定接收服务器和端口号
(2)调用该socket的receiveMessage方法读取从服务器端获得的消息
3.构建服务器端程序
(1)构建连接socket实例,并与指定的端口号绑定,该连接socket随时侦听客户端的连接请求
(2)创建一个MyStreamsocket的实例对象
(3)调用MyStreamsocket的实例对象的sendMessage方法,进行消息反馈。
1.应用程序的结构图,说明程序之间的关系;
2.程序的伪代码。
1.如何实现全双工的流式socket通信?
2.如何实现安全socketAPI?
3.如何实现1对多的并发?
实验三客户/服务器应用开发
1.验证daytime和echo程序,
2.实现包socket支撑的C/S模式IPC机制
3.实现流式socket支撑的C/S模式IPC机制
预习与实验要求
1.预习实验指导书及教材的有关内容,了解daytime和echo要提供的具体服务内容;
2.复习包socket和流式socket的实现原理;
3.实验前认真听讲,服从安排。
C/S模式是主要的分布式应用范型,其设计的目的是提供网络服务。
网络服务指如daytime、telnet、ftp和WWW之类的允许网络用户共享资源的服务。
要构建C/S范型的应用就必须解决以下一些关键问题:
(1)如何通过会话实现多个用户的并发问题
(2)如何定义客户和服务器在服务会话期间必须遵守的协议
(3)服务定位问题
(4)进程间通信和事件同步问题:
语法、语义和响应
(5)数据表示问题
在解决了这些问题的基础上,C/S范型必须遵从3层结构的软件体系结构:
(1)表示层,提供与客户端进行交互的界面
(2)应用逻辑层,定义服务器和客户端要处理的主要事务的业务逻辑
(3)服务层,定义应用逻辑层所需要的底层支持技术,例如定义其IPC机制里的receive方法和send方法等。
1.构建用数据包socket实现的daytime客户端程序
(1)构建表示层程序DaytimeClient1.java
(2)构建应用逻辑层程序DaytimeHelper1.java
(3)构建服务层程序MyClientDatagramSocket.java
2.构建用数据包socket实现的daytime服务器端程序
(1)构建表示层和应用逻辑层程序DaytimeServer1.java
(2)构建服务层程序MyServerDatagramSocket.java
(3)构建服务层程序MyServerDatagramSocket.java所需要的下层程序DatagramMessage.java(它封装了客户端的消息和地址)
3.构建用流式socket实现的daytime应用程序包
4.构建用数据包socket实现的echo应用程序包
5.构建用流式socket实现的echo应用程序包
1.用数据包socket实现的daytime应用程序包的构架,列明各程序之间的关系;
2.用流式socket实现的daytime应用程序包的构架,列明各程序之间的关系;
3.用数据包socket实现的echo应用程序包的构架,列明各程序之间的关系;
4.用流式socket实现的echo应用程序包的构架,列明各程序之间的关系。
1.如何实现有状态服务器的状态信息的维护?
实验四RMIAPI
1.了解JavaRMI体系结构,
2.学会用RMIAPI开发C/S模式的应用程序
1.预习实验指导书及教材的有关内容,了解RMI技术原理;
2.实验前认真听讲,服从安排。
RMI技术是分布式对象范型的一个实例,是RPC技术的扩展。
在JavaRMI体系结构中,客户及服务器都提供三层抽象。
1.客户端体系结构
(1)stub层:
负责解释客户程序发出的远程方法调用;
然后将其转发到下一层
(2)远程引用层:
解释和管理客户发出的到远程服务对象的引用,并向下一层即传输层发起IPC操作,从而将方法调用传送给远程主机
(3)传输层:
基于TCP协议
2.服务器端体系结构
(1)skeleton层:
负责与客户端stub进行交互
管理源于客户端的远程引用,并将其转换成能被skeleton层理解的本地引用
与客户端体系结构一样,面向传输层。
1.开发服务器端软件
(1)为该应用的所有待生成文件创建一个目录
(2)在someInterface.java中定义远程服务器接口。
编译并修改程序,直到不再有任何语法错误
(3)SomeImpl.java中实现接口,编译并修改程序,直到不再有任何语法错误
(4)使用RMI编译器rmic处理实现类,生成远程对象的stub文件和skeleton文件
RmicSomeImpl
(5)创建对象服务器程序SomeServer.java,编译并修改程序,直到不再有任何语法错误
(6)激活对象服务器
javaSomeServer
2.开发客户端软件
(2)获取远程接口类文件的一个拷贝,使用javac编译,生成接口类文件
(3)获取接口实现stub文件SomeImpl_stub.class的一个拷贝
(4)开发客户程序SomeClient.java,编译程序,生成客户类
(5)激活客户
JavaSomeClient
1.RMI应用文件列表及放置情况
2.每个文件主要实现的功能和文件相互间的关系
3.每个文件的伪代码
4.试验运行情况和结果,在试验中遇到的问题和分析
思考题
1.如何使用RMI传递参数?
2.如何使得被动提供远程服务的服务器能够主动发起数据请求?
3.如何避免在多个客户端同时发起远程服务调用时产生不一致的情况?
实验五Internet应用
1.了解基于http协议的web应用的工作原理
2.了解构建基于web的分布式应用范型的主要技术和手段
1.预习实验指导书及教材的有关内容,了解http协议工作原理;
2.了解html和XML语言;
c)Tomcat
d)J2EE工具包
e)J2sdk工具包
基于http的web应用是分布式系统的另一个重要应用范型,与C/S模式不同的是B/S模式的应用没有独立的客户端软件,B/S模式中统一对服务器端响应进行解释的就只有浏览器。
因为浏览器的通用性的简单性,使得B/S应用中数据传递也不可能很复杂,因此就决定了它在应用层的支持协议只能是面向文本的http协议。
最初的http协议只能支持简单的静态页面(对象)的获得,但是随着网络应用的发展,提供与客户的接口,使得客户与服务器端的通信能够动态进行,并由此动态生成页面(对象)是必要的。
解决这一问题的主要手段是使用表单技术。
而保存与客户交互的结果也是必须的,解决的技术是cookie。
1.使用socketAPI实现简单的HTTP客户
(1)使用sendMessage方法发送符合http协议定义的消息给web服务器以获得想要的页面
(2)使用receiveMessage方法接收返回的页面源文件并显示。
2.使用隐式表单域传输会话状态数据
(1)编写客户端请求页面form.html
(2)编写form.html所触发的脚本hiddenform.c
(3)编写hiddform.cgi动态生成页面中触发的脚本hidden.form2.c
3.使用coolie传递状态数据
(1)编写请求页面cookie.html
(2)编写cookie.html所触发的脚本cookie.c
(3)编写由cookie.c动态生成页面中触发的脚本cookie2.c
1.列明文件清单
2.写明各文件的作用和文件间的关系
3.写出各文件的伪代码
1.考虑隐式表单域与cookie技术之间的区别
2.考虑cookie的安全性问题