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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

CSU计算机网络实验报告.docx

1、CSU计算机网络实验报告计算机网络实验报告学号: 姓名: 班级: 学院:信息科学与工程学院指导老师: 实验一:距离向量路由算法的实现1.1实验目的模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。1.2实验内容要求编程实现距离矢量路由算法的路由表交换过程,并动态演示每轮交换过后路由表的变化情况。1.3实验原理距离向量路由算法,使用这个算法的路由器必须掌握这个距离表(它是一个一维排列,即一个向量),它告诉在网络中每个节点的最远和最近距离。在距离表中的这个信息是根据临近接点信息的改变而时时更新的。表中数据的量和在网络中的所有的接点(除了它自己本身)是等同的。这个表中的列代表直接和它

2、相连的邻居,行代表在网络中的所有目的地。每个数据包括传送数据包到每个在网上的目的地的路径和距离/时间在那个路径上来传输(我们叫这个为“成本”)。这个在那个算法中的度量公式是跳跃的次数,等待时间,流出数据包的数量等等。在距离向量路由算法中,相邻路由器之间周期性地相互交换各自的路由表备份。当网络拓扑结构发生变化时,路由器之间也将及时地相互通知有关变更信息。每个路由器维护了一张路由表,它以子网中的每个路由器为索引,并且每个路由器对应一个表项。该表项包含两部分:为了达到该目标路由器而使用的输出线路,以及到达该目标路由器的时间估计值或者距离估计值。距离矢量路由算法在理论中可以工作,但在实践中有一个严重的

3、缺陷:虽然它总是能够达到正确的答案,但是它收敛到正确答案的速度非常慢,尤其是,它对于好消息的反应非常快,但是对于坏消息的反应非常迟缓。1.4实验步骤1.4.1编写程序程序的源代码如下:#include stdio.h#include stdlib.h#include alloc.h#define ROUTNUM 7typedef struct int dis; int from;RoutNode;RoutNode dataROUTNUMROUTNUM; /*路由表*/void InitData(FILE* pfile); /*从数据文件读取数据,初始化路由表*/void OutputRoutD

4、ata(); /*输出所有的路由表*/void Communication(int recv, int send);/*send点向recv点发送自己的路由表*/void Exchange(); /*所有节点进行一次数据交换, 更新路由表*/void main() int start, end, i, j; FILE *pfile; pfile = fopen(1.txt, r); if (pfile = NULL) printf(文件打开错误,按任意键退出.n); getch(); return; else InitData(pfile); fclose(pfile); printf(n路由

5、表初始:n); for (i = 0; iROUTNUM; i+) printf(%c|, i + 65); for (j = 0; j 0) printf( , j + 65, dataij.dis); printf(n); for (i = 0; i ROUTNUM; i+) Exchange(); printf(n路由表交换:n); OutputRoutData(); printf(输入起始路由节点(%d-%d) : , 0, ROUTNUM - 1); scanf(%d, &start); printf(输入终点路由节点(%d-%d) : , 0, ROUTNUM - 1); scan

6、f(%d, &end); if (start = end | start 6 | end 6) printf(n输入错误,请按任意键退出n); getch(); return; else int cur = start; int total = 0; if (datastartend.dis , cur + 65); while (datacurend.from = 0) total += datacurdatacurend.from.dis; printf(%c-, datacurend.from + 65); cur = datacurend.from; /*end of while*/

7、total += datacurend.dis; printf(%cn总的路由距离 = %d, end + 65, total); getch(); return; /*end of else*/void InitData(FILE* pfile) char num10; int i = 0; char c; int m, n; fseek(pfile, 0, 0); for (m = 0; !feof(pfile) & m 7; m+) for (n = 0; !feof(pfile) & n = 0 & c = 9) | c = -) /*如果读到数字或符号*/ numi+ = c; /*

8、end of else if*/ /*end of while*/ /*end of for (n = 0*/ /*end of for (m = 0*/void OutputRoutData() int i, j; printf( ); for (i = 0; i ROUTNUM; i+) printf( %c , i + 65); printf(n); for (i = 0; i ROUTNUM; i+) printf(%c , i + 65); for (j = 0; j ROUTNUM; j+) if (dataij.dis = 10) printf( %d, dataij.dis);

