ImageVerifierCode 换一换
格式:DOCX , 页数:38 ,大小:1.09MB ,
资源ID:4803564      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4803564.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(分布式系统实验报告.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

分布式系统实验报告.docx

1、分布式系统实验报告分布式系统实验报告中南大学分布式系统实验报告(我选做 4 题,按住ctrl点击目录条可直达,wps下有效)实验一 数据包 socket 应用一、实验目的1. 理解数据包 socket 的应用2. 实现数据包 socket 通信3. 了解 Java 并行编程的基本方法二、预习与实验要求1. 预习实验指导书及教材的有关内容,了解数据包 socket 的通信原理;2. 熟悉一种 java IDE 和程序开发过程;3. 了解下列 Java API:Thread、Runnable;4. 尽可能独立思考并完成实验。三、实验环境a) 独立计算机或计算机网络;b) Windows 操作系统。

2、c) Jdk 工具包d) JCreator or others四、实验原理1. 分布式计算的核心是进程通信。操作系统、网卡驱动程序等应用从不同抽象层面提供了对进程通信的支持,例如Winsock、.*。Socket API 是一种作为 IPC 提供对系统低层抽象的机制。尽管应用人员很少需要在该层编写代码,但理解 socket API 非常重要,因为:1,高层设施是构建于 socketAPI 之上的,即他们是利用 socket API 提供的操作来实现;2,对于以响应时间要求较高或运行于有限资源平台上的应用来说,socket API 可能是最适合的。在 Internet 网络协议体系结构中,传输层

3、上有 UDP 和 TCP 两种主要协议,UDP 允许在传送层使用无连接通信传送,被传输报文称为数据包。(是否存在面向连接的数据包socket?)因此数据包 socket 是基于 UDP 的不可靠 IPC。Java 为数据包 socket API 提供两个类:(1)针对 socket 的 datagramSocket 类(2)针对数据包交换的 datagramPacket 类希望使用该 API 发送和接收数据的进程须实例化一个 datagramSocket 对象,每个 socekt被绑定到该进程所在及其的某个 UDP 端口上。为了向其他进程发送数据包,进程必须创建一个代表数据包本身的对象。该对象

4、通过实例化一个 datagram socket 对象创建。在接收者进程中,datagramPacket 对象也必须被实例化并绑定到一个本地端口上,该端口必须与发送者数据包的定义一致。接收进程创建一个指向字节数组的 DatagramPacket,并调用 datagramSocket 对象的 receive 方法,将 DatagramPacket 对象指针作为参数定义。2. 并行编程(以 Java 为例 1 )一个线程是比进程更小的执行粒度。 Java 虚拟机允许应用程序有多个执行线程同时运行。有两种方法来创建一个新线程的执行。一个是声明一个类是一个线程的子类。这个子类应重写 Thread 类的

5、run 方法。一个子类的实例可以被分配和启动。另一种方法创建一个线程,并同时声明一个类实现了 Runnable 接口(这个类要实现 run 方法)。一个类的实例可以被分配并作为参数传递给创建的线程,并启动线程。例如:u 创建一个类是 Thread 的子类:class SomeThread extends Thread SomeThread() public void run() . . .SomeThread p = new SomeThread();p.start();u 创建一个实现 Runnable 接口的类并传递给线程:class SomeRun implements Runnable

6、 SomeRun() public void run() . . .SomeRun p = new SomeRun(143);new Thread(p).start();当一个实现 Runnable 接口的类被执行时,可以没有子类。实例化一个 Thread 实例,并通过自身作为目标线程。在大多数情况下,如果你只打算重写的 run()方法,并没有其它的线程方法,应使用 Runnable 接口。因为类不应该被继承,除非程序员有意修改或增强类的基本行为。五、实验内容1. 构建客户端程序(1) 构建 datagramSocket 对象实例(2) 构建 DatagramPacket 对象实例,并包含接收

7、者主机地址、接收端口号等信息(3) 调用 datagramSocket 对象实例的 send 方法,将 DatagramPacket 对象实例作为参数发送。2. 构建服务器端程序(1) 构建 datagramSocket 对象实例,指定接收的端口号。(2) 构建 DatagramPacket 对象实例,用于重组接收到的消息。(3) 调用 datagramSocket 对象实例大家 receive 方法,进行消息接收,并将DatagramPacket 对象实例作为参数。六、实验报告1. 客户端和服务器端程序的伪代码;客户端:import java.io.IOException;import .D

8、atagramPacket;import .DatagramSocket;import .InetAddress;import java.util.Scanner;public class Client public static void main(String args) throws IOException / 创建一个客户端DatagramSocket,使用随机端口 DatagramSocket socket = new DatagramSocket(); / 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组 DatagramPacket outPacket =

