版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中南大学分布式系统实验报告目录(我选做 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三、实
2、验结果32实验一 数据包 socket 应用一、实验目的1. 理解数据包 socket 的应用2. 实现数据包 socket 通信3. 了解 java 并行编程的基本方法二、预习与实验要求1. 预习实验指导书及教材的有关内容,了解数据包 socket 的通信原理;2. 熟悉一种 java ide 和程序开发过程;3. 了解下列 java api:thread、runnable;4. 尽可能独立思考并完成实验。三、实验环境a) 独立计算机或计算机网络;b) windows 操作系统。c) jdk 工具包d) jcreator or others四、实验原理1. 分布式计算的核心是进程通信。操作系
3、统、网卡驱动程序等应用从不同抽象层面提供了对进程通信的支持,例如winsock、.*。socket api 是一种作为 ipc 提供对系统低层抽象的机制。尽管应用人员很少需要在该层编写代码,但理解 socket api 非常重要,因为:1,高层设施是构建于 socketapi 之上的,即他们是利用 socket api 提供的操作来实现;2,对于以响应时间要求较高或运行于有限资源平台上的应用来说,socket api 可能是最适合的。在 internet 网络协议体系结构中,传输层上有 udp 和 tcp 两种主要协议,udp 允许在传送层使用无连接通信传送,被传输报文称为数据包。(是否存在面
4、向连接的数据包socket?)因此数据包 socket 是基于 udp 的不可靠 ipc。java 为数据包 socket api 提供两个类:(1)针对 socket 的 datagramsocket 类(2)针对数据包交换的 datagrampacket 类希望使用该 api 发送和接收数据的进程须实例化一个 datagramsocket 对象,每个 socekt被绑定到该进程所在及其的某个 udp 端口上。为了向其他进程发送数据包,进程必须创建一个代表数据包本身的对象。该对象通过实例化一个 datagram socket 对象创建。在接收者进程中,datagrampacket 对象也必须
5、被实例化并绑定到一个本地端口上,该端口必须与发送者数据包的定义一致。接收进程创建一个指向字节数组的 datagrampacket,并调用 datagramsocket 对象的 receive 方法,将 datagrampacket 对象指针作为参数定义。2. 并行编程(以 java 为例 1 )一个线程是比进程更小的执行粒度。 java 虚拟机允许应用程序有多个执行线程同时运行。有两种方法来创建一个新线程的执行。一个是声明一个类是一个线程的子类。这个子类应重写 thread 类的 run 方法。一个子类的实例可以被分配和启动。另一种方法创建一个线程,并同时声明一个类实现了 runnable 接
6、口(这个类要实现 run 方法)。一个类的实例可以被分配并作为参数传递给创建的线程,并启动线程。例如:u 创建一个类是 thread 的子类:class somethread extends thread somethread() public void run() . . .somethread p = new somethread();p.start();u 创建一个实现 runnable 接口的类并传递给线程:class somerun implements runnable somerun() public void run() . . .somerun p = new somerun
7、(143);new thread(p).start();当一个实现 runnable 接口的类被执行时,可以没有子类。实例化一个 thread 实例,并通过自身作为目标线程。在大多数情况下,如果你只打算重写的 run()方法,并没有其它的线程方法,应使用 runnable 接口。因为类不应该被继承,除非程序员有意修改或增强类的基本行为。五、实验内容1. 构建客户端程序(1) 构建 datagramsocket 对象实例(2) 构建 datagrampacket 对象实例,并包含接收者主机地址、接收端口号等信息(3) 调用 datagramsocket 对象实例的 send 方法,将 datag
8、rampacket 对象实例作为参数发送。2. 构建服务器端程序(1) 构建 datagramsocket 对象实例,指定接收的端口号。(2) 构建 datagrampacket 对象实例,用于重组接收到的消息。(3) 调用 datagramsocket 对象实例大家 receive 方法,进行消息接收,并将datagrampacket 对象实例作为参数。六、实验报告1. 客户端和服务器端程序的伪代码;客户端:import java.io.ioexception;import .datagrampacket;import .datagramsocket;import .inetaddress;
9、import java.util.scanner;public class client public static void main(string args) throws ioexception / 创建一个客户端datagramsocket,使用随机端口 datagramsocket socket = new datagramsocket(); / 初始化发送用的datagramsocket,它包含一个长度为0的字节数组 datagrampacket outpacket = new datagrampacket(new byte0 , 0 , inetaddress.getbyname
10、() , 30000); / 定义接收网络数据的字节数组 byte inbuff = new byte4096; datagrampacket inpacket =new datagrampacket(inbuff , inbuff.length); / 创建键盘输入流 scanner scan = new scanner(system.in); / 不断地读取键盘输入 while(scan.hasnextline() / 将键盘输入的一行字符串转换成字节数组 byte buff = scan.nextline().getbytes(); / 设置发送用的datagrampa
11、cket中的字节数据 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 .datagrampacket;import .datagramsocket;public class services pu
12、blic static void main(string args) throws ioexception / 定义接收网络数据的字节数组 byte inbuff = new byte4096; / 创建datagramsocket对象 datagramsocket socket = new datagramsocket(30000); / 以指定字节数组创建准备接收数据的datagrampacket对象 datagrampacket inpacket = new datagrampacket(inbuff , inbuff.length); string message=消息已经收到!; w
13、hile(true) socket.receive(inpacket); / 将接收到的内容转换成字符串后输出 system.out.println(new string(inbuff, 0 , inpacket.getlength(); / 从字符串数组中取出一个元素作为发送数据 byte senddata = message.getbytes(); / 以指定的字节数组作为发送数据,以刚接收到的datagrampacket的 / 源socketaddress作为目标socketaddress创建datagrampacket / 定义一个用于发送的datagrampacket对象 datag
14、rampacket outpacket= new datagrampacket(senddata , senddata.length , inpacket.getsocketaddress(); / 发送数据 socket.send(outpacket); 2. 试验过程中的问题和解决途径;问题:对于datagrampacket、datagramsocket不怎么了解解决途径:查阅jdk api文档3. 实验结果:服务端:客户端1:客户端2:七、思考题1. 如何避免数据包丢失而造成的无限等待问题?答:我认为可在发包时设定一个定时器,若发出去的包在一定时间内没有收到答应,则再发一次。为了避免接受
15、者接到重复的包,可以给数据包加个序号,接受者收包时查看序号即可。2. 如何实现全双工的数据包通信?答:利用端口套接字之间的通信功能。实验二 流式 socket 应用一、实验目的1. 理解流式 socket 的原理2. 实现流式 socket 通信二、预习与实验要求1. 预习实验指导书及教材的有关内容,了解流式 socket 的通信原理;2. 熟悉 java 环境和程序开发过程;3. 尽可能独立思考并完成实验。三、实验环境a) 独立计算机;b) windows 操作系统;c) jdk 工具包四、实验原理socket api 是一种作为 ipc 提供低层抽象的机制。尽管应用人员很少需要在该层编写代
16、码,但理解 socket api 非常重要,因为:1,高层设施是构建于 socket api 之上的,即他们是利用 socket api 提供的操作来实现;2,对于以响应时间要求较高或运行于有限资源平台上的应用来说,socket api 可能是最适合的。在 internet 网络协议体系结构中,传输层上有 udp 和 tcp 两种主要协议,udp 允许使用无连接通信传送,被传输报文称为数据包。而 tcp 则允许面向连接的可靠通信,这种 ipc称为流式 socket。java 为流式 socket api 提供两类 socket(1)式用于连接的连接 socket(2)式用于数据交换的数据 so
17、cket。五、实验内容1. 构建客户端程序和服务器端程序都需要的 mystreamsocket 类,定义继承自 java socket的 sendmessage 和 receivemessage 方法2. 构建客户端程序(1) 创建一个 mystreamsocket 的实例对象,并将其指定接收服务器和端口号(2) 调用该 socket 的 receivemessage 方法读取从服务器端获得的消息3. 构建服务器端程序(1) 构建连接 socket 实例,并与指定的端口号绑定,该连接 socket 随时侦听客户端的连接请求(2) 创建一个 mystreamsocket 的实例对象(3) 调用
18、mystreamsocket 的实例对象的 sendmessage 方法,进行消息反馈。六、实验报告1. 应用程序的结构图,说明程序之间的关系;2. 程序的伪代码。公用服务功能mystreamsocket.java:import .*;import java.io.*;public class mystreamsocket extends socket private socket socket; private bufferedreader input; private printwriter output; /客户端的构造方法 mystreamsocket(inetaddress acce
19、ptorhost, int acceptorport ) throws socketexception, ioexception socket = new socket(acceptorhost, acceptorport ); setstreams(); /服务端的构造方法 mystreamsocket(socket socket) throws ioexception this.socket = socket; setstreams(); /设置输出输入流 private void setstreams() throws ioexception inputstream instream =
20、 socket.getinputstream(); input = new bufferedreader(new inputstreamreader(instream); outputstream outstream = socket.getoutputstream(); output = new printwriter(new outputstreamwriter(outstream); /发送消息 public void sendmessage(string message) throws ioexception output.println(message); output.flush(
21、); /接收消息 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(); catch (ioexception e) / todo 自动生成的 catch 块e.printstackt
22、race(); 客户端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);mss.sendmessage(我是客户端,我请求连接!);system.out.println(mss.receivem
23、essage();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 serversocket services=new serversocket(12345);socket socket;while(true)/监听
24、端口看是否有连接请求socket=services.accept();/多线程处理连接请求new servicesthread(socket).start(); catch (ioexception e) / todo 自动生成的 catch 块e.printstacktrace();服务端多线程实现servicesthread.java:import java.io.ioexception;import .socket;public class servicesthread extends thread socket socket;servicesthread(socket socket)t
25、his.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.printstacktrace();七、思考题1. 如何实现全双工的流式 socket 通信?答:服务端监听端口,每当有一个连接请求发来时,就与其建立新的连接,然后利用其提供的功能进
26、行通信。2. 如何实现安全 socket api?答:注意在通信过程中的各种异常情况的捕获与处理。3. 如何实现 1 对多的并发?答:在服务端使用多线程。实验三 客户/ 服务器应用开发一、实验目的1. 验证 daytime 和 echo 程序,2. 实现包 socket 支撑的 c/s 模式 ipc 机制3. 实现流式 socket 支撑的 c/s 模式 ipc 机制二、预习与实验要求1. 预习实验指导书及教材的有关内容,了解 daytime 和 echo 要提供的具体服务内容;2. 复习包 socket 和流式 socket 的实现原理;3. 实验前认真听讲,服从安排。尽可能独立思考并完成实
27、验。三、实验环境a) 独立计算机;b) windows 操作系统。c) jdk 工具包四、实验原理c/s 模式是主要的分布式应用范型,其设计的目的是提供网络服务。网络服务指如daytime、telnet、ftp 和 www 之类的允许网络用户共享资源的服务。要构建 c/s 范型的应用就必须解决以下一些关键问题:(1) 如何通过会话实现多个用户的并发问题(2) 如何定义客户和服务器在服务会话期间必须遵守的协议(3) 服务定位问题(4) 进程间通信和事件同步问题:语法、语义和响应(5) 数据表示问题在解决了这些问题的基础上,c/s 范型必须遵从 3 层结构的软件体系结构:(1) 表示层,提供与客户
28、端进行交互的界面(2) 应用逻辑层,定义服务器和客户端要处理的主要事务的业务逻辑(3) 服务层,定义应用逻辑层所需要的底层支持技术,例如定义其 ipc 机制里的receive 方法和 send 方法等。五、实验内容1. 构建用数据包 socket 实现的 daytime 客户端程序(1) 构建表示层程序 daytimeclient1.java(2) 构建应用逻辑层程序 daytimehelper1.java(3) 构建服务层程序 myclientdatagramsocket.java2. 构建用数据包 socket 实现的 daytime 服务器端程序(1) 构建表示层和应用逻辑层程序 day
29、timeserver1.java(2) 构建服务层程序 myserverdatagramsocket.java(3) 构 建 服 务 层 程 序 myserverdatagramsocket.java 所 需 要 的 下 层 程 序datagrammessage.java(它封装了客户端的消息和地址)3. 构建用流式 socket 实现的 daytime 应用程序包4. 构建用数据包 socket 实现的 echo 应用程序包5. 构建用流式 socket 实现的 echo 应用程序包六、实验报告1. 用数据包 socket 实现的 daytime 应用程序包的构架,列明各程序之间的关系;客户
30、端:服务端:代码:客户端: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
31、host);string hostname = br.readline();if (hostname.length() = 0) hostname = localhost; / 使用默认主机名system.out.println(what is the port number of the server host);string portnum = br.readline();if (portnum.length() = 0)portnum = 1300; / 设置默认端口system.out.println(here is the timestamp received from the se
32、rver+daytimeclienthelper1.gettimestamp(hostname, portnum); catch (exception ex) ex.printstacktrace(); daytimeclienthelper1.javaimport .*;public class daytimeclienthelper1 public static string gettimestamp(string hostname, string portnum) string timestamp = ;try inetaddress serverhost = inetaddress.g
33、etbyname(hostname);int serverport = integer.parseint(portnum);/实例化socket 发送和接收数据mydatagramsocket mysocket = new mydatagramsocket(); mysocket.sendmessage( serverhost, serverport, );timestamp = mysocket.receivemessage();/ 时间戳 mysocket.close(); catch (exception ex) system.out.println(there is a problem
34、: + ex);return timestamp; myclientdatagramsocket.javaimport .*;import java.io.*;public class myclientdatagramsocket extends datagramsocket static final int max_len = 100; myclientdatagramsocket() throws socketexceptionsuper();myclientdatagramsocket(int portno) throws socketexceptionsuper(portno);pub
35、lic void sendmessage(inetaddress receiverhost, int receiverport, string message)throws ioexception byte sendbuffer = message.getbytes(); datagrampacket datagram = new datagrampacket(sendbuffer, sendbuffer.length,receiverhost, receiverport);this.send(datagram); public string receivemessage()throws io
36、exception byte receivebuffer = new bytemax_len;datagrampacket datagram = new datagrampacket(receivebuffer, max_len);this.receive(datagram);string message = new string(receivebuffer);return message; 服务端:daytimeserver1.javaimport java.io.*;import java.util.date;public class daytimeserver1 public stati
37、c void main(string args) int serverport = 13;if (args.length = 1 )serverport = integer.parseint(args0); try myserverdatagramsocket mysocket = new myserverdatagramsocket(serverport);system.out.println(daytime server ready.); while (true) datagrammessage request = mysocket.receivemessageandsender();sy
38、stem.out.println(request received);date timestamp = new date ();system.out.println(timestamp sent: + timestamp.tostring();mysocket.sendmessage(request.getaddress(),request.getport(), timestamp.tostring();catch (exception ex) system.out.println(there is a problem: + ex); myserverdatagramsocket.javaim
39、port .*;import java.io.*;public class myserverdatagramsocket extends datagramsocket static final int max_len = 100;myserverdatagramsocket(int portno) throws socketexceptionsuper(portno);public void sendmessage(inetaddress receiverhost, int receiverport, string message)throws ioexception byte sendbuf
40、fer = message.getbytes(); datagrampacket datagram =new datagrampacket(sendbuffer, sendbuffer.length, receiverhost, receiverport);this.send(datagram); public string receivemessage()throws ioexception byte receivebuffer = new bytemax_len;datagrampacket datagram = new datagrampacket(receivebuffer, max_
41、len);this.receive(datagram);string message = new string(receivebuffer);return message; public datagrammessage receivemessageandsender()throws ioexception byte receivebuffer = new bytemax_len;datagrampacket datagram = new datagrampacket(receivebuffer, max_len);this.receive(datagram);datagrammessage r
42、eturnval = new datagrammessage();returnval.putval(new string(receivebuffer), datagram.getaddress(),datagram.getport();return returnval; datagrammessage.javaimport .*;public class datagrammessageprivate string message;private inetaddress senderaddress;private int senderport;public void putval(string
43、message, inetaddress addr, int port) this.message = message;this.senderaddress = addr;this.senderport = port;public string getmessage() return this.message;public inetaddress getaddress() return this.senderaddress;public int getport() return this.senderport; 2. 用流式 socket 实现的 daytime 应用程序包的构架,列明各程序之
44、间的关系;客户端:服务端:共有的:mystreamsocket.javaimport .*;import java.io.*;public class mystreamsocket extends socket private socket socket; private bufferedreader input; private printwriter output; mystreamsocket(inetaddress acceptorhost, int acceptorport ) throws socketexception, ioexception socket = new sock
45、et(acceptorhost, acceptorport ); setstreams(); mystreamsocket(socket socket) throws ioexception this.socket = socket; setstreams(); private void setstreams() throws ioexception inputstream instream = socket.getinputstream(); input = new bufferedreader(new inputstreamreader(instream); outputstream ou
46、tstream = socket.getoutputstream(); output = new printwriter(new outputstreamwriter(outstream); public void sendmessage(string message) throws ioexception output.println(message); output.flush(); public string receivemessage() throws ioexception string message = input.readline(); return message; 客户端:daytimeclient2.javaimport java.io.*;public class daytimeclient2 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 o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天津滨海汽车工程职业学院《信号与系统B》2023-2024学年第一学期期末试卷
- 工业版合同范例
- 婚介会员服务合同范例
- 欠款抵车合同范例
- 人事劳动合同范例
- 养殖创业合伙合同范例
- 叠合板生产合同范例
- 建筑沙石采购合同范例
- 展会票务合同范例
- 房屋名称变更合同范例
- 2024年安徽省高校分类考试对口招生语文试卷真题(含答案)
- 《2024年 《法学引注手册》示例》范文
- 光伏车棚施工方案
- 中华人民共和国职业分类大典是(专业职业分类明细)
- 2024年检察院招录书记员考试法律基础知识及答案
- 国开2024年秋季《形势与政策》大作业答案
- 北师大版四年级上册除法竖式计算题300道及答案
- 2024-2030年中国橡胶伸缩缝行业市场发展趋势与前景展望战略分析报告
- 2021-2022学年内蒙古呼和浩特市高一上学期期末考试英语试题(解析版)
- 12SG121-1 施工图结构设计总说明
- DL∕T 2447-2021 水电站防水淹厂房安全检查技术规程
评论
0/150
提交评论