实验报告实验名称NS路由模拟和Socket编程课程名称计算机网络原理与技术NS路由模拟实验一、实验目的了解NS网络模拟器的基本操作;学习采用距离矢量算法(Distance Vector Algorithm)的动态路由。
二、实验步骤这个实验主要是观察链路状态发生变化时,使用静态路由和动态路由的差异性。
实验的结构如图1所示,节点n0会使用ftp将数据传送到n5,传送时间为0.1s~3.0s,在1.0s时,链路n1到n4发生问题,所以数据无法从n1到n4之间的链路传送。
在2.0s时,链路n1到n4问题解决,数据有可以从此路传送。
图1 网络拓扑结构TCL程序:静态路由执行方法1、运行TCl脚本运行成功后生成的文件2、运行Nam程序,观察结果(1)使用静态路由,传送数据从n0到n5的路径是n0----n1----n4---n5.(2)在1.0s时,n1到n4链路发生问题,因为使用静态路由算法,路由表不会更新,所以数据无法发送到n4.(3)在3.0s时,n1到n4链路的问题得到解决,所以数据又按路径n0----n1----n4---n5传送到n5.动态路由执行方式1、运行TCL脚本2、运行nam程序,观察结果(1)因为使用动态路由方式,所以一开始,节点与节点之间必须互换信息,以建立路由表,如图3-1图3-1图3-2(2)路由表建立后,数据传送的路径是n0----n1----n4---n5.如图3-2 (3)在1.0s时,n1到n4链路发生问题,因为使用动态路由算法,所以节点互相通信,因此n0到n5数据发送的路径更新为n0----n1----n2---n3----n5. 如图3-3图3-3图3-4(4)在3.0s时,n1到n4之间的链路恢复,节点互相通信后,路由表更新,因此n0到n5数据发送的路径也恢复为n0----n1---n4----n5.如图3-4Socket编程1.实验目的在实际的环境中,数据帧是网络数据层里传输的基本数据单位,数据的传输时要实现双工传输,而滑动窗口协议是其中能够实现双工数据传输的一种协议标准。
本实验模拟实现该协议在数据链路层上的数据传输过程是为加深大家对滑动窗口协议的理解。
2.实验要求(1)了解和掌握“基于UDP-无面向连接的应用程序”的运行机制和编程方法;(2)了解和掌握“基于TCP-面向连接的应用程序”的运行机制和编程方法;(3)编写一个网络通信应用程序:客户机发出数据请求命令,服务器根据其命令提供数据;(4)总结实验过程(实验报告,左侧装订):方案、编程、调试、结果、分析、结论。
3.实验指导基于TCP-面向连接的应用程序:(1)分别编写基于TCP协议的“简单聊天室网络通信程序”的客户端和服务器端。
(2)在单机上运行它们,验证其通信结果;(3)在多机上运行它们,验证其通信结果;(服务器端只需运行在一台主机上,客户端可在其它主机上运行,要知道服务器端所在主机的IP地址)。
其客户端主程序流程图如下图所示:图3.6 数据帧传输客户端流程图服务器端的流程图如图3.7所示:图3.7 数据帧传输实验服务器端流程图4.实验结果及展示客服端界面默认监听接口是4700客服端代码package lzf.socket;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import .*;public class SocketClient extends JFrame implements ActionListener{ static {try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch (Exception e) {e.printStackTrace();}}JPanel contentPane;JLabel jLabel1 = new JLabel();JTextField jTextField1 = new JTextField("127.0.0.1");JLabel jLabel2 = new JLabel();JTextField jTextField2 = new JTextField("4700");JButton jButton1 = new JButton();JLabel jLabel3 = new JLabel();JTextField jTextField3 = new JTextField();JButton jButton2 = new JButton();JScrollPane jScrollPane1 = new JScrollPane();JTextArea jTextArea1 = new JTextArea();BufferedReader instr =null;Socket socket = null;PrintWriter os=null;public SocketClient() {jbInit();}class MyThread extends Thread{public void run(){try{os=new PrintWriter(socket.getOutputStream());instr=new BufferedReader(newInputStreamReader(socket.getInputStream()));while(true){Thread.sleep(100);if(instr.ready()){jTextArea1.append("服务器: "+instr.readLine()+"\n");}}}catch(Exception ex){ex.printStackTrace();}}}public void actionPerformed(ActionEvent e){if(e.getSource()==jButton1){S tring ip=jTextField3.getText().trim();i nt port=Integer.parseInt(jTextField2.getText().trim());c onnectServer(ip,port);}if(e.getSource()==jButton2){String s=this.jTextField3.getText().trim();sendData(s);}}private void connectServer(String ip,int port){//连接try{if(jButton1.getText().trim().equals("连接")){jButton1.setText("连接服务器...");socket=new Socket(ip,port);jButton1.setText("正在聊天");MyThread t=new MyThread();t.start();}}catch(Exception ex){ex.printStackTrace();}}private void sendData(String s){//发送数据try{os = new PrintWriter(socket.getOutputStream());os.println(s);os.flush();this.jTextArea1.append("Server:"+s+"\n");}catch(Exception ex){e x.printStackTrace();}}private void jbInit() {contentPane = (JPanel) this.getContentPane();jLabel1.setFont(new java.awt.Font("宋体", 0, 14));jLabel1.setText("服务器名称");jLabel1.setBounds(new Rectangle(20, 22, 87, 28)); contentPane.setLayout(null);this.setSize(new Dimension(540, 350));this.setResizable(false);this.setLocation(350,200);this.setTitle("客户端");jTextField1.setBounds(new Rectangle(114, 26, 108, 24)); jLabel2.setBounds(new Rectangle(250, 25, 72, 28)); jLabel2.setText("端口号");jLabel2.setFont(new java.awt.Font("宋体", 0, 14)); jTextField2.setBounds(new Rectangle(320, 27, 108, 24));jButton1.setBounds(new Rectangle(440, 28, 73, 25)); jButton1.setFont(new java.awt.Font("Dialog", 0, 14)); jButton1.setBorder(BorderFactory.createEtchedBorder()); jButton1.setActionCommand("jButton1");jButton1.setText("连接");jLabel3.setBounds(new Rectangle(23, 57, 87, 28));jLabel3.setText("请输入信息");jLabel3.setFont(new java.awt.Font("宋体", 0, 14)); jTextField3.setBounds(new Rectangle(114, 60, 314, 24));jButton2.setText("发送");jButton2.setActionCommand("jButton1");jButton2.setBorder(BorderFactory.createEtchedBorder()); jButton2.setFont(new java.awt.Font("Dialog", 0, 14)); jButton2.setBounds(new Rectangle(440, 58, 73, 25)); jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189));contentPane.add(jLabel1, null);contentPane.add(jTextField1, null);contentPane.add(jLabel2, null);contentPane.add(jTextField2, null);contentPane.add(jButton1, null);contentPane.add(jLabel3, null);contentPane.add(jTextField3, null);contentPane.add(jButton2, null);contentPane.add(jScrollPane1, null);jScrollPane1.getViewport().add(jTextArea1, null); jButton1.addActionListener(this);jButton2.addActionListener(this);this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){try{socket.close();instr.close();os.close();System.exit(0);}catch(Exception ex){ex.printStackTrace();}}});}public static void main(String arg[]){JFrame.setDefaultLookAndFeelDecorated(true);SocketClient frm=new SocketClient();frm.setVisible(true);}}服务端界面服务端代码package lzf.socket;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import .*;public class SocketServer extends JFrame implements ActionListener{ static {try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch (Exception e) {e.printStackTrace();}}JPanel contentPane;JLabel jLabel2 = new JLabel();JTextField jTextField2 = new JTextField("4700");JButton jButton1 = new JButton();JLabel jLabel3 = new JLabel();JTextField jTextField3 = new JTextField();JButton jButton2 = new JButton();JScrollPane jScrollPane1 = new JScrollPane();JTextArea jTextArea1 = new JTextArea();ServerSocket server = null;Socket socket = null;BufferedReader instr =null;PrintWriter os=null ;//Construct the framepublic SocketServer() {jbInit();}class MyThread extends Thread{//该线程负责接受数据public void run(){try{while(true){Thread.sleep(100);instr= new BufferedReader(newInputStreamReader(socket.getInputStream()));if(instr.ready()){ //检查是否有数据jTextArea1.append("客户端: "+instr.readLine()+"\n");}}}catch(Exception ex){}}}public void actionPerformed(ActionEvent e){if(e.getSource()==jButton1){int port=Integer.parseInt(jTextField2.getText().trim());listenClient(port);}if(e.getSource()==jButton2){String s=this.jTextField3.getText().trim();sendData(s);}}private void listenClient(int port){//侦听try{if(jButton1.getText().trim().equals("侦听")){server = new ServerSocket(port);jButton1.setText("正在侦听...");socket=server.accept();//等待,一直到客户端连接才望下执行 sendData("已经成功连接。