分布式系统实验报告.docx
- 文档编号:11665792
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:31
- 大小:1.09MB
分布式系统实验报告.docx
《分布式系统实验报告.docx》由会员分享,可在线阅读,更多相关《分布式系统实验报告.docx(31页珍藏版)》请在冰豆网上搜索。
分布式系统实验报告
中南大学
分布式系统实验报告
(我选做4题,按住ctrl点击目录条可直达,wps下有效)
实验一数据包socket应用
一、实验目的
1.理解数据包socket的应用
2.实现数据包socket通信
3.了解Java并行编程的基本方法
二、预习与实验要求
1.预习实验指导书及教材的有关内容,了解数据包socket的通信原理;
2.熟悉一种javaIDE和程序开发过程;
3.了解下列JavaAPI:
Thread、Runnable;
4.尽可能独立思考并完成实验。
三、实验环境
a)独立计算机或计算机网络;
b)Windows操作系统。
c)Jdk工具包
d)JCreatororothers
四、实验原理
1.分布式计算的核心是进程通信。
操作系统、网卡驱动程序等应用从不同抽象层面提供了对进程通信的支持,例如
Winsock、.*。
SocketAPI是一种作为IPC提供对系统低层抽象的机制。
尽管应用人
员很少需要在该层编写代码,但理解socketAPI非常重要,因为:
1,高层设施是构建于socket
API之上的,即他们是利用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为例1)
一个线程是比进程更小的执行粒度。
Java虚拟机允许应用程序有多个执行线程同时运
行。
有两种方法来创建一个新线程的执行。
一个是声明一个类是一个线程的子类。
这个子类
应重写Thread类的run方法。
一个子类的实例可以被分配和启动。
另一种方法创建一个线
程,并同时声明一个类实现了Runnable接口(这个类要实现run方法)。
一个类的实例可以
被分配并作为参数传递给创建的线程,并启动线程。
例如:
创建一个类是Thread的子类:
classSomeThreadextendsThread{
SomeThread(){
}
publicvoidrun(){
...
}
}
SomeThreadp=newSomeThread();
();
创建一个实现Runnable接口的类并传递给线程:
classSomeRunimplementsRunnable{
SomeRun(){
}
publicvoidrun(){
...
}
}
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.客户端和服务器端程序的伪代码;
客户端:
importclassClient{
publicstaticvoidmain(String[]args)throwsIOException
{
etBytes();
如何避免数据包丢失而造成的无限等待问题
答:
我认为可在发包时设定一个定时器,若发出去的包在一定时间内没有收到答应,则再发一次。
为了避免接受者接到重复的包,可以给数据包加个序号,接受者收包时查看序号即可。
2.如何实现全双工的数据包通信
答:
利用端口套接字之间的通信功能。
实验二流式socket应用
一、实验目的
1.理解流式socket的原理
2.实现流式socket通信
二、预习与实验要求
1.预习实验指导书及教材的有关内容,了解流式socket的通信原理;
2.熟悉java环境和程序开发过程;
3.尽可能独立思考并完成实验。
三、实验环境
a)独立计算机;
b)Windows操作系统;
c)Jdk工具包
四、实验原理
SocketAPI是一种作为IPC提供低层抽象的机制。
尽管应用人员很少需要在该层编写代
码,但理解socketAPI非常重要,因为:
1,高层设施是构建于socketAPI之上的,即他们
是利用socketAPI提供的操作来实现;2,对于以响应时间要求较高或运行于有限资源平台
上的应用来说,socketAPI可能是最适合的。
在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.程序的伪代码。
公用服务功能:
import.*;
import.*;
publicclassMystreamSocketextendsSocket{
privateSocketsocket;
privateBufferedReaderinput;
privatePrintWriteroutput;
ava:
importclassClient{
publicstaticvoidmain(Stringargs[]){
try{
InetAddresshostname=("localhost");
MystreamSocketmss=newMystreamSocket(hostname,12345);
("我是客户端,我请求连接!
");
();
}catch(IOExceptione){
tart();
}
}catch(IOExceptione){
如何实现全双工的流式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.实验前认真听讲,服从安排。
尽可能独立思考并完成实验。
三、实验环境
a)独立计算机;
b)Windows操作系统。
c)Jdk工具包
四、实验原理
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)构建表示层程序
(2)构建应用逻辑层程序
(3)构建服务层程序
2.构建用数据包socket实现的daytime服务器端程序
(1)构建表示层和应用逻辑层程序
(2)构建服务层程序
(3)构建服务层程序所需要的下层程序
(它封装了客户端的消息和地址)
3.构建用流式socket实现的daytime应用程序包
4.构建用数据包socket实现的echo应用程序包
5.构建用流式socket实现的echo应用程序包
六、实验报告
1.用数据包socket实现的daytime应用程序包的构架,列明各程序之间的关系;
客户端:
服务端:
代码:
客户端:
import.*;
publicclassDaytimeClient1{
publicstaticvoidmain(String[]args){
InputStreamReaderis=newInputStreamReader;
BufferedReaderbr=newBufferedReader(is);
try{
"WelcometotheDaytimeclient.\n"+
"Whatisthenameoftheserverhost");
StringhostName=();
if()==0)
hostName="localhost"; ;
publicclassDaytimeClientHelper1{
publicstaticStringgetTimestamp(StringhostName,StringportNum){
Stringtimestamp="";
try{
InetAddressserverHost=(hostName);
intserverPort=(portNum);
;
import.*;
publicclassMyClientDatagramSocketextendsDatagramSocket{
staticfinalintMAX_LEN=100;
MyClientDatagramSocket()throwsSocketException{
super();
}
MyClientDatagramSocket(intportNo)throwsSocketException{
super(portNo);
}
publicvoidsendMessage(InetAddressreceiverHost,intreceiverPort,Stringmessage)
throwsIOException{
byte[]sendBuffer=();
DatagramPacketdatagram=newDatagramPacket(sendBuffer,,
receiverHost,receiverPort);
(datagram);
}
publicStringreceiveMessage()
throwsIOException{
byte[]receiveBuffer=newbyte[MAX_LEN];
DatagramPacketdatagram=newDatagramPacket(receiveBuffer,MAX_LEN);
(datagram);
Stringmessage=newString(receiveBuffer);
returnmessage;
}
}
服务端:
import.*;
import
publicclassDaytimeServer1{
publicstaticvoidmain(String[]args){
intserverPort=13;
if==1)
serverPort=(args[0]);
try{
MyServerDatagramSocketmySocket=newMyServerDatagramSocket(serverPort);
"Daytimeserverready.");
while(true){
DatagramMessagerequest=();
"Requestreceived");
Datetimestamp=newDate();
"timestampsent:
"+());
(),
(),());
}
}
catch(Exceptionex){
"Thereisaproblem:
"+ex);
}
}
}
import.*;
import.*;
publicclassMyServerDatagramSocketextendsDatagramSocket{
staticfinalintMAX_LEN=100;
MyServerDatagramSocket(intportNo)throwsSocketException{
super(portNo);
}
publicvoidsendMessage(InetAddressreceiverHost,intreceiverPort,Stringmessage)
throwsIOException{
byte[]sendBuffer=();
DatagramPacketdatagram=
newDatagramPacket(sendBuffer,,receiverHost,receiverPort);
(datagram);
}
publicStringreceiveMessage()
throwsIOException{
byte[]receiveBuffer=newbyte[MAX_LEN];
DatagramPacketdatagram=newDatagramPacket(receiveBuffer,MAX_LEN);
(datagram);
Stringmessage=newString(receiveBuffer);
returnmessage;
}
publicDatagramMessagereceiveMessageAndSender()
throwsIOException{
byte[]receiveBuffer=newbyte[MAX_LEN];
DatagramPacketdatagram=newDatagramPacket(receiveBuffer,MAX_LEN);
(datagram);
DatagramMessagereturnVal=newDatagramMessage();
(newString(receiveBuffer),(),
());
returnreturnVal;
}}
import.*;
publicclassDatagramMessage{
privateStringmessage;
privateInetAddresssenderAddress;
privateintsenderPort;
publicvoidputVal(Stringmessage,InetAddressaddr,intport){
=message;
=addr;
=port;
}
publicStringgetMessage(){
return;
}
publicInetAddressgetAddress(){
return;
}
publicintgetPort(){
return;
}
}
2.用流式socket实现的daytime应用程序包的构架,列明各程序之间的关系;
客户端:
服务端:
共有的:
import.*;
import.*;
publicclassMyStreamSocketextendsSocket{
privateSocketsocket;
privateBufferedReaderinput;
privatePrintWriteroutput;
MyStreamSocket(InetAddressacceptorHost,
intacceptorPort)throwsSocketException,IOException{
socket=newSocket(acceptorHost,acceptorPort);
setStreams();
}
MyStreamSocket(Socketsocket)throwsIOException{
=socket;
setStreams();
}
privatevoidsetStreams()throwsIOException{
InputStreaminStream=();
input=newBufferedReader(newInputStreamReader(inStream));
OutputStreamoutStream=();
output=newPrintWriter(newOutputStreamWriter(outStream));
}
publicvoidsendMessage(Stringmessage)throwsIOException{
(message);
();
}
publicStringreceiveMessage()throwsI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分布式 系统 实验 报告