9、 new DatagramPacket(new byte0 , 0 , InetAddress.getByName(127.0.0.1) , 30000); / 定义接收网络数据的字节数组 byte inBuff = new byte4096; DatagramPacket inPacket =new DatagramPacket(inBuff , inBuff.length); / 创建键盘输入流 Scanner scan = new Scanner(System.in); / 不断地读取键盘输入 while(scan.hasNextLine() / 将键盘输入的一行字符串转换成字节数组 b

10、yte buff = scan.nextLine().getBytes(); / 设置发送用的DatagramPacket中的字节数据 outPacket.setData(buff); / 发送数据报 socket.send(outPacket); / 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组中 socket.receive(inPacket); System.out.println(new String(inBuff , 0 , inPacket.getLength(); 服务端:import java.io.IOException;import .Datag

11、ramPacket;import .DatagramSocket;public class Services public static void main(String args) throws IOException / 定义接收网络数据的字节数组 byte inBuff = new byte4096; / 创建DatagramSocket对象 DatagramSocket socket = new DatagramSocket(30000); / 以指定字节数组创建准备接收数据的DatagramPacket对象 DatagramPacket inPacket = new Datagram

12、Packet(inBuff , inBuff.length); String message=消息已经收到!; while(true) socket.receive(inPacket); / 将接收到的内容转换成字符串后输出 System.out.println(new String(inBuff, 0 , inPacket.getLength(); / 从字符串数组中取出一个元素作为发送数据 byte sendData = message.getBytes(); / 以指定的字节数组作为发送数据,以刚接收到的DatagramPacket的 / 源SocketAddress作为目标Socket

13、Address创建DatagramPacket / 定义一个用于发送的DatagramPacket对象 DatagramPacket outPacket= new DatagramPacket(sendData , sendData.length , inPacket.getSocketAddress(); / 发送数据 socket.send(outPacket); 2. 试验过程中的问题和解决途径;问题:对于DatagramPacket、DatagramSocket不怎么了解解决途径:查阅JDK api文档3. 实验结果:服务端:客户端1:客户端2:七、思考题1. 如何避免数据包丢失而造成

14、的无限等待问题?答:我认为可在发包时设定一个定时器,若发出去的包在一定时间内没有收到答应,则再发一次。为了避免接受者接到重复的包,可以给数据包加个序号,接受者收包时查看序号即可。2. 如何实现全双工的数据包通信?答:利用端口套接字之间的通信功能。实验二 流式 socket 应用一、实验目的1. 理解流式 socket 的原理2. 实现流式 socket 通信二、预习与实验要求1. 预习实验指导书及教材的有关内容,了解流式 socket 的通信原理;2. 熟悉 java 环境和程序开发过程;3. 尽可能独立思考并完成实验。三、实验环境a) 独立计算机;b) Windows 操作系统;c) Jdk

15、 工具包四、实验原理Socket API 是一种作为 IPC 提供低层抽象的机制。尽管应用人员很少需要在该层编写代码,但理解 socket API 非常重要,因为:1,高层设施是构建于 socket API 之上的,即他们是利用 socket API 提供的操作来实现;2,对于以响应时间要求较高或运行于有限资源平台上的应用来说,socket API 可能是最适合的。在 Internet 网络协议体系结构中,传输层上有 UDP 和 TCP 两种主要协议,UDP 允许使用无连接通信传送,被传输报文称为数据包。而 TCP 则允许面向连接的可靠通信,这种 IPC称为流式 socket。Java 为流式

16、 socket API 提供两类 socket(1)式用于连接的连接 socket(2)式用于数据交换的数据 socket。五、实验内容1. 构建客户端程序和服务器端程序都需要的 MystreamSocket 类,定义继承自 java Socket的 sendMessage 和 receiveMessage 方法2. 构建客户端程序(1) 创建一个 MyStreamsocket 的实例对象,并将其指定接收服务器和端口号(2) 调用该 socket 的 receiveMessage 方法读取从服务器端获得的消息3. 构建服务器端程序(1) 构建连接 socket 实例,并与指定的端口号绑定,该连

17、接 socket 随时侦听客户端的连接请求(2) 创建一个 MyStreamsocket 的实例对象(3) 调用 MyStreamsocket 的实例对象的 sendMessage 方法,进行消息反馈。六、实验报告1. 应用程序的结构图,说明程序之间的关系;2. 程序的伪代码。公用服务功能MystreamSocket.java:import .*;import java.io.*;public class MystreamSocket extends Socket private Socket socket; private BufferedReader input; private Prin

18、tWriter output; /客户端的构造方法 MystreamSocket(InetAddress acceptorHost, int acceptorPort ) throws SocketException, IOException socket = new Socket(acceptorHost, acceptorPort ); setStreams(); /服务端的构造方法 MystreamSocket(Socket socket) throws IOException this.socket = socket; setStreams(); /设置输出输入流 private vo

19、id setStreams() throws IOException InputStream inStream = socket.getInputStream(); input = new BufferedReader(new InputStreamReader(inStream); OutputStream outStream = socket.getOutputStream(); output = new PrintWriter(new OutputStreamWriter(outStream); /发送消息 public void sendMessage(String message)

20、throws IOException output.println(message); output.flush(); /接收消息 public String receiveMessage() throws IOException String message = input.readLine(); return message; /关闭所有打开的东西 public void closeAll() try if(input!=null) input.close(); if(output!=null) output.close(); if(socket!=null) socket.close()

21、; catch (IOException e) / TODO 自动生成的 catch 块 e.printStackTrace(); 客户端Client .java:import java.io.IOException;import .InetAddress;public class Client public static void main(String args) try InetAddress hostname=InetAddress.getByName(localhost); MystreamSocket mss=new MystreamSocket(hostname,12345);

22、mss.sendMessage(我是客户端,我请求连接!); System.out.println(mss.receiveMessage(); mss.close(); catch (IOException e) / TODO 自动生成的 catch 块 e.printStackTrace(); 服务端Services.java:import java.io.IOException;import .ServerSocket;import .Socket;public class Services public static void main(String args) try ServerSo

23、cket services=new ServerSocket(12345); Socket socket; while(true) /监听端口看是否有连接请求 socket=services.accept(); /多线程处理连接请求 new ServicesThread(socket).start(); catch (IOException e) / TODO 自动生成的 catch 块 e.printStackTrace(); 服务端多线程实现ServicesThread.java:import java.io.IOException;import .Socket;public class

24、ServicesThread extends Thread Socket socket; ServicesThread(Socket socket) this.socket=socket; public void run() try MystreamSocket mss=new MystreamSocket(socket); System.out.println(mss.receiveMessage(); mss.sendMessage(消息已收到!); mss.closeAll(); catch (IOException e) / TODO 自动生成的 catch 块 e.printStac

25、kTrace(); 七、思考题1. 如何实现全双工的流式 socket 通信?答:服务端监听端口,每当有一个连接请求发来时,就与其建立新的连接,然后利用其提供的功能进行通信。2. 如何实现安全 socket API?答:注意在通信过程中的各种异常情况的捕获与处理。3. 如何实现 1 对多的并发?答:在服务端使用多线程。实验三 客户/ 服务器应用开发一、实验目的1. 验证 daytime 和 echo 程序,2. 实现包 socket 支撑的 C/S 模式 IPC 机制3. 实现流式 socket 支撑的 C/S 模式 IPC 机制二、预习与实验要求1. 预习实验指导书及教材的有关内容,了解 d

26、aytime 和 echo 要提供的具体服务内容;2. 复习包 socket 和流式 socket 的实现原理;3. 实验前认真听讲,服从安排。尽可能独立思考并完成实验。三、实验环境a) 独立计算机;b) Windows 操作系统。c) Jdk 工具包四、实验原理C/S 模式是主要的分布式应用范型,其设计的目的是提供网络服务。网络服务指如daytime、telnet、ftp 和 WWW 之类的允许网络用户共享资源的服务。要构建 C/S 范型的应用就必须解决以下一些关键问题:(1) 如何通过会话实现多个用户的并发问题(2) 如何定义客户和服务器在服务会话期间必须遵守的协议(3) 服务定位问题(4

27、) 进程间通信和事件同步问题:语法、语义和响应(5) 数据表示问题在解决了这些问题的基础上,C/S 范型必须遵从 3 层结构的软件体系结构:(1) 表示层,提供与客户端进行交互的界面(2) 应用逻辑层,定义服务器和客户端要处理的主要事务的业务逻辑(3) 服务层,定义应用逻辑层所需要的底层支持技术,例如定义其 IPC 机制里的receive 方法和 send 方法等。五、实验内容1. 构建用数据包 socket 实现的 daytime 客户端程序(1) 构建表示层程序 DaytimeClient1.java(2) 构建应用逻辑层程序 DaytimeHelper1.java(3) 构建服务层程序

28、MyClientDatagramSocket.java2. 构建用数据包 socket 实现的 daytime 服务器端程序(1) 构建表示层和应用逻辑层程序 DaytimeServer1.java(2) 构建服务层程序 MyServerDatagramSocket.java(3) 构 建 服 务 层 程 序 MyServerDatagramSocket.java 所 需 要 的 下 层 程 序DatagramMessage.java(它封装了客户端的消息和地址)3. 构建用流式 socket 实现的 daytime 应用程序包4. 构建用数据包 socket 实现的 echo 应用程序包5.

29、 构建用流式 socket 实现的 echo 应用程序包六、实验报告1. 用数据包 socket 实现的 daytime 应用程序包的构架,列明各程序之间的关系;客户端:服务端:代码:客户端:DaytimeClient1.javaimport java.io.*;public class DaytimeClient1 public static void main(String args) InputStreamReader is = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(is);try System.out.println(Welcome to the Daytime client.n +What is the name of the server host);

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

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