分布式系统实验报告.doc
《分布式系统实验报告.doc》由会员分享,可在线阅读,更多相关《分布式系统实验报告.doc(32页珍藏版)》请在冰豆网上搜索。
中南大学
分布式系统实验报告
目录
(我选做4题,按住ctrl点击目录条可直达,wps下有效)
实验一数据包socket应用 3
一、实验目的 3
二、预习与实验要求 3
三、实验环境 3
四、实验原理 4
五、实验内容 5
六、实验报告 5
七、思考题 7
实验二流式socket应用 8
一、实验目的 8
二、预习与实验要求 8
三、实验环境 8
四、实验原理 8
五、实验内容 8
六、实验报告 9
七、思考题 12
实验三客户/服务器应用开发 12
一、实验目的 12
二、预习与实验要求 12
三、实验环境 12
四、实验原理 12
五、实验内容 13
六、实验报告 13
实验九虚拟机的使用与Linux系统的安装 30
一、实验目的 30
二、实验内容和步骤 30
三、实验结果 32
实验一数据包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方法)。
一个类的实例可以
被分配并作为参数传递给创建的线程,并启动线程。
例如:
u创建一个类是Thread的子类:
classSomeThreadextendsThread{
SomeThread(){
}
publicvoidrun(){
...
}
}
SomeThreadp=newSomeThread();
p.start();
u创建一个实现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.客户端和服务器端程序的伪代码;
客户端:
importjava.io.IOException;
import.DatagramPacket;
import.DatagramSocket;
import.InetAddress;
importjava.util.Scanner;
publicclassClient{
publicstaticvoidmain(String[]args)throwsIOException
{
//创建一个客户端DatagramSocket,使用随机端口
DatagramSocketsocket=newDatagramSocket();
//初始化发送用的DatagramSocket,它包含一个长度为0的字节数组
DatagramPacketoutPacket=newDatagramPacket(newbyte[0],0
InetAddress.getByName("127.0.0.1"),30000);
//定义接收网络数据的字节数组
byte[]inBuff=newbyte[4096];
DatagramPacketinPacket=newDatagramPacket(inBuff,inBuff.length);
//创建键盘输入流
Scannerscan=newScanner(System.in);
//不断地读取键盘输入
while(scan.hasNextLine())
{
//将键盘输入的一行字符串转换成字节数组
byte[]buff=scan.nextLine().getBytes();
//设置发送用的DatagramPacket中的字节数据
outPacket.setData(buff);
//发送数据报
socket.send(outPacket);
//读取Socket中的数据,读到的数据放在inPacket所封装的字节数组中
socket.receive(inPacket);
System.out.println(newString(inBuff,0,inPacket.getLength()));
}
}
}
服务端:
importjava.io.IOException;
import.DatagramPacket;
import.DatagramSocket;
publicclassServices{
publicstaticvoidmain(String[]args)throwsIOException
{
//定义接收网络数据的字节数组
byte[]inBuff=newbyte[4096];
//创建DatagramSocket对象
DatagramSocketsocket=newDatagramSocket(30000);
//以指定字节数组创建准备接收数据的DatagramPacket对象
DatagramPacketinPacket=newDatagramPacket(inBuff,inBuff.length);
Stringmessage="消息已经收到!
";
while(true){
socket.receive(inPacket);
//将接收到的内容转换成字符串后输出
System.out.println(newString(inBuff,0,inPacket.getLength()));
//从字符串数组中取出一个元素作为发送数据
byte[]sendData=message.getBytes();
//以指定的字节数组作为发送数据,以刚接收到的DatagramPacket的
//源SocketAddress作为目标SocketAddress创建DatagramPacket
//定义一个用于发送的DatagramPacket对象
DatagramPacketoutPacket=newDatagramPacket(sendData