分布式系统实验报告Word文档下载推荐.docx
- 文档编号:18475778
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:32
- 大小:182.76KB
分布式系统实验报告Word文档下载推荐.docx
《分布式系统实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《分布式系统实验报告Word文档下载推荐.docx(32页珍藏版)》请在冰豆网上搜索。
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(){
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操作系统;
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.*;
publicclassMystreamSocketextendsSocket{
privateSocketsocket;
privateBufferedReaderinput;
privatePrintWriteroutput;
ava:
publicstaticvoidmain(Stringargs[]){
try{
InetAddresshostname=("
localhost"
);
MystreamSocketmss=newMystreamSocket(hostname,12345);
("
我是客户端,我请求连接!
"
();
}catch(IOExceptione){
tart();
然后利用其提供
服务端监听端口,每当有一个连接请求发来时,就与其建立新的连接,的功能进行通信。
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和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
1-
q
i
1
彳■
Ditd^mmSucLct
IiiJi
rt3LVCMciMgc0
J
/■
服务端:
代码:
客户端:
publicclassDaytimeClient1{
publicstaticvoidmain(String[]args){
InputStreamReaderis=newInputStreamReader;
BufferedReaderbr=newBufferedReader(is);
WelcometotheDaytimeclient.\n"
+
Whatisthenameoftheserverhost"
StringhostName=();
if()==0)
hostName="
;
;
publicclassDaytimeClientHelper1{publicstaticStringgetTimestamp(StringhostName,StringportNum){
Stringtimestamp="
try{
InetAddressserverHost=(hostName);
intserverPort=(portNum);
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);
Stringmessage=newString(receiveBuffer);
returnmessage;
服务端:
import
publicclassDaytimeServer1{
publicstaticvoidmain(String[]args){
intserverPort=13;
if==1)
serverPort=(args[0]);
new
MyServerDatagramSocketmySocket=MyServerDatagramSocket(serverPort);
Daytimeserverready."
while(true){
DatagramMessagerequest=();
Requestreceived"
Datetimestamp=newDate();
timestampsent:
"
+());
(),
(),());
catch(Exceptionex){
Thereisaproblem:
+ex);
publicclassMyServerDatagramSocketextendsDatagramSocket{staticfinalintMAX_LEN=100;
MyServerDatagramSocket(intportNo)throwsSocketException{super(portNo);
DatagramPacketdatagram=
newDatagramPacket(sendBuffer,,receiverHost,receiverPort);
byte[]receiveBuffer=newbyte[MAX_LEN];
publicDatagramMessagereceiveMessageAndSender()
DatagramMessagereturnVal=newDatagramMessage();
(newString(receiveBuffer),(),
());
returnreturnVal;
}}
publicclassDatagramMessage{
privateStringmessage;
privateInetAddresssenderAddress;
privateintsenderPort;
publicvoidputVal(Stringmessage,InetAddressaddr,intport){
=message;
=addr;
=port;
publicStringgetMessage(){
return;
publicInetAddressgetAddress(){
publicintgetPort(){
2.用流式socket实现的daytime应用程序包的构架,列明各程序之间的关系;
■
DaytimrCLicntHelpd^
%*u/
■h*
■*
MySdneamSackct
I
*f
4
\f
!
|f
R.m
f■»
■v«
»
>
■4»
七nfln>
、h
V
Lh
■b
hh
1・
V1
r*
r■
t■
・■
JT
serdMeswiget)
•
*
L
*1i
声*
J\
feceiveMt^age()
共有的:
publicclassMyStreamSocketextendsSocket{
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=();
publicclassDayt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分布式 系统 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)