计算机网络实验报告.docx
《计算机网络实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
计算机网络实验报告
学生学号
实验课成绩
学生实验报告书
实验课程名称《计算机网络》
开课学院计算机科学与技术学院
指导老师姓名
学生姓名
学生专业班级
2012—2013学年第二学期
实验课程名称:
计算机网络
实验项目名称
获取网卡的MAC地址
实验成绩
实验者
专业班级
组别
同组者
实验日期
年月日
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
内容:
设计一个程序,使得能够获取本机安装的以太网卡的物理地址
基本要求:
一人独立完成。
可显示运行机器的MAC地址。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
MAC地址:
在局域网中,MAC(MediumAccessControl)地址,即物理地址,用来定义网络设备的位置。
在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址。
因此一个网卡会有一个全球唯一固定的MAC地址,但可对应多个ip地址。
(一)、两种不同的MAC帧格式
常用的以太网MAC帧格式有两种标准,一种是DIXEthernetV2标准;另一种是IEEE的802.3标准。
目前MAC帧最常用的是以太网V2的格式。
一个地址块可以生成2^24个不同的地址。
这种48位地址称为MAC-48,它的通用名称是EUI-48。
“MAC地址”实际上就是适配器地址或适配器标识符EUI-48。
(二)、MAC层的硬件地址
1、在局域网中,硬件地址又称物理地址或MAC地址,它是数据帧在MAC层传输的一个非常重要的标识符。
2、网卡从网络上收到一个MAC帧后,首先检查其MAC地址,如果是发往本站的帧就收下;否则就将此帧丢弃。
单击开始,找到命令提示符,进入后输入ipconfig/all即可获取MAC地址,该地址可以作为用作检查用程序检测到MAC地址的对错。
通过调用一些计算机的命令函数,获取IP,各种适配器的信息,然后通过关键字查找到以太网适配器,进一步找到MAC地址,其中用到了indexOf,subString等函数。
三、主要仪器设备及耗材
Windows7,Eclipse,JDK1.6
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
程序如下:
Packagemac;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
publicclassMac{
publicstaticStringgetMACAddress()
{
Stringmac=null;
BufferedReaderbufferedReader=null;
Processprocess=null;
try{
process=Runtime.getRuntime().exec("ipconfig/all");//windows下的命令,显示信息中包含有mac地址信息,runtime是本地命令
bufferedReader=newBufferedReader(newInputStreamReader(process.getInputStream()));
Stringline=null;
intindex=-1;
while((line=bufferedReader.readLine())!
=null)
{
if(line.indexOf("以太网适配器")>=0)//寻找标示字符串以太网适配器,indexOf()返回指定字符在此字符串中第一次出现处的索引
{
while((line=bufferedReader.readLine())!
=null)
{
index=line.indexOf("物理地址");//寻找标示字符串【物理地址】
if(index>=0)
{//找到了
index=line.indexOf(":
");//寻找":
"的位置
if(index>=0)
{
mac=line.substring(index+1).trim();//取出mac地址并去除2边空格
//trim()用来删除左右两边空格substring()用来返回一个新的字符串
//它是此字符串的一个子字符串。
该子字符串始于指定索引处的字符,一直到此字符串末尾。
break;
}
}
}
}
}
}catch(IOExceptione){
System.out.println("出现异常");
}finally{//finally的作用是无论程序是否发生异常都会执行的部分
try{
if(bufferedReader!
=null){
bufferedReader.close();
}
}catch(IOExceptione1){
e1.printStackTrace();//与System.out.println("异常")相同
}
bufferedReader=null;
process=null;
}
returnmac;
}
publicstaticvoidmain(String[]argc){
Stringmac=getMACAddress();
System.out.println("MAC地址是:
"+mac);
}
}
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
程序运行结果如下:
程序运行正常后,把结果与在dos详细信息对比:
以太网适配器本地连接:
物理地址......24-B6-FD-09-5D-55
结果一样。
三、实验小结、建议及体会
通过这次试验,我深层次的了解了电脑上的一些与网络,信息传输,以及五层体系结构中的数据链路层中的MAC地址的应用以及各式,MAC地址就是物理地址,是确认一台电脑的唯一标识,在网卡上标注。
获取MAC地址的一种方式就是在DOS下输入ipconfig/all,显示一些本机的相关信息,就可以查看得到机器的物理地址。
MAC地址主要在物理层和数据链路层应用,装载IP数据报。
编程过程中查找了一些资料,一些函数的运用,如exec,Trim,subString等,在以后的学习中要多实践,多运用一些不熟悉的函数,加深对系统库的掌握程度,使编程更加熟练。
实验课程名称:
计算机网络
实验项目名称
基于Socket的网络通信设计
实验成绩
实验者
专业班级
组别
同组者
万灿
实验日期
年月日
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
内容:
综合运用网络协议、编程语言、API和图形界面实现基于socket建立、监听、连接、发送数据和接收数据的网络通信程序。
基本要求:
两人一组为单位,一个负责发送程序设计,一个负责接收程序设计,程序设计
完成后可以进行字符数据收发或文件传输。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
根据应用程序的不同需求,运输层需要有两种不同的运输协议,即面向连接的TCP和无连接的UDP。
本次实验主要是针对TCP开发程序,每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定。
即:
TCP传输数据的过程:
服务器端程序在本机的某个端口上监听,等待客户端连接此端口,一旦客户端连接到了此端口,服务器端和客户端就可以进行数据传输了,数据传输结束后,关闭连接。
通过服务器的监听,accept到客户端发来的信息,对服务器的IP地址与端口号进行确认后,服务器和客户端开始通信,采用图形界面的方式来显示服务器与客户端的连接通信。
三、主要仪器设备及耗材
Windows7,Eclipse,JDK1.6
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
服务器程序如下:
packagesocket1;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.io.*;
import.*;
publicclassFuwuqi
{
publicstaticvoidmain(String[]args)
{
newServer();
}
}
classServer
{
staticintport=0;
staticintstartStatus=0;
@SuppressWarnings({"unused","static-access"})
Server()
{
try{
ServerFrameserverFrame=newServerFrame("服务器");
while((startStatus==0)||(port==0)){
Thread.currentThread().sleep(120);
}
ServerSocketserverSocket=newServerSocket(port,6);
intclientSort=0;
for(inti=0;;i++){
Socketsocket=serverSocket.accept();
clientSort++;
PrintWriterout=newPrintWriter(socket.getOutputStream());
BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));
Threadth=newThread(newCommunicate(socket,clientSort,out,in));
th.start();
}
}catch(Exceptionm){
System.out.println("ERROR"+m);
}
}
}
//线程运行类
classCommunicateimplementsRunnable{
intclientSort;
Socketsocket;
PrintWriterout;
BufferedReaderin;
JTextAreaarea3;
Communicate(Socketsocket,intclientSort,PrintWriterout,BufferedReaderin)
{
this.socket=socket;
this.clientSort=clientSort;
this.out=out;
this.in=in;
}
publicvoidrun()
{
try{
area3=newJTextArea();
@SuppressWarnings("unused")
ClientWithServerclientWithServer=newClientWithServer(clientSort,out,area3);
out.println("已成功连接至服务器.");
out.flush();
StringacceptString;
while(!
(acceptString=in.readLine()).equals("bye")){
area3.append("Client:
"+acceptString+"\n");
}
in.close();
out.close();
socket.close();
}catch(Exceptiong){
System.out.println("Error:
"+g);
}
}
}
//服务器与客户端通信窗口
classClientWithServer{
JFrameframe3;
JTextAreaarea3;
JTextFieldfield3;
JButtonbutton3;
intx=200;
inty=150;
intwidth=400;
intheight=400;
PrintWriterout;
ClientWithServer(intclientRank,PrintWriterout,JTextAreaar){
this.out=out;
area3=ar;
System.out.println("4\n");
frame3=newJFrame("客户端"+clientRank);
frame3.setLayout(null);
frame3.setLocation(x,y);
frame3.setSize(width,height);
JPanelpanel3=newJPanel();
JScrollPanescrollPane3=newJScrollPane(area3);
frame3.add(scrollPane3);
frame3.add(panel3);
scrollPane3.setLocation(0,0);
scrollPane3.setSize(width,(height*4/5));
scrollPane3.setBackground(Color.WHITE);
panel3.setLocation(0,(height*4/5));
panel3.setSize(width,(height/5));
panel3.setBackground(Color.LIGHT_GRAY);
field3=newJTextField(25);
panel3.add(field3);
field3.addActionListener(newActionFieldButton());
field3.setLocation((width/70),(height*2/5));
button3=newJButton("Send");
panel3.add(button3);
button3.addActionListener(newActionFieldButton());
button3.setLocation((18*width/19),(height*5/7));
button3.setSize(35,23);
frame3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame3.setResizable(false);
frame3.setVisible(true);
}
classActionFieldButtonimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
out.println(field3.getText());
out.flush();
area3.append("Server:
"+field3.getText()+"\n");
field3.setText("");
}
}
}
//设置端口号和启动服务器窗口
classServerFrame{
JFrameframe1;
staticJTextAreaarea1;
JButtonbuttonPort;
JButtonbuttonStart;
intx1=700;
inty1=150;
intwidth1=400;
intheight1=400;
ServerFrame(Strings){
frame1=newJFrame(s);
frame1.setLayout(null);
frame1.setLocation(x1,y1);
frame1.setSize(width1,height1);
JPanelpanel1=newJPanel();
frame1.add(panel1);
panel1.setLocation(0,0);
panel1.setSize(width1,(height1*60/500));
panel1.setLayout(newFlowLayout(FlowLayout.LEFT,60,10));
buttonPort=newJButton("设置端口号");
panel1.add(buttonPort);
buttonPort.addActionListener(newActionPort());
buttonPort.setSize(50,23);
buttonStart=newJButton("启动服务器");
panel1.add(buttonStart);
buttonStart.addActionListener(newActionStart());
buttonStart.setSize(50,23);
area1=newJTextArea();
JScrollPanescrollPane1=newJScrollPane(area1);
frame1.add(scrollPane1);
scrollPane1.setLocation(0,(height1*60/500));
scrollPane1.setSize(width1,(height1*420/500));
area1.setBackground(Color.LIGHT_GRAY);
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setResizable(false);
frame1.setVisible(true);
}
//监听启动服务器按钮
classActionStartimplementsActionListener
{
publicvoidactionPerformed(ActionEvente)
{
Server.startStatus=1;
area1.append("服务器已启动.\n");
}
}
}
//监听端口设置键
classActionPortimplementsActionListener{
staticJFrameframe2;
staticJTextFieldfield2;
JButtonbuttonok;
publicvoidactionPerformed(ActionEvente)
{
frame2=newJFrame("端口号设置");
frame2.setLayout(newFlowLayout(FlowLayout.CENTER,100,10));
frame2.setLocation(800,300);
frame2.setSize(350,200);
field2=newJTextField(10);
frame2.add(field2);
field2.addActionListener(newActionPortSet());
buttonok=newJButton("确定");
frame2.add(buttonok);
buttonok.addActionListener(newActionPortSet());
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.setResizable(true);
frame2.setVisible(true);
}
}
//监听端口设置窗口
classActionPortSetimplementsActionListener
{
publicvoidactionPerformed(ActionEvente)
{
try
{
Server.port=Integer.parseInt(ActionPort.field2.getText());
ActionPort.field2.setText("");
ServerFrame.area1.append("您的服务器端口号设置为:
"+Server.port+"\n");
ActionPort.frame2.setVisible(true);
}
catch(NumberFormatExceptionm)
{
System.out.println("ERROR"+m);
}
}
}
客户端程序如下:
packagesocket1;
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
import.*;
importjavax.swing.*;
@SuppressWarnings("serial")
publicclassClientextendsJFrame
{
staticStringip;
staticintport=0;
staticPrintWriterout;//类Print