9、 else printf( %d, dataij.dis); if (dataij.from 0) /*如果未经过其它节点*/ printf( - ); else printf( %c , dataij.from + 65); /*end of for (j = 0*/ printf(n); /*end of for (i = 0*/void Communication(int recv, int send) int i; for (i = 0; i 0) /*如果send节点到i号节点有路线*/ if (datarecvi.dis datasendi.dis + datarecvsend.d

10、is) /*如果现有路径比新路径远*/ datarecvi.dis = datasendi.dis + datarecvsend.dis; datarecvi.from = send; /*end of if*/ /*end of for*/void Exchange() int i, j; for (i = 0; i ROUTNUM; i+) for (j = 0; j 0) /*如果两个节点之间有路径*/ Communication(j, i); /*将i号节点的路由表发送给j号节点*/ /*end of if*/ /*end of for (j = 0*/ /*end of for (i

11、 = 0*/1.4.2设计思路程序先定义了一个路由表RoutNode dataROUTNUMROUTNUM,路由表的初始信息存储在文件中,程序运行是先调用函数InitData(FILE* pfile)从文件中读取路由表的初始信息,然后输出初始路由表的信息,Communication(int recv, int send)函数主要是向邻近节点发送自己的路由表信息,Exchange()函数则根据新路由表信息更新自己的路由表。当所有的路由表节点都更新一遍后,整个路由表更新完毕。1.5实验结果分析1.5.1结果截图1.5.2结果分析路由表初始信息从文件读取,根据距离向量路由算法系统自动完成路由表的更新

12、操作,最后任意输入两个路由表接点,则可得出两接点之间的最短路径。1.6实验心得体会实验是对我们应用知识的考察,通过它我们能更加了解自己的能 力。这次的实验是网络课实验中最简单的一次,但我做得一点都不好,还没有写软件的概念和思想,程序也写得不好,还没有再实验课上完成的,是后来到寝室才完成的,没有通过老师的检查,幸亏我们的老师心地善良,说不用检查也可以通过。这个程序只能实现主要的功能,没有界面,也没有什么操作,因能力有限,只能做到这个样子,还望老师见谅。有空的话我一定好好学习一种编程软件。实验二 网络聊天窗口2.1实验目的1, 进一步加深对网络底层数据传输过程的理解2, 通过自己动手编写具体的代码

13、,实现实验的要求,提高学生的编程能力3, 熟悉socket编程接口,初步掌握用socket编程接口开发面向连接的网络应用程序的方法。4, 熟悉socket编程接口,初步掌握用socket编程接口开发无连接的网络应用程序的方法。2.2实验原理为实现网络聊天的功能,采用Windows Socket编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,实行将所有信息发往服务器端,再由服务器进行分别处理的思路,服务器端是所有信息的中心。由于服务器端要保存用户信息,我们暂时利用文件保存来实现这一功能,这是为了保存较好的可移植性,在没装相应数据库的机子上也能顺利地运行。在客户端保存用户号码这一

14、功能的实现中,采用了文件系统设计。在不同的客户间可以实现文件的传输,其原理与信息传送差不多,只不过传输的内容是文件字节流。服务器及客户端的功能可划分为以下模块:客户端:1) 登陆功能:建立与服务器的连接并登陆,能显示登陆错误信息。(由于本项目是作者09年时出于兴趣自己开始做的,所以界面中显示的是QQ2009)用用户名字登录。密码都默认为123其中,点击界面上的“注册新账号”会出现下图:在里面填写相应的名字和密码即可注册,当然服务器也要开启相应的端口,如下:2) 界面显示:将在线好友显示在好友列表中,并实现系统托盘,加入工具栏便于操作。本界面中左边和右边都是截图所得,这些按钮没有实际功能,只为了

15、模仿QQ。3) 聊天功能:与好友聊天。 本界面做的时候有点bug,就是聊天窗口中只有一个有个人形象展示,如上, 在左边打开的窗口中没有,右边有。这一个bug有空会改过来的。4) 发送文件:能发送任一文件,当然文件不能过大,否则可能会出问题。收到的图片可以正常打开 5) 信息提示:闪动托盘图标提示到来信息,并播放不同音乐来提示。6) 其他: 用户登陆成功,将保存其号码,以便下次登陆时,不必再输入而可以直接选择,显示登陆时间。 服务器端:写上一个合适的端口后点击开启端口,就可以开启 一个端口用来专门接收用户的连接。当有用户上线进,就会把相应的用户列在列表中。向各个客户端发布系统消息。接受来自客户端

16、的各种信息并分别处理。1) 登陆信息:检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确。就将在线用户发给该用户,并将该用户的状态发给各在线用户。同时在服务器端显示出来。2) 聊天信息:转发给消息指定的用户。3) 申请信息:自动分配8位用户号码,并保存该用户,同时将信息返回给客户端。4) 用户下线:将此用户下线消息发给各客户端,并改写用户在服务器端的状态。2.3实验具体实现1、 服务器端:服务器端启动时,先初始化服务端界面,之后开启一个端口用来监听客户端的连接:ChatServer.java文件里面:public void setUpServer() try System.out.pri

