分布式系统实验报告.docx

上传人:b****3 文档编号:5488279 上传时间:2022-12-17 格式:DOCX 页数:32 大小:182.76KB
下载 相关 举报
分布式系统实验报告.docx_第1页
第1页 / 共32页
分布式系统实验报告.docx_第2页
第2页 / 共32页
分布式系统实验报告.docx_第3页
第3页 / 共32页
分布式系统实验报告.docx_第4页
第4页 / 共32页
分布式系统实验报告.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

分布式系统实验报告.docx

《分布式系统实验报告.docx》由会员分享,可在线阅读,更多相关《分布式系统实验报告.docx(32页珍藏版)》请在冰豆网上搜索。

分布式系统实验报告.docx

分布式系统实验报告

中南大学分布式系统实验报告

(我选做4题,按住Ctrl点击目录条可直达,wps下有效)

实验一数据包socket应用.4

一、实验目的.4

二、预习与实验要求.4

三、实验环境.4

四、实验原理.4

五、实验内容.6

六、实验报告.7

七、思考题.7

实验二流式soCket应用.8

一、实验目的.8

二、预习与实验要求.8

三、实验环境.8

四、实验原理.8

五、实验内容.9

六、实验报告.9

七、思考题.11

实验三客户/服务器应用开发.11

一、实验目的.11

二、预习与实验要求.11

三、实验环境.11

四、实验原理.12

五、实验内容.12

六、实验报告.13

实验九虚拟机的使用与Linux系统的安装.37

、实验目的.37

、实验内容和步骤.38

、实验结果.40

实验一数据包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

运行于有限资源平台上的应用来说,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对象实例作为参

(4)

数发送。

2.构建服务器端程序

(1)构建datagramSocket

对象实例,指定接收的端口号。

(2)

DatagramPacket对象实例作为参数。

六、实验报告

1.客户端和服务器端程序的伪代码;

客户端:

importclassClient{

publicstaticvoidmain(String[]args)throwsIOException

{

etBytes();

r:

!

SflrificM[Jm*0HUF)农虫n.MiMjiMi(30174MI911冃[

»KKUi■”*曰▼-”•r

kaiwanxiao

■1*砧•■匸整+四r

cwiz亞冃聊i川“严油百e弘1an_ioi.,b;jr4.霏沪*i汕“和冃口冃上牛n;丼:

憫尊己经戟到i

□KHS'9■XJt[血甬陽Ja

□St.申SI.谏了C-PrLHJ.duTtfl.lffl1(zoi■'ffij3

馆息巳经上到!

如何避免数据包丢失而造成的无限等待问题

答:

我认为可在发包时设定一个定时器,若发出去的包在一定时间内没有收到答应,则再发

一次。

为了避免接受者接到重复的包,可以给数据包加个序号,接受者收包时查看序号即可。

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类,定义继承自java

Socket

的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){

然后利用其提供

答:

服务端监听端口,每当有一个连接请求发来时,就与其建立新的连接,的功能进行通信。

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和WWV之类的允许网络用户共享资源的服务。

要构建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应用程序包的构架,列明各程序之间的关系;客户端:

DavlimcCJieniHclpcrl

MyChcntDuligram

/L

Socket

1-

q

i

i

!

1

彳■

Ditd^mmSucLct

IiiJi

rt3LVCMciMgc0

J

/■

服务端:

代码:

客户端:

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,String

message)

throwsIOException{

byte[]sendBuffer

();

DatagramPacketdatagram=newDatagramPacket(sendBuffer,,receiverHos

t,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{

new

MyServerDatagramSocketmySocket=MyServerDatagramSocket(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,String

message)

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应用程序包的构架,列明各程序之间的关系;客户端:

DaytimrCLicntHelpd^

%*u/

■h*

■*

MySdneamSackct

I

!

*f

4

\f

!

|f

R.m

f■»■v«»>!

■4»七nfln>

、h

1

1

1

V

Lh

■b

I

hh

1・

V1

r*

r■

t■

・■

JT

serdMeswiget)

I

1

*

L

*1i

声*

J\

feceiveMt^age()

*

服务端:

共有的:

 

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()throwsIOException{

Stringmessage=();

returnmessage;

}

}

客户端:

import.*;

publicclassDayt

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1