基于java的局域网飞鸽传书设计与实现讲解.docx
《基于java的局域网飞鸽传书设计与实现讲解.docx》由会员分享,可在线阅读,更多相关《基于java的局域网飞鸽传书设计与实现讲解.docx(40页珍藏版)》请在冰豆网上搜索。
基于java的局域网飞鸽传书设计与实现讲解
毕业论文(设计)
题目基于Java的局域网飞鸽传书软件设计与实现
系部计算机科学与工程系
专业计算机科学与技术年级2009
学生姓名
学号
指导教师
基于Java的局域网飞鸽传书软件设计与实现
计算机科学与技术
学生指导教师
【摘要】随着移动互联网的时代已经来临,社交应用广泛存在,这些应用加强了人与人之间的沟通;从小环境来说比如校园网,以及部分局域网在内的的各种交互也广泛存在。
局域网之间的信息交互,并不一定要建立在互联网的基础上,本设计就是针对局域网这一环境,旨在通过设计基于Java程序设计语言的一个局域网内能够相互通信,和传输文件的软件,来增强自我实践能力,及了解通信软件的设计技术。
本设计是用Java语言编写的类飞鸽传书软件,可以实现简单的局域网内的主机之间的信息发送,以及文件的传输,实现较简单快速,主要采用了UDP中的数据报协议,Socket协议实现主机之间的通信。
【关键词】局域网通信传输文件
IPMessenger-softwaredesignandimplementationusedinLANbasedonJava
【Abstract】AstheageofmobileandInternetiscoming,socialapplicationsiswidespread,andtheseapplicationsenhancecommunicationbetweenpeopleatthesametime;Onthesidefromtheenvironment,suchascampusnetwork,aswellasthevariousinteractions,includingthepartoftheLANisalsowidespread.InternetforinformationexchangebetweentheLANisnotnecessary,thisdesignisforthelocalareanetworkdesignedtocommunicatewitheachotherwithinalocalareanetworkbasedontheJavaprogramminglanguagethroughthisdesign,andtransferfilessoftwaretoenhancetheabilityofself-practice,andunderstandingofcommunicationssoftwaredesigntechniques.
Thedesign,whichincludedintheIPMessengersoftwareiswritteninJava,cansendinformationandmakefiletransfersbetweenthehost.Itissimpleandfast,mainlyusestheMatagordaProtocolUDP,Socketprotocolcommunicationbetweenhosts.
【Keywords】LAN,Communication,transmissionFile
第一章绪论
1.1研究现状
移动互联网背景下,通讯软件各种各样,通讯软件在各行各业中广泛应用,对于人与人之间的通信交流加强了人们沟通,局域网内的文件传输也促进了资源共享的便利;目前比较流行的通讯软件类别是即时通讯软件。
对目前市场上的即时通讯软件产品进行分析,可以发现,这些软件除具备实时交谈和互传信息等功能外,同时集成了数据交换、语音聊天、视频会议、电子邮件管理等功能。
目前,即时通讯软件正在积极向移动领域扩展,努力增强其跨越平台的能力,最大限度的实现互联网服务向移动领域的迁移。
这使得即时通讯软件不仅是注重通讯功能的联系软件,也是成为注重个人通讯录管理功能的移动设备管理系统。
两者集成在一起变成一个集成通讯录、手机消息、即时通讯的个人沟通平台。
另外,即时通讯软件的协作工作和与其它软件整合的功能也在逐渐增加。
近年来即时通讯产业正在移动领域努力推动它的应用,例如将即时通讯嵌入移动终端系统之中,并且可以实现与互联网同样功能的服务。
目前流行的通讯软件也叫做社交网络通讯软件,典型代表是腾讯公司的QQ,其服务器客户端模型如下图:
图1-1服务器客户端模型图
1.2主要研究内容
本设计研究局域网下的简单的通讯软件,主要包括简单的PC用户之间的相互通信,相互之间能接收信息。
局域网内能相互之间实现简单的文件共享传输。
同时通过本设计了解及掌握Java基本的网络通信方式,了解具体JavaSocket的具体用法,实现局域网之间的通信传输。
本设计的最终目的是设计一个具有下列功能的软件,软件最终所实现的基本功能如下:
1:
局域网内自动主机识别,即不需要手动添加主机;
2:
实现局域网pc用户之间的文本消息发送;
3:
实现局域网pc用户文件的传输;
4:
简单的服务配置设置;
1.3论文结构
本论文分为六个章节,具体详细结构如下:
第一章:
主要讲述论文的研究背景现状,本论文研究内容,及论文结构
第二章:
软件设计的需求分析,技术介绍,包括:
运行环境,环境配置,相关涉及技术,及设计需求,目标等
第三章:
软件的概要设计
第四章:
软件的模块详细设计与实现
第五章:
软件调试与测试
第六章:
总结
参考文献与致谢
第二章需求分析及技术介绍
2.1软件运行环境及开发环境
本系统的运行环境:
操作系统:
Windows7旗舰版
PC硬件版本:
制造商:
lenovo;型号:
lenovoWin7PC;分级:
3.4Windows体验指数;处理器:
Intel(R)Core(TM)2DuoCPUT5550@1.83GHz1.83GHz;安装内存(RAM):
2.00GB;系统类型:
32位操作系统笔和触摸:
没有可用于此显示器的笔或触控输入Lenovo支持网站:
联机支持
本系统开发环境:
JavaJDK1.6;EclipseVersion:
IndigoRelease,Buildid:
20110615-0604。
2.1.1开发环境配置
软件开发环境JDK配置:
JDK的是JavaDevelopmentKit的缩写,他是java开发的工具包,对于javaWeb开发必不可少。
它包含Java运行环境即JRE,和java运行的基础类库,java工具包。
在做相应开发之前,我们必须把java相应环境搭建好。
开发环境配置流程:
第一步,打开oracle公司网站主页:
第二步,在网页右侧位置点击JavaSE链接然后进行下载;
第三步,点击相应位置即上图JavaSE处然后再点击相应页面的DownloadJDK点击下载即可。
图2-1
第四步,下载完成后,双击安装
图2-2
点击接受按钮
图2-3
安装在默认目录即可
图2-4
安装过程可能会出现防火墙软件或别的杀毒软件警告,一律点允许即可。
安装完成后需设置相应的环境变量。
安装完成后都需要设置三个环境变量:
他们分别是PATH,JAVA_HOME,和CLASSPATH(不区分大小写):
JAVA_HOME:
填写我们把JDK所安装的位置)
PATH:
指向上面我们填写的jdk安装目录\bin
CLASSPATH:
指向java程序的类路径
在桌面上点击“我的电脑”处右键—>属性,选择“高级”选项即可找到相应环境变量进行配置。
这样,系统环境变量就设置好后,按下面的步骤即可检测是否配置成功。
测试是否安装成功的步凑:
第一步,打开DOS运行界面即输入CMD弹出dos界面
第二步,输入java后稍等几秒会输出如下图界面
图2-5
在输入javac测试会输出如下图所示
图2-6
如果出现图2-6所示的界面则安装配置JDK环境成功。
第三步,编写一个简单的java源程序测试。
源文件为Test.java。
内容如下
publicclassTest
{
publicstaticvoTopicIdmain(Stringargs[])
{
System.out.println("Thisisatestprogram.");
}
}
用CD命令进入文件所在的根目录。
输入Test.java命令编译该程序。
编译成功后,可以看到多了一个后缀为".class"的文件。
继续在命令行输入javaTest命令,执行程序,程序输出的“Thisisatestprogram.”字样。
Java的环境配置完成后开始Eclipse下载解压到相应路径,然后进行打开Eclipse安装WindowBuilder_Pro插件以便使用使用SWT_Designer进行图形化的界面设计。
2.2相关技术介绍
2.2.1Eclipse开发工具的选择原因
开发工具选择Eclipse,选择Eclipse的原因是其是免费开源的可扩展的IDE,可动态的安装不同开发插件。
我们安装的android开发插件只是其中一种。
它具有强大的插件加载能力,支持多种语言开发,可在多个系统上运行。
2.2.2Java介绍
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE,JavaEE,JavaME)的总称。
Java与传统的C,C++相比是纯面向对象的语言,它封装了容易造成错误的指针,同时避免了一些容易造成错误的运算符重载,多重继承等。
与此同时Java语言具有内存回收机制能够自动回收不用的内存,避免C或C++比较容易造成的内存泄露问题。
另一方面虽然Java语言的运行效率一直被人们所诟病,但是其强大的跨平台型,简单易用性,给予了其强大的活力。
另一方面Android是第一款内置支持Java的操作系统,因此在移动互联网内的应用中,Java语言会扮演着一个重要的角色。
Java语言特点:
Java是一种简单、安全、容易适用、面向对象、可移置、高性能、多线程的语言。
简单性:
Java语言简单高校,基本Java系统(编译器和解释器)所占空间不足250KB由于Java最初是为了对家用电器进行集成控制而设计的,因而具备简单命了的特征。
面向对象:
面向对象技术是现代工业的一次革新,提高了软件的模块化程度和重复适用率,缩短了软件开发时间,减低了卡发成本。
在Java之前虽然已经有面向对象的程序设计语言问问世,但有些如c++并不是完全的面向对象,而是面向过程和面向对象的混合体。
Java则是完全面向对象的程序设计语言。
安全性:
Java是可以用在网路及分布环境下的网路程序设计语言。
在网路环境下,语言的安全性变得更为重要。
Java提供了许多安全机制来保证其适用上的安全性。
平台独立:
平台独立指程序不受操作平台的限制,可以应用在各种平台上。
Java源程序经过编译后生成字节码文件,而字节码与具体的计算机无关。
只要计算机安装了能解释执行字节码的Java虚拟机JVM,就可以执行字节码文件,从而实现Java的平台独立性。
多线程:
Java具备内建的多线程功能,可以将一个程序的不同程序段设置为不同的线程,使各线程并发、独立执行,提高系统的运行效率。
网络功能:
Java能从全球网络资源获取所需信息,如数据文件、影响文件、声音文件等,并对所得信息进行处理,所以说Java是一种网络语言。
执行效率:
Java的字节码需要经过Java虚拟机JVM解释成机器码才能执行,所以速度上较慢。
但是随着JVM技术的进步,使得其执行速度直逼C与C++。
2.2.3Java语言的图形化编程
Java语言在图形化设计上一直存在短板,它不像我们学习C,C++时可以方便的借用VC6.0,VS等开发工具借助MFC(微软基础类库)进行图形化的开发,而Pascal语言可以在Delphi下甚至比MFC更方便更快捷的进行图形化开发。
Java语言的图形化界面设计:
1.基于Eclipse的插件swing/swt/Jfacedesigner;
2.NetBeans;
3.传统的JBuilder;
4.Oracle的Jdevelop;
5.IntelliJIDEACommunityEdition。
本文系统设计采用第一种方法
2.2.4Java的Socket编程
Java做的比较成功的就是网络方面的应用,所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
套接字中包含网络通信发送的内容,socket是程序通讯之间的一端,可以发送请求,也可以接收请求。
Java中的socket类提供了特定的方法:
getInputStream与getOutputStream。
getInputStream与getOutputStream方法介绍:
getInputStream:
用于获得对应的网络连接的输入流,返回一个实际的IutputStream对象,以便程序得到输入,进入对应的处理流程。
getOutputStream:
用于发送一个对应的输出流,连接的另一端得到一个实际OutputStream对象,同样对应连接方得到输出流后,进入后续处理过程;getInputStream与getOutputStream两种方法,共同完成了Java基础的网络通信功能。
在Socket编程中类似的还包括UDP协议中的DatagramSocket,以及涉及服务端功能的ServerSocket等等在实际使用时Java还需要用到DatagramPacket(就是我们所称作的数据报),数据报来完成DatagramSocket接收和发送的数据。
2.4设计目标
2.4.1基本性能
编写完成局域网简单的通信及文件传输软件,能够实现软件的顺利运行。
实用性:
为局域网聊天提供方便,有效进行文件传输共享。
操作简单:
本系统只需将jar包拷贝到pc上,只要pc安装了支持Java的运行环境即可运行,而且无需对软件进行安装,点击即可直接运行技术便捷,沟通快速:
软件设计无需用户进行登录,打开自动识别用户机IP地址,同时可设置广播时段,刷新后显示在线用户列表,选择对应用户即可直接进行对话,或文件传输。
适应性:
广泛适应普通的局域网环境,无论是小区还是学校宿舍,办公室,实验室,只要是统一局域网即可用软件进行直接便捷的沟通。
代码可读性好:
软件设计采用功能区分,对应不同的类,并标注有注释,因此可读性良好。
2.4.2开发目标
1完成基本性能需求,设计出具备基本的用户界面,基本的设置界面,后台可见等软件特征;
2具备完善的聊天界面,文件传输界面;
3实现聊天功能模块;
4实现文件传输模块;
5实现对话提醒,对话完毕提醒;
6实现文件传输提醒,文件传输完毕提醒;
第三章系统设计
3.1系统概要设计
3.1.1软件用例图
在同一个局域网内,根据不同的IP地址,PC段能够显示在线的PC用户列表;通过选定用户列表中的用户然后就可以进行文本信息的发送以及文件的传送;在文本信息和文件发送成功后都会有发送成功的提示;当有新PC端进入局域网后,可以通过刷新用户列表的方式会看到新的用户。
具体系统用例图如图3-1所示:
图3-1系统用例图
图3-2
在局域网内的多台主机运行软件后,客户机之间可以相互通信,传输文件。
主机通信协议 UDP中的数据报协议及socket通信协议。
3.1.2软件总体分析
在一个局域网内,用户与用户之间的聊天功能是可以多人之间同时进行的,他们之间的数据流图如图3-3所示:
图3-3数据流图
在局域网内,PC与PC之间互相之间既可以充当客户端的角色,同样可以充当服务器的角色。
首先由客户端发出建立连接的请求,当服务器端收到连接请求后向客户端发出信息建立连接。
建立连接后通过InputStream和OutputStream两个模块进行互相之间的通信,具体系统实现原理图如图3-4所示:
图3-4系统实现原理图
服务器端和客户端进行通信技术实现原理:
1、发送端Client向Server即接收端发送Socket连接请求,Server端建立服务端并监听Socket--->等待并接受连接请求--->接收请求后创建连接Socket;
2、连接创建后发送端和接收端即可开始通信;
3、结束通信后关闭Socket连接。
3.2系统模块功能实现
3.2.1广播模块
BroadCast模块主要实现了数据报socket的局域网信息类型状态的反馈。
其中字符op代表了各种消息类型。
'S'代表'R'代表'M'代表'A'代表
该模块继承了Runnable方法,该模块主要使用DatagramSocket发送、接收数据,具体是利用DatagramSocket(intport,InetAddressladdr)方法:
创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口。
并利用send(DatagramPacketp):
以该DatagramSocket对象p向外发送数据报。
部分关键代码如下:
publicvoidrun(){
StringnewStr="";
if(op=='S'||op=='R'||op=='M'||op=='A'){
newStr+=op;
newStr+=mes;//判断广播类型
}else{
JOptionPane.showMessageDialog(null,"无该操作!
","错误",
JOptionPane.ERROR_MESSAGE);//报错处理
return;
}
try{
DatagramSocketclientSocket=newDatagramSocket();
bytedata[]=newStr.getBytes("UTF-8");
DatagramPackettheOut=newDatagramPacket(data,data.length,
address,2007);//初始化广播
clientSocket.send(theOut);//发出广播
clientSocket.close();//关闭Socket端口
}catch(Exceptione){
JOptionPane.showMessageDialog(null,e.getMessage()
+this.getClass().toString(),"错误",
JOptionPane.ERROR_MESSAGE);
}
}
3.2.2发送文件模块
Client模块实现客户端的消息及文件发送功能;
该模块同样继承了Runnable方法,该模块中定义了获取传输文件的方法publicvoidgetFiles(Filefile,StringlastDir,StringlocalPath)用于获取要传输的文件目录名称,及大小。
模块中的run()方法,将getFiles获得的文件转化为相应的数据报流发送出去。
并可以在相应主界面显示相应的发送状态,和发送进度显示。
部分关键代码如下:
publicvoidgetFiles(Filefile,StringlastDir,StringlocalPath){
if(file.isFile()){
totalSize+=file.length();//获取文章的大小
sendDir.add(localPath);//添加路径
Vname.add(newString(lastDir+"/"+file.getName()));//添加文件
}elseif(file.isDirectory()){
lastDir=lastDir+"/"+file.getName();
Stringstrs[]=file.list();
for(inti=0;iFilenewfile=newFile(file.getAbsolutePath()+"/"+strs[i]);
getFiles(newfile,lastDir,localPath);//获取文章以及保存文章的路径
}
}
}
try{
byte[]buffer=newbyte[1024];
SocketsendSocket=newSocket(address,MainFrame.PORT);//初始化一个Socket套接字
DataInputStreamin=newDataInputStream(
sendSocket.getInputStream());
BufferedOutputStreamoutb=newBufferedOutputStream(
sendSocket.getOutputStream(),512);
DataOutputStreamout=newDataOutputStream(outb);
ObjectOutputStreamoout=newObjectOutputStream(out);//设置输出对象
oout.writeObject(fileVector);
oout.flush();//刷新
ObjectInputStreamoin=newObjectInputStream(in);
VectoraccVector=(Vector)oin.readObject();
if(MainFrame.m.accRe)
JOptionPane.showMessageDialog(null,"消息已发送到!
","提示",
JOptionPane.DEFAULT_OPTION);//获取到消息
for(inti=0;iFiletemp=(File)accVector.get(i);
send+=""+temp.getName();
getFiles(temp,"",temp.getParent());
}
out.writeL