17、ntln(port); / 创建服务端套接字 server = new .ServerSocket(port); MakeLog.writeLog(成功创建了一个套接字,ChatServer); / 进入一个循环来等待客户端 while (true) if (server != null) .Socket client = server.accept(); / 开一个线程 ServerThread newThread = new ServerThread(client); MakeLog.writeLog(已经创建一个线程连接. 客户端地址: + client.getRemoteSocketA

18、ddress(),ChatServer); listSock.add(client); / 启动线程 newThread.start(); catch (Exception e) e.printStackTrace(); MakeLog.writeError(e.getMessage(),ChatServer); 然后,当有一个客户端连接上来的时候,就开启一个线程分配给该用户,用来管理该用户的连接及一些相关的操作。(其它知识点与本实验无关,这里就不再写了,下面看客户端)2、 客户端:客户端一启动时,先构造出登陆界面,当点击登陆按钮时,先做一下简单的判断,看是否账号或密码为空, 当它们都合法的时

19、候就进入下一步:/* * 对登陆按钮作出回应 */ public void react() if (null != tf_name.getText() | null != tf_psw. getText() name = tf_name.getText().trim(); psw = tf_psw.getText().trim(); System.out.println(name:+name+ psw:+psw); / 创建一个连接,连接服务器 connServer(serverIp, port); ClientMng.manage(client); / 登陆 if(ClientMng.log

20、on(name, psw) ClientThread threadCl=new ClientThread(); threadCl.start(); else javax.swing.JOptionPane.showMessageDialog(jf,登陆失败!用户名已登陆或密码或用户名错误!); else javax.swing.JOptionPane.showMessageDialog(null, 对不起,用户名和密码不能为空!); kk=0; jf.dispose(); /最后把登陆界面关掉。 分析代码。先用客户端内置的预设的服务器地址和端口 进行socket连接信尝试,连接成功时,客户端马

21、上给服务器发送相关的用户名和密码,服务器验证通过的时候会向客户端返回一条确认信息,客户端如果接到该确认信息说明已经登陆成功了,他们就有了一个永久性的连接,直到其中的一方关闭连接为止。其实在这过程中,还有一些环节:/* * 登陆用的函数 * param name:登陆用户名 * param psw:登陆密码 * return:是否登陆成功,true登陆成功,false登陆失败 */ public static boolean logon(String name, String psw) myName = name; String namePsw; if (clientSock != null)

22、namePsw = name + # + psw; sendMsg(namePsw, system);/ 发送用户名和密码 try msg = readPackage(); if (msg.equals(系统说:对不起,您的用户名可能为空或未注册或已登陆!) / javax.swing.JOptionPane.showMessageDialog(MainClient.getFrame(), / 对不起,您的用户名可能为空或未注册或已登陆!); return false; if (msg.equals(系统说:登陆失败!密码错误!) javax.swing.JOptionPane.showMes

23、sageDialog(MainClient .getFrame(), 登陆失败!密码错误!); return false; sendMsg(OK!, system); msg = readPackage(); sendMsg(OK!, system); / 接收服务器发过来的在线用户列表 names = readPackage(); /处理服务器刚发过来的在线用户列表 if (names != null & !names.equals() String s = names.split(说:); String allName = s1.split(#); for (int i = 0; i al

24、lName.length; i+) if (!allNamei.equals() & allNamei != null & !exists(allNamei) listUser.add(allNamei); / 发送一条消息告诉服务器,是否需要它发送分组信息过来 if (needToSendTeamInfo() sendMsg(发过来, system); / 接收服务器发过来的分组信息并保存/ msg = readPackage(); SaveFileAfterRecievingTeamInfo(); else sendMsg(不用发, system); initial(); catch (E

25、xception ef) ef.printStackTrace(); return true; return true; 当客户端发送了用户名和密码之后,如果收到的信息是:“对不起,您的用户名可能为空或未注册或已登陆!”则说明重复登陆,登陆失败。如果收到的信息是:“登陆失败!密码错误!”则说明是密码错误,当然也有可能是不存在这个用户。收到的信息如果 是其它的情况,则登陆成功,这时,双方还会再各发条“OK”信息来确认双方的连接并协调步伐。之后,客户端会判断本地是否已经有相关的列表信息,如果有,则会直接读取本地好友列表信息,如果没有的话,会请求服务器发送相关的好友列表。收到好友列表后,再解析,并构建成一棵树,显示在界面的列表项中。客户端有一个工具类,里面有一个读取消息并分解消息的方法:/* * 按协议来读数据,包括XX说: * return:读包结果 * throws IOException */ public static String readPackage() throws IOException / 开始读数据 if (dins !

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

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