计算机网络实验报告.docx
《计算机网络实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
计算机网络实验报告
计算机网络
实验报告
姓名:
胡松
学号:
0909123006
院系:
信息科学与工程学院
专业:
物联网工程
班级:
1202班
实验一网络路由层协议模拟实验
网络路由算法是路由器工作的核心,本实验针对因特网常用的距离向量路由算法和链路状态路由算法进行模拟实现,进一步掌握其工作原理及其相关性能。
一、实验目的和要求
1.掌握VB、VC++、VS或JAVA等集成开发环境编写路由仿真程序的方法;
2.理解并掌握距离向量路由协议和链路状态路由协议的工作原理。
二、实验内容
模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。
基本要求(动态生成网络拓扑图,节点间的距离随机生成。
从初始路由表开始,进行交换路由表,演示每轮交换后的路由表的变化。
观察和讨论多少轮交换后路由表稳定)
三、编程语言和环境
1.编程语言C/C++/C#/Java等均可;
2.编程环境Windows(MSVisual系列,VC/VB/VS.Net;)和Linux(编辑器vi+编译器GCC)均可;
四、实验具体设计
1.数据结构
typedefstruct
{
intdis;//存延迟大小
intfrom;//存邻居节点的路由
}RoutNode;
2.函数
voidInitData(FILE*pfile);/*从数据文件读取数据,初始化路由表*/
voidOutputRoutData();/*输出所有的路由表*/
voidCommunication(intrecv,intsend);/*send点向recv点发送自己的路由表*/
voidExchange();/*所有节点进行一次数据交换,更新路由表*/
五、实验结果
六、实验总结:
在距离矢量路由算法中,每个路由器维护一张路由表,表中列出当前已知的到每个目标的距离以及所使用的链路。
每张表又通过不断与邻居节点交换信息而不断更新,最终得出任意两个节点间的最短路径。
通过这个实验,我对于该算法的本质了解更加深入,同时也锻炼了编程能力。
七、源代码:
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"//atoi的头文件
//#include"alloc.h"
#definePATH"G:
\\1.txt"
#defineROUTNUM7//定义路由的个数为7个
RoutNodedata[ROUTNUM][ROUTNUM];/*路由表,能存7行7列数据,数据为权值*/
voidmain()
intstart,end,j;
FILE*pfile;
pfile=fopen(PATH,"r");
if(pfile==NULL)
printf("文件打开错误,按任意键退出.\n");
getch();
return;
}
else
printf("\n路由表初始:
\n");
InitData(pfile);
fclose(pfile);
for(inti=0;i{printf("%c||",i+65);for(j=0;jif(data[i][j].dis>0)printf("<%c%d>",j+65,data[i][j].dis);printf("\n");}//显示各路由的路由表for(i=0;i{Exchange();}printf("\n路由表交换:\n");OutputRoutData();printf("输入起始路由节点数字(%d-%d)[0代表A,1代表B...]:",0,ROUTNUM-1);scanf("%d",&start);printf("输入终点路由节点数字(%d-%d)[0代表A,1代表B...]:",0,ROUTNUM-1);scanf("%d",&end);if(start==end||start<0||start>6||end<0||end>6){printf("\n输入错误,请按任意键退出\n");getch();return;}else{intcur=start;inttotal=0;if(data[start][end].dis<0){printf("没有路由路径发现!\n");getch();return;}printf("%c->",cur+65);while(data[cur][end].from>=0)//起始点与终点不相连。0是A{total+=data[cur][data[cur][end].from].dis;//total变成cur与下一跳的延迟printf("%c->",data[cur][end].from+65);cur=data[cur][end].from;//起始路由变成下一跳}total+=data[cur][end].dis;printf("%c\n总的路由距离=%d",end+65,total);getch();return;}}voidInitData(FILE*pfile){charnum[10];inti=0;charc;intm,n;fseek(pfile,0,0);//读取文件,起始位置0,偏移量0;for(m=0;!feof(pfile)&&m<7;m++)//feof(pfile),文件尾返回1,不是返回0.即不是文件尾部且m<7循环.{for(n=0;!feof(pfile)&&n<7;n++){while(!feof(pfile)){c=fgetc(pfile);//读取单个字节if(c==',')//读完一个数字{num[i]='\0';//赋值为空data[m][n].dis=atoi(num);//atoi将字符转换成整数,并将路由权值赋给data[][].disdata[m][n].from=-1;//将邻居的路由权值全都赋值为-1i=0;break;}/*endofif*/elseif((c>='0'&&c<='9')||c=='-')//如果读到数字或符号.本题路由权值只能0到9{num[i++]=c;}/*endofelseif*/}/*endofwhile*/}/*endoffor(n=0*/}/*endoffor(m=0*/}voidOutputRoutData(){inti,j;printf("");for(i=0;i{printf("%c",i+65);}printf("\n");for(i=0;i{printf("%c",i+65);for(j=0;j{if(data[i][j].dis<0)//如果无路径printf("-");elseif(data[i][j].dis>=10)printf("%d",data[i][j].dis);elseprintf("%d",data[i][j].dis);if(data[i][j].from<0)//如果未经过其它节点所以直接相连的路由下一跳为-1printf("-");elseprintf("%c",data[i][j].from+65);//输出下一跳路由}printf("\n");}}voidCommunication(intrecv,intsend)//相连的两路由recv和send交换数据计算一次得到暂时最短距离{inti;for(i=0;i{if(data[send][i].dis>0)//如果send节点到i号节点有路线{if(data[recv][i].dis<0)//如果recv到i号节点无路径{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//第一种recv不予i相连,recv到不与他相连的i的延迟data[recv][i].from=send;//下一跳为send}elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//第二种recv与i相连,且直接相连值大于间接到i的延迟//如果现有路径比新路径远{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//将recv到i的延迟改为间接延迟的值data[recv][i].from=send;//下一跳改为send}}}}voidExchange()//实现所有相连的两路由进行数据交换并计算最短数值{inti,j;for(i=0;i{for(j=0;j{if(data[i][j].dis>0)//如果两个节点之间有路径{Communication(j,i);//将i号节点的路由表发送给j号节点}}}}实验二:Socket通信实验一、实验目的与要求1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;2.掌握客户/服务器(C/S)应用的工作方式;3.学习网络中进程之间通信的原理和实现方法;4.理解单播、组播和广播的原理并比较其不同之处;5.要求本机既是客户端又是服务器端;二、实验内容与原理实现实验内容:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。三、实验的具体设计实验代码包含四个类:ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.javaClientFrame.java为客户端线程ServerFrame.java为服务器端线程Message.java为存放消息的类SocketUtil.java此类管理获得连接四、实验结果 五、实验总结本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。然后客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。六、源代码:packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.border.EmptyBorder;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassClientFrameextendsJFrame{privateJPanelcontentPane;privateJTextFieldtextSend;privateJTextAreamsgArea;privateServerSocketss;//监听器privateSocketsocket;privateObjectInputStreamin;privateObjectOutputStreamout;privatebooleanisExit=false;privateSocketUtilutil;/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClientFrameframe=newClientFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheframe.*/publicClientFrame(){setTitle("\u5BA2\u6237\u7AEF");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){util.close();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,592,396);contentPane=newJPanel();contentPane.setBorder(newEmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JScrollPanescrollPane=newJScrollPane();scrollPane.setBounds(10,10,556,281);contentPane.add(scrollPane);msgArea=newJTextArea();scrollPane.setViewportView(msgArea);textSend=newJTextField();textSend.setBounds(10,301,457,21);contentPane.add(textSend);textSend.setColumns(10);JButtonbtnSend=newJButton("\u53D1\u9001");btnSend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){util.send();}});btnSend.setBounds(477,300,93,23);contentPane.add(btnSend);util=newSocketUtil(msgArea,textSend,1);}packagecom.my;importjava.io.Serializable;publicclassMessageimplementsSerializable{privateStringmsg_send_name;privateStringmsg_recv_name;privateStringmsg_content;privateStringmsg_time;publicStringgetMsg_send_name(){returnmsg_send_name;}publicvoidsetMsg_send_name(Stringmsg_send_name){this.msg_send_name=msg_send_name;}publicStringgetMsg_recv_name(){returnmsg_recv_name;}publicvoidsetMsg_recv_name(Stringmsg_recv_name){this.msg_recv_name=msg_recv_name;}publicStringgetMsg_content(){returnmsg_content;}publicvoidsetMsg_content(Stringmsg_content){this.msg_content=msg_content;}publicStringgetMsg_time(){returnmsg_time;}publicvoidsetMsg_time(Stringmsg_time){this.msg_time=msg_time;}publicMessage(Stringmsg_send_name,Stringmsg_recv_name,Stringmsg_content,Stringmsg_time){super();this.msg_send_name=msg_send_name;this.msg_recv_name=msg_recv_name;this.msg_content=msg_content;this.msg_time=msg_time;}publicMessage(){super();}packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;importja
printf("%c||",i+65);
for(j=0;jif(data[i][j].dis>0)printf("<%c%d>",j+65,data[i][j].dis);printf("\n");}//显示各路由的路由表for(i=0;i{Exchange();}printf("\n路由表交换:\n");OutputRoutData();printf("输入起始路由节点数字(%d-%d)[0代表A,1代表B...]:",0,ROUTNUM-1);scanf("%d",&start);printf("输入终点路由节点数字(%d-%d)[0代表A,1代表B...]:",0,ROUTNUM-1);scanf("%d",&end);if(start==end||start<0||start>6||end<0||end>6){printf("\n输入错误,请按任意键退出\n");getch();return;}else{intcur=start;inttotal=0;if(data[start][end].dis<0){printf("没有路由路径发现!\n");getch();return;}printf("%c->",cur+65);while(data[cur][end].from>=0)//起始点与终点不相连。0是A{total+=data[cur][data[cur][end].from].dis;//total变成cur与下一跳的延迟printf("%c->",data[cur][end].from+65);cur=data[cur][end].from;//起始路由变成下一跳}total+=data[cur][end].dis;printf("%c\n总的路由距离=%d",end+65,total);getch();return;}}voidInitData(FILE*pfile){charnum[10];inti=0;charc;intm,n;fseek(pfile,0,0);//读取文件,起始位置0,偏移量0;for(m=0;!feof(pfile)&&m<7;m++)//feof(pfile),文件尾返回1,不是返回0.即不是文件尾部且m<7循环.{for(n=0;!feof(pfile)&&n<7;n++){while(!feof(pfile)){c=fgetc(pfile);//读取单个字节if(c==',')//读完一个数字{num[i]='\0';//赋值为空data[m][n].dis=atoi(num);//atoi将字符转换成整数,并将路由权值赋给data[][].disdata[m][n].from=-1;//将邻居的路由权值全都赋值为-1i=0;break;}/*endofif*/elseif((c>='0'&&c<='9')||c=='-')//如果读到数字或符号.本题路由权值只能0到9{num[i++]=c;}/*endofelseif*/}/*endofwhile*/}/*endoffor(n=0*/}/*endoffor(m=0*/}voidOutputRoutData(){inti,j;printf("");for(i=0;i{printf("%c",i+65);}printf("\n");for(i=0;i{printf("%c",i+65);for(j=0;j{if(data[i][j].dis<0)//如果无路径printf("-");elseif(data[i][j].dis>=10)printf("%d",data[i][j].dis);elseprintf("%d",data[i][j].dis);if(data[i][j].from<0)//如果未经过其它节点所以直接相连的路由下一跳为-1printf("-");elseprintf("%c",data[i][j].from+65);//输出下一跳路由}printf("\n");}}voidCommunication(intrecv,intsend)//相连的两路由recv和send交换数据计算一次得到暂时最短距离{inti;for(i=0;i{if(data[send][i].dis>0)//如果send节点到i号节点有路线{if(data[recv][i].dis<0)//如果recv到i号节点无路径{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//第一种recv不予i相连,recv到不与他相连的i的延迟data[recv][i].from=send;//下一跳为send}elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//第二种recv与i相连,且直接相连值大于间接到i的延迟//如果现有路径比新路径远{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//将recv到i的延迟改为间接延迟的值data[recv][i].from=send;//下一跳改为send}}}}voidExchange()//实现所有相连的两路由进行数据交换并计算最短数值{inti,j;for(i=0;i{for(j=0;j{if(data[i][j].dis>0)//如果两个节点之间有路径{Communication(j,i);//将i号节点的路由表发送给j号节点}}}}实验二:Socket通信实验一、实验目的与要求1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;2.掌握客户/服务器(C/S)应用的工作方式;3.学习网络中进程之间通信的原理和实现方法;4.理解单播、组播和广播的原理并比较其不同之处;5.要求本机既是客户端又是服务器端;二、实验内容与原理实现实验内容:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。三、实验的具体设计实验代码包含四个类:ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.javaClientFrame.java为客户端线程ServerFrame.java为服务器端线程Message.java为存放消息的类SocketUtil.java此类管理获得连接四、实验结果 五、实验总结本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。然后客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。六、源代码:packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.border.EmptyBorder;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassClientFrameextendsJFrame{privateJPanelcontentPane;privateJTextFieldtextSend;privateJTextAreamsgArea;privateServerSocketss;//监听器privateSocketsocket;privateObjectInputStreamin;privateObjectOutputStreamout;privatebooleanisExit=false;privateSocketUtilutil;/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClientFrameframe=newClientFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheframe.*/publicClientFrame(){setTitle("\u5BA2\u6237\u7AEF");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){util.close();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,592,396);contentPane=newJPanel();contentPane.setBorder(newEmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JScrollPanescrollPane=newJScrollPane();scrollPane.setBounds(10,10,556,281);contentPane.add(scrollPane);msgArea=newJTextArea();scrollPane.setViewportView(msgArea);textSend=newJTextField();textSend.setBounds(10,301,457,21);contentPane.add(textSend);textSend.setColumns(10);JButtonbtnSend=newJButton("\u53D1\u9001");btnSend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){util.send();}});btnSend.setBounds(477,300,93,23);contentPane.add(btnSend);util=newSocketUtil(msgArea,textSend,1);}packagecom.my;importjava.io.Serializable;publicclassMessageimplementsSerializable{privateStringmsg_send_name;privateStringmsg_recv_name;privateStringmsg_content;privateStringmsg_time;publicStringgetMsg_send_name(){returnmsg_send_name;}publicvoidsetMsg_send_name(Stringmsg_send_name){this.msg_send_name=msg_send_name;}publicStringgetMsg_recv_name(){returnmsg_recv_name;}publicvoidsetMsg_recv_name(Stringmsg_recv_name){this.msg_recv_name=msg_recv_name;}publicStringgetMsg_content(){returnmsg_content;}publicvoidsetMsg_content(Stringmsg_content){this.msg_content=msg_content;}publicStringgetMsg_time(){returnmsg_time;}publicvoidsetMsg_time(Stringmsg_time){this.msg_time=msg_time;}publicMessage(Stringmsg_send_name,Stringmsg_recv_name,Stringmsg_content,Stringmsg_time){super();this.msg_send_name=msg_send_name;this.msg_recv_name=msg_recv_name;this.msg_content=msg_content;this.msg_time=msg_time;}publicMessage(){super();}packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;importja
if(data[i][j].dis>0)
printf("<%c%d>",j+65,data[i][j].dis);
printf("\n");
}//显示各路由的路由表
for(i=0;i{Exchange();}printf("\n路由表交换:\n");OutputRoutData();printf("输入起始路由节点数字(%d-%d)[0代表A,1代表B...]:",0,ROUTNUM-1);scanf("%d",&start);printf("输入终点路由节点数字(%d-%d)[0代表A,1代表B...]:",0,ROUTNUM-1);scanf("%d",&end);if(start==end||start<0||start>6||end<0||end>6){printf("\n输入错误,请按任意键退出\n");getch();return;}else{intcur=start;inttotal=0;if(data[start][end].dis<0){printf("没有路由路径发现!\n");getch();return;}printf("%c->",cur+65);while(data[cur][end].from>=0)//起始点与终点不相连。0是A{total+=data[cur][data[cur][end].from].dis;//total变成cur与下一跳的延迟printf("%c->",data[cur][end].from+65);cur=data[cur][end].from;//起始路由变成下一跳}total+=data[cur][end].dis;printf("%c\n总的路由距离=%d",end+65,total);getch();return;}}voidInitData(FILE*pfile){charnum[10];inti=0;charc;intm,n;fseek(pfile,0,0);//读取文件,起始位置0,偏移量0;for(m=0;!feof(pfile)&&m<7;m++)//feof(pfile),文件尾返回1,不是返回0.即不是文件尾部且m<7循环.{for(n=0;!feof(pfile)&&n<7;n++){while(!feof(pfile)){c=fgetc(pfile);//读取单个字节if(c==',')//读完一个数字{num[i]='\0';//赋值为空data[m][n].dis=atoi(num);//atoi将字符转换成整数,并将路由权值赋给data[][].disdata[m][n].from=-1;//将邻居的路由权值全都赋值为-1i=0;break;}/*endofif*/elseif((c>='0'&&c<='9')||c=='-')//如果读到数字或符号.本题路由权值只能0到9{num[i++]=c;}/*endofelseif*/}/*endofwhile*/}/*endoffor(n=0*/}/*endoffor(m=0*/}voidOutputRoutData(){inti,j;printf("");for(i=0;i{printf("%c",i+65);}printf("\n");for(i=0;i{printf("%c",i+65);for(j=0;j{if(data[i][j].dis<0)//如果无路径printf("-");elseif(data[i][j].dis>=10)printf("%d",data[i][j].dis);elseprintf("%d",data[i][j].dis);if(data[i][j].from<0)//如果未经过其它节点所以直接相连的路由下一跳为-1printf("-");elseprintf("%c",data[i][j].from+65);//输出下一跳路由}printf("\n");}}voidCommunication(intrecv,intsend)//相连的两路由recv和send交换数据计算一次得到暂时最短距离{inti;for(i=0;i{if(data[send][i].dis>0)//如果send节点到i号节点有路线{if(data[recv][i].dis<0)//如果recv到i号节点无路径{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//第一种recv不予i相连,recv到不与他相连的i的延迟data[recv][i].from=send;//下一跳为send}elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//第二种recv与i相连,且直接相连值大于间接到i的延迟//如果现有路径比新路径远{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//将recv到i的延迟改为间接延迟的值data[recv][i].from=send;//下一跳改为send}}}}voidExchange()//实现所有相连的两路由进行数据交换并计算最短数值{inti,j;for(i=0;i{for(j=0;j{if(data[i][j].dis>0)//如果两个节点之间有路径{Communication(j,i);//将i号节点的路由表发送给j号节点}}}}实验二:Socket通信实验一、实验目的与要求1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;2.掌握客户/服务器(C/S)应用的工作方式;3.学习网络中进程之间通信的原理和实现方法;4.理解单播、组播和广播的原理并比较其不同之处;5.要求本机既是客户端又是服务器端;二、实验内容与原理实现实验内容:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。三、实验的具体设计实验代码包含四个类:ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.javaClientFrame.java为客户端线程ServerFrame.java为服务器端线程Message.java为存放消息的类SocketUtil.java此类管理获得连接四、实验结果 五、实验总结本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。然后客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。六、源代码:packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.border.EmptyBorder;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassClientFrameextendsJFrame{privateJPanelcontentPane;privateJTextFieldtextSend;privateJTextAreamsgArea;privateServerSocketss;//监听器privateSocketsocket;privateObjectInputStreamin;privateObjectOutputStreamout;privatebooleanisExit=false;privateSocketUtilutil;/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClientFrameframe=newClientFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheframe.*/publicClientFrame(){setTitle("\u5BA2\u6237\u7AEF");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){util.close();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,592,396);contentPane=newJPanel();contentPane.setBorder(newEmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JScrollPanescrollPane=newJScrollPane();scrollPane.setBounds(10,10,556,281);contentPane.add(scrollPane);msgArea=newJTextArea();scrollPane.setViewportView(msgArea);textSend=newJTextField();textSend.setBounds(10,301,457,21);contentPane.add(textSend);textSend.setColumns(10);JButtonbtnSend=newJButton("\u53D1\u9001");btnSend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){util.send();}});btnSend.setBounds(477,300,93,23);contentPane.add(btnSend);util=newSocketUtil(msgArea,textSend,1);}packagecom.my;importjava.io.Serializable;publicclassMessageimplementsSerializable{privateStringmsg_send_name;privateStringmsg_recv_name;privateStringmsg_content;privateStringmsg_time;publicStringgetMsg_send_name(){returnmsg_send_name;}publicvoidsetMsg_send_name(Stringmsg_send_name){this.msg_send_name=msg_send_name;}publicStringgetMsg_recv_name(){returnmsg_recv_name;}publicvoidsetMsg_recv_name(Stringmsg_recv_name){this.msg_recv_name=msg_recv_name;}publicStringgetMsg_content(){returnmsg_content;}publicvoidsetMsg_content(Stringmsg_content){this.msg_content=msg_content;}publicStringgetMsg_time(){returnmsg_time;}publicvoidsetMsg_time(Stringmsg_time){this.msg_time=msg_time;}publicMessage(Stringmsg_send_name,Stringmsg_recv_name,Stringmsg_content,Stringmsg_time){super();this.msg_send_name=msg_send_name;this.msg_recv_name=msg_recv_name;this.msg_content=msg_content;this.msg_time=msg_time;}publicMessage(){super();}packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;importja
Exchange();
printf("\n路由表交换:
OutputRoutData();
printf("输入起始路由节点数字(%d-%d)[0代表A,1代表B...]:
",0,ROUTNUM-1);
scanf("%d",&start);
printf("输入终点路由节点数字(%d-%d)[0代表A,1代表B...]:
scanf("%d",&end);
if(start==end||start<0||start>6||end<0||end>6)
printf("\n输入错误,请按任意键退出\n");
intcur=start;
inttotal=0;
if(data[start][end].dis<0)
printf("没有路由路径发现!
printf("%c->",cur+65);
while(data[cur][end].from>=0)//起始点与终点不相连。
0是A
total+=data[cur][data[cur][end].from].dis;//total变成cur与下一跳的延迟
printf("%c->",data[cur][end].from+65);
cur=data[cur][end].from;//起始路由变成下一跳
total+=data[cur][end].dis;
printf("%c\n总的路由距离=%d",end+65,total);
voidInitData(FILE*pfile)
charnum[10];
inti=0;
charc;
intm,n;
fseek(pfile,0,0);//读取文件,起始位置0,偏移量0;
for(m=0;!
feof(pfile)&&m<7;m++)//feof(pfile),文件尾返回1,不是返回0.即不是文件尾部且m<7循环.
for(n=0;!
feof(pfile)&&n<7;n++)
while(!
feof(pfile))
c=fgetc(pfile);//读取单个字节
if(c==',')//读完一个数字
num[i]='\0';//赋值为空
data[m][n].dis=atoi(num);//atoi将字符转换成整数,并将路由权值赋给data[][].dis
data[m][n].from=-1;//将邻居的路由权值全都赋值为-1
i=0;
break;
}/*endofif*/
elseif((c>='0'&&c<='9')||c=='-')//如果读到数字或符号.本题路由权值只能0到9
num[i++]=c;
}/*endofelseif*/
}/*endofwhile*/
}/*endoffor(n=0*/
}/*endoffor(m=0*/
voidOutputRoutData()
inti,j;
printf("");
for(i=0;i{printf("%c",i+65);}printf("\n");for(i=0;i{printf("%c",i+65);for(j=0;j{if(data[i][j].dis<0)//如果无路径printf("-");elseif(data[i][j].dis>=10)printf("%d",data[i][j].dis);elseprintf("%d",data[i][j].dis);if(data[i][j].from<0)//如果未经过其它节点所以直接相连的路由下一跳为-1printf("-");elseprintf("%c",data[i][j].from+65);//输出下一跳路由}printf("\n");}}voidCommunication(intrecv,intsend)//相连的两路由recv和send交换数据计算一次得到暂时最短距离{inti;for(i=0;i{if(data[send][i].dis>0)//如果send节点到i号节点有路线{if(data[recv][i].dis<0)//如果recv到i号节点无路径{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//第一种recv不予i相连,recv到不与他相连的i的延迟data[recv][i].from=send;//下一跳为send}elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//第二种recv与i相连,且直接相连值大于间接到i的延迟//如果现有路径比新路径远{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//将recv到i的延迟改为间接延迟的值data[recv][i].from=send;//下一跳改为send}}}}voidExchange()//实现所有相连的两路由进行数据交换并计算最短数值{inti,j;for(i=0;i{for(j=0;j{if(data[i][j].dis>0)//如果两个节点之间有路径{Communication(j,i);//将i号节点的路由表发送给j号节点}}}}实验二:Socket通信实验一、实验目的与要求1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;2.掌握客户/服务器(C/S)应用的工作方式;3.学习网络中进程之间通信的原理和实现方法;4.理解单播、组播和广播的原理并比较其不同之处;5.要求本机既是客户端又是服务器端;二、实验内容与原理实现实验内容:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。三、实验的具体设计实验代码包含四个类:ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.javaClientFrame.java为客户端线程ServerFrame.java为服务器端线程Message.java为存放消息的类SocketUtil.java此类管理获得连接四、实验结果 五、实验总结本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。然后客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。六、源代码:packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.border.EmptyBorder;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassClientFrameextendsJFrame{privateJPanelcontentPane;privateJTextFieldtextSend;privateJTextAreamsgArea;privateServerSocketss;//监听器privateSocketsocket;privateObjectInputStreamin;privateObjectOutputStreamout;privatebooleanisExit=false;privateSocketUtilutil;/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClientFrameframe=newClientFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheframe.*/publicClientFrame(){setTitle("\u5BA2\u6237\u7AEF");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){util.close();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,592,396);contentPane=newJPanel();contentPane.setBorder(newEmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JScrollPanescrollPane=newJScrollPane();scrollPane.setBounds(10,10,556,281);contentPane.add(scrollPane);msgArea=newJTextArea();scrollPane.setViewportView(msgArea);textSend=newJTextField();textSend.setBounds(10,301,457,21);contentPane.add(textSend);textSend.setColumns(10);JButtonbtnSend=newJButton("\u53D1\u9001");btnSend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){util.send();}});btnSend.setBounds(477,300,93,23);contentPane.add(btnSend);util=newSocketUtil(msgArea,textSend,1);}packagecom.my;importjava.io.Serializable;publicclassMessageimplementsSerializable{privateStringmsg_send_name;privateStringmsg_recv_name;privateStringmsg_content;privateStringmsg_time;publicStringgetMsg_send_name(){returnmsg_send_name;}publicvoidsetMsg_send_name(Stringmsg_send_name){this.msg_send_name=msg_send_name;}publicStringgetMsg_recv_name(){returnmsg_recv_name;}publicvoidsetMsg_recv_name(Stringmsg_recv_name){this.msg_recv_name=msg_recv_name;}publicStringgetMsg_content(){returnmsg_content;}publicvoidsetMsg_content(Stringmsg_content){this.msg_content=msg_content;}publicStringgetMsg_time(){returnmsg_time;}publicvoidsetMsg_time(Stringmsg_time){this.msg_time=msg_time;}publicMessage(Stringmsg_send_name,Stringmsg_recv_name,Stringmsg_content,Stringmsg_time){super();this.msg_send_name=msg_send_name;this.msg_recv_name=msg_recv_name;this.msg_content=msg_content;this.msg_time=msg_time;}publicMessage(){super();}packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;importja
printf("%c",i+65);
for(i=0;i{printf("%c",i+65);for(j=0;j{if(data[i][j].dis<0)//如果无路径printf("-");elseif(data[i][j].dis>=10)printf("%d",data[i][j].dis);elseprintf("%d",data[i][j].dis);if(data[i][j].from<0)//如果未经过其它节点所以直接相连的路由下一跳为-1printf("-");elseprintf("%c",data[i][j].from+65);//输出下一跳路由}printf("\n");}}voidCommunication(intrecv,intsend)//相连的两路由recv和send交换数据计算一次得到暂时最短距离{inti;for(i=0;i{if(data[send][i].dis>0)//如果send节点到i号节点有路线{if(data[recv][i].dis<0)//如果recv到i号节点无路径{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//第一种recv不予i相连,recv到不与他相连的i的延迟data[recv][i].from=send;//下一跳为send}elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//第二种recv与i相连,且直接相连值大于间接到i的延迟//如果现有路径比新路径远{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//将recv到i的延迟改为间接延迟的值data[recv][i].from=send;//下一跳改为send}}}}voidExchange()//实现所有相连的两路由进行数据交换并计算最短数值{inti,j;for(i=0;i{for(j=0;j{if(data[i][j].dis>0)//如果两个节点之间有路径{Communication(j,i);//将i号节点的路由表发送给j号节点}}}}实验二:Socket通信实验一、实验目的与要求1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;2.掌握客户/服务器(C/S)应用的工作方式;3.学习网络中进程之间通信的原理和实现方法;4.理解单播、组播和广播的原理并比较其不同之处;5.要求本机既是客户端又是服务器端;二、实验内容与原理实现实验内容:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。三、实验的具体设计实验代码包含四个类:ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.javaClientFrame.java为客户端线程ServerFrame.java为服务器端线程Message.java为存放消息的类SocketUtil.java此类管理获得连接四、实验结果 五、实验总结本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。然后客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。六、源代码:packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.border.EmptyBorder;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassClientFrameextendsJFrame{privateJPanelcontentPane;privateJTextFieldtextSend;privateJTextAreamsgArea;privateServerSocketss;//监听器privateSocketsocket;privateObjectInputStreamin;privateObjectOutputStreamout;privatebooleanisExit=false;privateSocketUtilutil;/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClientFrameframe=newClientFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheframe.*/publicClientFrame(){setTitle("\u5BA2\u6237\u7AEF");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){util.close();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,592,396);contentPane=newJPanel();contentPane.setBorder(newEmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JScrollPanescrollPane=newJScrollPane();scrollPane.setBounds(10,10,556,281);contentPane.add(scrollPane);msgArea=newJTextArea();scrollPane.setViewportView(msgArea);textSend=newJTextField();textSend.setBounds(10,301,457,21);contentPane.add(textSend);textSend.setColumns(10);JButtonbtnSend=newJButton("\u53D1\u9001");btnSend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){util.send();}});btnSend.setBounds(477,300,93,23);contentPane.add(btnSend);util=newSocketUtil(msgArea,textSend,1);}packagecom.my;importjava.io.Serializable;publicclassMessageimplementsSerializable{privateStringmsg_send_name;privateStringmsg_recv_name;privateStringmsg_content;privateStringmsg_time;publicStringgetMsg_send_name(){returnmsg_send_name;}publicvoidsetMsg_send_name(Stringmsg_send_name){this.msg_send_name=msg_send_name;}publicStringgetMsg_recv_name(){returnmsg_recv_name;}publicvoidsetMsg_recv_name(Stringmsg_recv_name){this.msg_recv_name=msg_recv_name;}publicStringgetMsg_content(){returnmsg_content;}publicvoidsetMsg_content(Stringmsg_content){this.msg_content=msg_content;}publicStringgetMsg_time(){returnmsg_time;}publicvoidsetMsg_time(Stringmsg_time){this.msg_time=msg_time;}publicMessage(Stringmsg_send_name,Stringmsg_recv_name,Stringmsg_content,Stringmsg_time){super();this.msg_send_name=msg_send_name;this.msg_recv_name=msg_recv_name;this.msg_content=msg_content;this.msg_time=msg_time;}publicMessage(){super();}packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;importja
for(j=0;j{if(data[i][j].dis<0)//如果无路径printf("-");elseif(data[i][j].dis>=10)printf("%d",data[i][j].dis);elseprintf("%d",data[i][j].dis);if(data[i][j].from<0)//如果未经过其它节点所以直接相连的路由下一跳为-1printf("-");elseprintf("%c",data[i][j].from+65);//输出下一跳路由}printf("\n");}}voidCommunication(intrecv,intsend)//相连的两路由recv和send交换数据计算一次得到暂时最短距离{inti;for(i=0;i{if(data[send][i].dis>0)//如果send节点到i号节点有路线{if(data[recv][i].dis<0)//如果recv到i号节点无路径{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//第一种recv不予i相连,recv到不与他相连的i的延迟data[recv][i].from=send;//下一跳为send}elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//第二种recv与i相连,且直接相连值大于间接到i的延迟//如果现有路径比新路径远{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//将recv到i的延迟改为间接延迟的值data[recv][i].from=send;//下一跳改为send}}}}voidExchange()//实现所有相连的两路由进行数据交换并计算最短数值{inti,j;for(i=0;i{for(j=0;j{if(data[i][j].dis>0)//如果两个节点之间有路径{Communication(j,i);//将i号节点的路由表发送给j号节点}}}}实验二:Socket通信实验一、实验目的与要求1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;2.掌握客户/服务器(C/S)应用的工作方式;3.学习网络中进程之间通信的原理和实现方法;4.理解单播、组播和广播的原理并比较其不同之处;5.要求本机既是客户端又是服务器端;二、实验内容与原理实现实验内容:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。三、实验的具体设计实验代码包含四个类:ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.javaClientFrame.java为客户端线程ServerFrame.java为服务器端线程Message.java为存放消息的类SocketUtil.java此类管理获得连接四、实验结果 五、实验总结本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。然后客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。六、源代码:packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.border.EmptyBorder;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassClientFrameextendsJFrame{privateJPanelcontentPane;privateJTextFieldtextSend;privateJTextAreamsgArea;privateServerSocketss;//监听器privateSocketsocket;privateObjectInputStreamin;privateObjectOutputStreamout;privatebooleanisExit=false;privateSocketUtilutil;/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClientFrameframe=newClientFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheframe.*/publicClientFrame(){setTitle("\u5BA2\u6237\u7AEF");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){util.close();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,592,396);contentPane=newJPanel();contentPane.setBorder(newEmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JScrollPanescrollPane=newJScrollPane();scrollPane.setBounds(10,10,556,281);contentPane.add(scrollPane);msgArea=newJTextArea();scrollPane.setViewportView(msgArea);textSend=newJTextField();textSend.setBounds(10,301,457,21);contentPane.add(textSend);textSend.setColumns(10);JButtonbtnSend=newJButton("\u53D1\u9001");btnSend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){util.send();}});btnSend.setBounds(477,300,93,23);contentPane.add(btnSend);util=newSocketUtil(msgArea,textSend,1);}packagecom.my;importjava.io.Serializable;publicclassMessageimplementsSerializable{privateStringmsg_send_name;privateStringmsg_recv_name;privateStringmsg_content;privateStringmsg_time;publicStringgetMsg_send_name(){returnmsg_send_name;}publicvoidsetMsg_send_name(Stringmsg_send_name){this.msg_send_name=msg_send_name;}publicStringgetMsg_recv_name(){returnmsg_recv_name;}publicvoidsetMsg_recv_name(Stringmsg_recv_name){this.msg_recv_name=msg_recv_name;}publicStringgetMsg_content(){returnmsg_content;}publicvoidsetMsg_content(Stringmsg_content){this.msg_content=msg_content;}publicStringgetMsg_time(){returnmsg_time;}publicvoidsetMsg_time(Stringmsg_time){this.msg_time=msg_time;}publicMessage(Stringmsg_send_name,Stringmsg_recv_name,Stringmsg_content,Stringmsg_time){super();this.msg_send_name=msg_send_name;this.msg_recv_name=msg_recv_name;this.msg_content=msg_content;this.msg_time=msg_time;}publicMessage(){super();}packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;importja
if(data[i][j].dis<0)//如果无路径
printf("-");
if(data[i][j].dis>=10)
printf("%d",data[i][j].dis);
if(data[i][j].from<0)//如果未经过其它节点所以直接相连的路由下一跳为-1
printf("%c",data[i][j].from+65);//输出下一跳路由
voidCommunication(intrecv,intsend)//相连的两路由recv和send交换数据计算一次得到暂时最短距离
inti;
for(i=0;i{if(data[send][i].dis>0)//如果send节点到i号节点有路线{if(data[recv][i].dis<0)//如果recv到i号节点无路径{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//第一种recv不予i相连,recv到不与他相连的i的延迟data[recv][i].from=send;//下一跳为send}elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//第二种recv与i相连,且直接相连值大于间接到i的延迟//如果现有路径比新路径远{data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//将recv到i的延迟改为间接延迟的值data[recv][i].from=send;//下一跳改为send}}}}voidExchange()//实现所有相连的两路由进行数据交换并计算最短数值{inti,j;for(i=0;i{for(j=0;j{if(data[i][j].dis>0)//如果两个节点之间有路径{Communication(j,i);//将i号节点的路由表发送给j号节点}}}}实验二:Socket通信实验一、实验目的与要求1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;2.掌握客户/服务器(C/S)应用的工作方式;3.学习网络中进程之间通信的原理和实现方法;4.理解单播、组播和广播的原理并比较其不同之处;5.要求本机既是客户端又是服务器端;二、实验内容与原理实现实验内容:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。三、实验的具体设计实验代码包含四个类:ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.javaClientFrame.java为客户端线程ServerFrame.java为服务器端线程Message.java为存放消息的类SocketUtil.java此类管理获得连接四、实验结果 五、实验总结本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。然后客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。六、源代码:packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.border.EmptyBorder;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassClientFrameextendsJFrame{privateJPanelcontentPane;privateJTextFieldtextSend;privateJTextAreamsgArea;privateServerSocketss;//监听器privateSocketsocket;privateObjectInputStreamin;privateObjectOutputStreamout;privatebooleanisExit=false;privateSocketUtilutil;/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClientFrameframe=newClientFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheframe.*/publicClientFrame(){setTitle("\u5BA2\u6237\u7AEF");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){util.close();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,592,396);contentPane=newJPanel();contentPane.setBorder(newEmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JScrollPanescrollPane=newJScrollPane();scrollPane.setBounds(10,10,556,281);contentPane.add(scrollPane);msgArea=newJTextArea();scrollPane.setViewportView(msgArea);textSend=newJTextField();textSend.setBounds(10,301,457,21);contentPane.add(textSend);textSend.setColumns(10);JButtonbtnSend=newJButton("\u53D1\u9001");btnSend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){util.send();}});btnSend.setBounds(477,300,93,23);contentPane.add(btnSend);util=newSocketUtil(msgArea,textSend,1);}packagecom.my;importjava.io.Serializable;publicclassMessageimplementsSerializable{privateStringmsg_send_name;privateStringmsg_recv_name;privateStringmsg_content;privateStringmsg_time;publicStringgetMsg_send_name(){returnmsg_send_name;}publicvoidsetMsg_send_name(Stringmsg_send_name){this.msg_send_name=msg_send_name;}publicStringgetMsg_recv_name(){returnmsg_recv_name;}publicvoidsetMsg_recv_name(Stringmsg_recv_name){this.msg_recv_name=msg_recv_name;}publicStringgetMsg_content(){returnmsg_content;}publicvoidsetMsg_content(Stringmsg_content){this.msg_content=msg_content;}publicStringgetMsg_time(){returnmsg_time;}publicvoidsetMsg_time(Stringmsg_time){this.msg_time=msg_time;}publicMessage(Stringmsg_send_name,Stringmsg_recv_name,Stringmsg_content,Stringmsg_time){super();this.msg_send_name=msg_send_name;this.msg_recv_name=msg_recv_name;this.msg_content=msg_content;this.msg_time=msg_time;}publicMessage(){super();}packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;importja
if(data[send][i].dis>0)//如果send节点到i号节点有路线
if(data[recv][i].dis<0)//如果recv到i号节点无路径
data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//第一种recv不予i相连,recv到不与他相连的i的延迟
data[recv][i].from=send;//下一跳为send
elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//第二种recv与i相连,且直接相连值大于间接到i的延迟
//如果现有路径比新路径远
data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//将recv到i的延迟改为间接延迟的值
data[recv][i].from=send;//下一跳改为send
voidExchange()//实现所有相连的两路由进行数据交换并计算最短数值
for(i=0;i{for(j=0;j{if(data[i][j].dis>0)//如果两个节点之间有路径{Communication(j,i);//将i号节点的路由表发送给j号节点}}}}实验二:Socket通信实验一、实验目的与要求1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;2.掌握客户/服务器(C/S)应用的工作方式;3.学习网络中进程之间通信的原理和实现方法;4.理解单播、组播和广播的原理并比较其不同之处;5.要求本机既是客户端又是服务器端;二、实验内容与原理实现实验内容:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。三、实验的具体设计实验代码包含四个类:ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.javaClientFrame.java为客户端线程ServerFrame.java为服务器端线程Message.java为存放消息的类SocketUtil.java此类管理获得连接四、实验结果 五、实验总结本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。然后客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。六、源代码:packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.border.EmptyBorder;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassClientFrameextendsJFrame{privateJPanelcontentPane;privateJTextFieldtextSend;privateJTextAreamsgArea;privateServerSocketss;//监听器privateSocketsocket;privateObjectInputStreamin;privateObjectOutputStreamout;privatebooleanisExit=false;privateSocketUtilutil;/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClientFrameframe=newClientFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheframe.*/publicClientFrame(){setTitle("\u5BA2\u6237\u7AEF");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){util.close();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,592,396);contentPane=newJPanel();contentPane.setBorder(newEmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JScrollPanescrollPane=newJScrollPane();scrollPane.setBounds(10,10,556,281);contentPane.add(scrollPane);msgArea=newJTextArea();scrollPane.setViewportView(msgArea);textSend=newJTextField();textSend.setBounds(10,301,457,21);contentPane.add(textSend);textSend.setColumns(10);JButtonbtnSend=newJButton("\u53D1\u9001");btnSend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){util.send();}});btnSend.setBounds(477,300,93,23);contentPane.add(btnSend);util=newSocketUtil(msgArea,textSend,1);}packagecom.my;importjava.io.Serializable;publicclassMessageimplementsSerializable{privateStringmsg_send_name;privateStringmsg_recv_name;privateStringmsg_content;privateStringmsg_time;publicStringgetMsg_send_name(){returnmsg_send_name;}publicvoidsetMsg_send_name(Stringmsg_send_name){this.msg_send_name=msg_send_name;}publicStringgetMsg_recv_name(){returnmsg_recv_name;}publicvoidsetMsg_recv_name(Stringmsg_recv_name){this.msg_recv_name=msg_recv_name;}publicStringgetMsg_content(){returnmsg_content;}publicvoidsetMsg_content(Stringmsg_content){this.msg_content=msg_content;}publicStringgetMsg_time(){returnmsg_time;}publicvoidsetMsg_time(Stringmsg_time){this.msg_time=msg_time;}publicMessage(Stringmsg_send_name,Stringmsg_recv_name,Stringmsg_content,Stringmsg_time){super();this.msg_send_name=msg_send_name;this.msg_recv_name=msg_recv_name;this.msg_content=msg_content;this.msg_time=msg_time;}publicMessage(){super();}packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;importja
for(j=0;j{if(data[i][j].dis>0)//如果两个节点之间有路径{Communication(j,i);//将i号节点的路由表发送给j号节点}}}}实验二:Socket通信实验一、实验目的与要求1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;2.掌握客户/服务器(C/S)应用的工作方式;3.学习网络中进程之间通信的原理和实现方法;4.理解单播、组播和广播的原理并比较其不同之处;5.要求本机既是客户端又是服务器端;二、实验内容与原理实现实验内容:1.具有点对点通信功能,任意客户端之间能够发送消息;2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3.具有广播功能,客户端能够向所有其他成员广播消息;实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。三、实验的具体设计实验代码包含四个类:ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.javaClientFrame.java为客户端线程ServerFrame.java为服务器端线程Message.java为存放消息的类SocketUtil.java此类管理获得连接四、实验结果 五、实验总结本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。然后客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。六、源代码:packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.border.EmptyBorder;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassClientFrameextendsJFrame{privateJPanelcontentPane;privateJTextFieldtextSend;privateJTextAreamsgArea;privateServerSocketss;//监听器privateSocketsocket;privateObjectInputStreamin;privateObjectOutputStreamout;privatebooleanisExit=false;privateSocketUtilutil;/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClientFrameframe=newClientFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheframe.*/publicClientFrame(){setTitle("\u5BA2\u6237\u7AEF");addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){util.close();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,592,396);contentPane=newJPanel();contentPane.setBorder(newEmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JScrollPanescrollPane=newJScrollPane();scrollPane.setBounds(10,10,556,281);contentPane.add(scrollPane);msgArea=newJTextArea();scrollPane.setViewportView(msgArea);textSend=newJTextField();textSend.setBounds(10,301,457,21);contentPane.add(textSend);textSend.setColumns(10);JButtonbtnSend=newJButton("\u53D1\u9001");btnSend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){util.send();}});btnSend.setBounds(477,300,93,23);contentPane.add(btnSend);util=newSocketUtil(msgArea,textSend,1);}packagecom.my;importjava.io.Serializable;publicclassMessageimplementsSerializable{privateStringmsg_send_name;privateStringmsg_recv_name;privateStringmsg_content;privateStringmsg_time;publicStringgetMsg_send_name(){returnmsg_send_name;}publicvoidsetMsg_send_name(Stringmsg_send_name){this.msg_send_name=msg_send_name;}publicStringgetMsg_recv_name(){returnmsg_recv_name;}publicvoidsetMsg_recv_name(Stringmsg_recv_name){this.msg_recv_name=msg_recv_name;}publicStringgetMsg_content(){returnmsg_content;}publicvoidsetMsg_content(Stringmsg_content){this.msg_content=msg_content;}publicStringgetMsg_time(){returnmsg_time;}publicvoidsetMsg_time(Stringmsg_time){this.msg_time=msg_time;}publicMessage(Stringmsg_send_name,Stringmsg_recv_name,Stringmsg_content,Stringmsg_time){super();this.msg_send_name=msg_send_name;this.msg_recv_name=msg_recv_name;this.msg_content=msg_content;this.msg_time=msg_time;}publicMessage(){super();}packagecom.my;importjava.awt.BorderLayout;importjava.awt.EventQueue;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.PrintWriter;importja
if(data[i][j].dis>0)//如果两个节点之间有路径
Communication(j,i);//将i号节点的路由表发送给j号节点
实验二:
Socket通信实验
一、实验目的与要求
1.掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法;
2.掌握客户/服务器(C/S)应用的工作方式;
3.学习网络中进程之间通信的原理和实现方法;
4.理解单播、组播和广播的原理并比较其不同之处;
5.要求本机既是客户端又是服务器端;
二、实验内容与原理实现
实验内容:
1.具有点对点通信功能,任意客户端之间能够发送消息;
2.具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;
3.具有广播功能,客户端能够向所有其他成员广播消息;
实验原理:
Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。
Socket通常用来实现客户端和服务端的连接。
它既能接受请求,也能发送请求。
在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。
网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。
三、实验的具体设计
实验代码包含四个类:
ClientFrame.java,Message.java,ServerFrame.java,SocketUtil.java
ClientFrame.java为客户端线程
ServerFrame.java为服务器端线程
Message.java为存放消息的类
SocketUtil.java此类管理获得连接
四、实验结果
五、实验总结
本次实验让我更加深入地了解了套接字,即Socket的用法以及建立一个连接的基本步骤。
通过本实验我明白了无论一个socket通信的功能如何,它搭建的基本步骤都是一样的,即:
1、创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。
然后客户端连接的基本步骤也是一样的,即:
1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。
六、源代码:
packagecom.my;
importjava.awt.BorderLayout;
importjava.awt.EventQueue;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.io.PrintWriter;
import.ServerSocket;
import.Socket;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
importjavax.swing.border.EmptyBorder;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
publicclassClientFrameextendsJFrame{
privateJPanelcontentPane;
privateJTextFieldtextSend;
privateJTextAreamsgArea;
privateServerSocketss;//监听器
privateSocketsocket;
privateObjectInputStreamin;
privateObjectOutputStreamout;
privatebooleanisExit=false;
privateSocketUtilutil;
/**
*Launchtheapplication.
*/
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
try{
ClientFrameframe=newClientFrame();
frame.setVisible(true);
}catch(Exceptione){
e.printStackTrace();
});
*Createtheframe.
publicClientFrame(){
setTitle("\u5BA2\u6237\u7AEF");
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
util.close();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,592,396);
contentPane=newJPanel();
contentPane.setBorder(newEmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
JScrollPanescrollPane=newJScrollPane();
scrollPane.setBounds(10,10,556,281);
contentPane.add(scrollPane);
msgArea=newJTextArea();
scrollPane.setViewportView(msgArea);
textSend=newJTextField();
textSend.setBounds(10,301,457,21);
contentPane.add(textSend);
textSend.setColumns(10);
JButtonbtnSend=newJButton("\u53D1\u9001");
btnSend.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
util.send();
btnSend.setBounds(477,300,93,23);
contentPane.add(btnSend);
util=newSocketUtil(msgArea,textSend,1);
importjava.io.Serializable;
publicclassMessageimplementsSerializable{
privateStringmsg_send_name;
privateStringmsg_recv_name;
privateStringmsg_content;
privateStringmsg_time;
publicStringgetMsg_send_name(){
returnmsg_send_name;
publicvoidsetMsg_send_name(Stringmsg_send_name){
this.msg_send_name=msg_send_name;
publicStringgetMsg_recv_name(){
returnmsg_recv_name;
publicvoidsetMsg_recv_name(Stringmsg_recv_name){
this.msg_recv_name=msg_recv_name;
publicStringgetMsg_content(){
returnmsg_content;
publicvoidsetMsg_content(Stringmsg_content){
this.msg_content=msg_content;
publicStringgetMsg_time(){
returnmsg_time;
publicvoidsetMsg_time(Stringmsg_time){
this.msg_time=msg_time;
publicMessage(Stringmsg_send_name,Stringmsg_recv_name,
Stringmsg_content,Stringmsg_time){
super();
publicMessage(){
importja
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1