计算机网络实验报告
实验内容:
实验时间:指导老师:王伟平老师姓
名:代班
级:信安学
号:
1、网络路由层协议模拟实验
2、Socket通信实验
2014年5月9日
巍
1201班 0909121615
实验
一、距离向量路由算法的实现
一、实验内容
网络路由算法是路由器工作的核心,针对因特网常用的距离向量路由算法和链路状态路由算法进行模拟实现,进一步掌握其工作原理及其相关性能。
二、实验目的及要求
实验目的:
1.掌握VB、VC++、VS或JAVA等集成开发环境编写路由仿真程序的方法;
2.理解并掌握距离向量路由协议和链路状态路由协议的工作原理。
基本要求: 动态生成网络拓扑图,节点间的距离随机生成。每个节点生成自己的链路状态分组,依据收到的链路状态表得到整体网络结构,在得到的整体网络结构上用最短路径算法,生成每个节点的路由表。
编程语言和环境:
编程语言C/C++/C#/Java等均可;
编程环境Windows(MS Visual系列,VC/VB/VS.Net;)和Linux(编辑器vi+编译器GCC)均可;
三、实验原理
1.距离路由矢量算法工作原理:每个路由器维护一张路由表(即一个矢量),它以网络中的每个路由器为索引,表中列出了当前已知的路由器到每个目标路由器的最佳距离,以及所使用的线路。通过在邻居之间相互交换信息,路由器不断地更新他们的内部路由表。 2.实验内容分析:实验中将两路由器间的延迟的代价用边的权值进行存储,将路由器用结点表示,则结点间每次和所有邻居交换信息,更新每个结点到其他结点的最短路径,并记录到达其他结点所经历的邻居结点作为出路。
四、实验结果
五、源代码
#include #include #include
#define N 5
//5个路由器
#define MAX_size 20
#define MAX 1000
int map[N][N]; int dist[N][N]; int path[N];
void init()
//以邻接矩阵的形式存储 ,随机产生各路由表的拓扑结构
{ int i, j;
srand((unsigned)time(NULL));
//随机生成的函数
for (i = 0; i
for (j = i+1; j
{
map[i][j] = rand() % MAX_size;
map[j][i] = map[i][j];
} printf(\"\\t随机拓扑结构为:\\n\");
for (i = 0; i
for (j=0; j
printf(\"\\t%d \", map[i][j]);
printf(\"\\n\");
}
printf(\"\\n\"); }
void print(int k)
//打印函数
{
int i, j;
printf(\"\\t%d次交换: \",k);
for (i = 0; i
printf(\"%5d(%c) \", dist[k][i], (char)(path[i]+65));
//显示到其他结点的距离并且输出邻居结点
printf(\"\\n\"); }
void exchange(int v)
{
int i, k, m; for (i = 0; i
//显示第一次交换结果
{
dist[1][i] = map[v][i];
if (i != v && dist[1][i]
path[i] = i;
else
path[i] = -20; }
print(1);
for (k = 2; k
{
for (m = 0; m
dist[k][m] = dist[k-1][m];
for (m = 0; m
if (m != v)
for (i = 0; i
//修改更新路由表
if (map[i][m] dist[k-1][i] + map[i][m])
{
if (dist[k-1][i] + map[i][m]
{
dist[k][m] = dist[k-1][i] + map[i][m];
if (map[v][i]
path[m] = i;
else
path[m] = path[i];
}
}
for (m = 0; m
if (path[m] == v)
path[m] = m;
print(k);
} } int main() {
int i;
init();
for (i = 0; i
{
char c;
c=(char)(i+65);
printf(\"\\t%c路由器的路由表\\n\",c); exchange(i);
printf(\"\\n\");
}
getchar(); }
六、实验总结
程序先定义了一个路由表,路由表结点的权值和弧数可随机生成。路由表的初始信息存储在文件中,程序运行是先调用函数从文件中读取路由表的初始信息,然后输出初始路由表的信息,print()函数主要是向邻近节点发送自己的路由表信息,exchange()函数则根据新路由表信息更新自己的路由表。当所有的路由表节点都更新一遍后,整个路由表更新完毕。
七、实验心得
经过此次试验,对两种不的路由协议有了深入的理解。距离矢量路由算法及链路状态路由算法两者的区别在于,距离矢量路由算法是静态的,链路状态路由算法是动态的。我选择的是距离矢量路由算法,该算法的基本思想如下:每个路由器维护一个距离矢量(通常是以延时是作变量的)表,然后通过相邻路由器之间的距离矢量通告进行距离矢量表的更新。每一次都要相应地更改路由器的路由表,从而找到到达周边节点的最短路径。
实验
二、Socket通信实验
一、实验内容
1.网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。本实验利用Socket API编写网络通信程序,具体实验要求及内容如下。
2.所编写的程序应具有如下功能:
具有点对点通信功能,任意客户端之间能够发送消息; 具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;
具有广播功能,客户端能够向所有其他成员广播消息;
二、实验目的及要求
实验目的:
1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序方法; 2.掌握客户/服务器(C/S)应用的工作方式; 3.学习网络中进程之间通信的原理和实现方法; 4.理解单播、组播和广播的原理并比较其不同之处; 5.要求本机既是客户端又是服务器端; 编程语言及环境:
1.编程语言C/C++/C#/Java等均可; 2.编程环境Windows(MS Visual系列,VC/VB/VS.Net;)和Linux(编辑器vi+编译器GCC)均可;
三、实验原理
1、建立客户端/服务器连接模式
所有的客户端必须连接到服务器。客户端的通信由服务器转发。A 发信息 给B = A->服务器->B。
用IP地址定位网上的计算机,一共4段,每段0-255之间,编写程序,通过Java来获取本机IP地址(本机IP地址也可以用:127.0.0.1表示,本机名称可以用:localhost来表示),通过java.net.InetAddre类来实现。
用端口(port)来对应着应用程序。确定了IP地址,还要确定对方的程序是在哪个端口,我们才能与之通信,端口就是一个数字,0-65535之间。
用多线程监听的方式来完成服务器和客户端的交互,主要用到ServerSocket()函数。
用输入输出流BufferedReader() PrintStream()来发送消息。
2、通信传输
1) 服务器上的软件应该运行
开辟一个端口,等待客户连接 java.net.ServerSocket 2) 客户通过服务器的IP和开的端口连上服务器
java.net.Socket(既能连接又能通信) 将本机当成服务器,在本机上另外编一个程序当成客户端,服务器界面运行,等待客户连接; 客户界面上一个按钮,点击,连接服务器,当连上之后,客户标题变为“OK”,服务器标题变为“有人连上”。
3、数据流
socket是通信的纽带,socket里面有一个输入流InputStream一个输出流OutputStream,如果向输出流里面输出内容,另一方就会得到,并通过输入流读取getInputStream():得到套接字的输入数据流。getOutputStream():得到套接字的输出数据流。
工作完毕,使用流对象的close()方法关闭用于网络通信的输入、输出流,用Socket对象的close()方法关闭socket。
四、实验结果
服务器端
登陆客户端
客户端之间的交互
五、源代码
//服务器端
import javax.swing.*; import java.net.*; import java.io.*; import java.util.*; cla Server extends JFrame implements Runnable{
private ArrayList persons = new ArrayList(); private ServerSocket = null; public Server() {
} public void run(){
while(true){
try{ Socket s = .accept();
this.setSize(200,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle(\"服务器\"); this.setVisible(true); try{ = new ServerSocket(1201); new Thread(this).start();//启动等待连接的线程
}catch(Exception ex){} ReceiveThread rt = new ReceiveThread(s);
}
} persons.add(rt); rt.start(); }catch(Exception ex){} cla ReceiveThread extends Thread{
private BufferedReader br = null; private PrintStream ps = null; public ReceiveThread(Socket s) throws Exception{
br = new BufferedReader(new InputStreamReader(s.getInputStream()));//发送数据构造函数
} public void run(){
while(true){//接受信息
} try{String msg = br.readLine();//死等函数 //传给所有的客户端
for(int i=0;i } }catch(Exception ex){} ReceiveThread rt = (ReceiveThread)persons.get(i); rt.ps.println(msg); ps = new PrintStream(s.getOutputStream());//用于发送数据 } } public static void main (String[] args) throws Exception{ new Server(); } } //客户端 import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.net.Socket; import java.io.*; cla Client extends JFrame implements ActionListener{ private JTextArea jta = new JTextArea(); private JTextField jtf = new JTextField(); private String nick; private PrintStream ps = null; private BufferedReader br = null; public Client() { this.add(jta,BorderLayout.CENTER); jta.setFont(new \",Font.BOLD,30)); jta.setBackground(Color.white); Font(\" 宋 体 this.add(jtf,BorderLayout.SOUTH); jtf.setFont(new Font(\"宋体\",Font.BOLD,30)); jtf.setBackground(Color.white); this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle(\"客户端\"); this.setVisible(true); jtf.addActionListener(this); try{ nick = JOptionPane.showInputDialog(\"请输入你的名称\"); this.setTitle(nick); } cla ReceiveThread extends Thread{ public void run(){ while(true){ } try{String msg = br.readLine(); jta.append(msg + \"\\n\"); }catch(Exception ex){} Socket s = new Socket(\"127.0.0.1\",1201); ps = new PrintStream(s.getOutputStream()); br = new BufferedReader(new InputStreamReader(s.getInputStream())); ps.println(nick+\"成功上线!\"); new ReceiveThread().start(); }catch(Exception ex){} } } } public void actionPerformed(ActionEvent e) { } public static void main (String[] args) throws Exception{ } new Client(); ps.println(nick +\":\"+ jtf.getText()); 六、实验总结 Socket通信是网络通信中的重要环节,本实验中主要实现了TCP/IP的通信,传递相应的信息来完成各种不同的交互功能。聊天工具功能很强大,看起来很复杂,其实底层最基本的实现原理都是一样的。基于TCP/IP协议的连接是比较可靠的,它先通过“三次握手”建立彼此间的一条通路,之后,两者就可以通过这条通路有效地传递信息了。另一方面,两端要传送信息时,也可以通过第三方来转发,这样,我们就可以把各种连接都建立到同一个端点上,构成一个星形的结构,然后通过这个端点的转发,就可以任何两端之间的通信。 聊天的实现: 客户端向服务器发送一个消息包,里面包含了消息类型、接收人和发送人等信息,服务器接到的时候先判断,如果是聊天消息,就取出其中的接收人信息,并在自己的线程池里面查找相应的线程,找到时把消息(包含发送人和消息内容等)通过这个线程发送出去。这样对方就可以接到这个消息。对方如果要回复的话,也可以把发送人和接收人及聊天消息等信息包装起来发送给服务器,服务器再用之前一样的方法来处理这个信息,这样的话,双方就可以通过服务器实现单聊了。 七、实验心得 此次实验是对Socket的一个应用,让我更深的了解了Socket函数的作用及使用方法。实验过程中遇到了很多的问题。然基本功能已经实现,没有实现群组建立和通信,还是需要以后多加学习的。 Java提供Socket类使得TCP连接的通信十分方便,在实现通信过程的时候,最主要的是理解Java中的各种输入输出流类型起到的作用。