Java聊天程序设计Word格式.docx
《Java聊天程序设计Word格式.docx》由会员分享,可在线阅读,更多相关《Java聊天程序设计Word格式.docx(19页珍藏版)》请在冰点文库上搜索。
9
8
7
6
4
文献综述
研究水平与设计能力
20
19
17
15
13
课程设计说明书(论文)撰写质量
学术水平与创新
答辩效果
30
28
25
22
是否同意论文(设计)通过答辩
□同意□不同意
答辩小组成员签名
答辩小组组长签名:
课程设计成绩评定表
成绩汇总
比例
分数
课程设计总分
指导老师评分
50%
答辩小组评分
成都信息工程学院
课程设计
题目:
网络聊天程序设计与实现
作者姓名:
班级:
学号:
指导教师:
日期:
年月日
作者签名:
网络聊天程序设计与实现
摘要
这次课程设计我选择了做一个聊天程序,虽然很多同学是和我一样选了同一个题目,也许功能叶相差无几,但这不是最重要的。
腾讯QQ、MSN-Messager已经成为我们日常生活中和亲朋好友经常联系的很好的工具,作为计算机专业的学生,我认为对这些身边的实用软件我们应该有更深刻的认识,理解他是如何工作的,知道各种功能又是如何实现的,所以我选择了这个题目。
设计中我运用了网络编程的基本理论知识,如客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。
在网络编程中通过Socket套接字建立连接,服务器能读取、转发客户端发来信息,并能刷新用户列表。
对信息的读取、发送,是利用流来实现信息的交换,能实现汉字的读取与显示,在服务器端显示其地址和ip号,在线人数,当前状态和客户连接与断开信息等。
同时,借鉴QQ,我也在用户名后面实时显示系统时间,同时通过方法实现用户断开连接,刷新用户列表,显示聊天内容等等。
和其他同学相比,我的这个程序还有很多可以扩展的功能,比如踢人,私聊等,由于时间紧迫未能实现,所以只是完成了基本功能。
本程序采用myEclipse为基本开发环境和java语言进行编写,能实现多个客户之间同时进行聊天。
关键词:
局域网聊天socketjavamyEclipse
目录
1引言1
1.1课题背景1
1.2功能要求1
1.3运行环境1
1.4功能实现1
2JAVA介绍1
2.1Java语言背景1
2.2Java语言特点2
2.1.1平台无关性2
2.1.2安全性2
2.1.3面向对象2
2.1.4分布式2
2.1.5健壮性2
2.1.6Java与C/C++语言3
3总体设计思路3
3.1程序设计过程3
3.2功能模块的流程图5
3.2.1服务器端5
2.1.1客户端6
3.3遇到的麻烦和解决方法6
4重要源代码摘录7
4.1图形界面实现7
4.2重要方法的代码7
5运行结果与测试10
5.1服务器端初始界面10
5.2客户端初始界面10
5.3服务器端运行结果11
5.4客户端运行结果11
结论12
参考文献12
引言
课题背景
在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个有简单聊天功能的网络聊天程序;
而且通过制作该程序还能更好的学习网络软件编程知识。
本课程适用于信息安全等本科专业。
参加本课程设计的学生,应当认真完成本课程设计的全部过程。
并以最终课程设计成果来证明其独立完成各种实际任务的能力。
从而,反映出理解和运用本课程知识的水平和能力。
功能要求
系统的详细设计和程序的算法分析
系统的硬件配置清单
用户使用说明书
源程序代码清单
测试数据和测试过程记录
遇到的问题及解决方法分析
运行环境
本程序基于java和myeclipseJavaEnterprise开发环境,可以在一般的装有windows系统的主机上运行。
功能实现
系统结构采用C/S结构
采用套接字实现网络中的数据传输
尽量使用某个或某些应用层的协议实现系统的部分功能
系统设计规范合理,操作流程方便简单
JAVA介绍
Java语言背景
Java是一种简单的,跨平台的,面向对象的,分布式的,解释的,健壮的安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。
在Java出现以前,Internet上的信息内容都是一些乏味死板的HTML文档。
这对于那些迷恋于WEB浏览的人们来说简直不可容忍。
他们迫切希望能在WEB中看到一些交互式的内容,开发人员也极希望能够在WEB上创建一类无需考虑软硬件平台就可以执行的应用程序,当然这些程序还要有极大的安全保障。
对于用户的这种要求,传统的编程语言显得无能为力,面SUN的工程师敏锐地察觉到了这一点,从1994年起,他们开始将OAK技术应用于WEB上,并且开发出了HotJava的第一个版本。
当SUN公司1995年正式以Java这个名字推出的时候,几乎所有的WEB开发人员都想到:
噢,这正是我想要的。
于是Java成了一颗耀眼的明星,丑小鸭一下了变成了白天鹅。
Java语言特点
平台无关性
平台无关性是指Java能运行于不同的平台。
Java引进虚拟机原理,并运行于虚拟机,实现不同平台的Java接口之间。
使用Java编写的程序能在世界范围内共享。
Java的数据类型与机器无关,Java虚拟机(JavaVirtualMachine)是建立在硬件和操作系统之上,实现Java二进制代码的解释执行功能,提供于不同平台的接口的。
安全性
Java的编程类似C++,学习过C++的读者将很快掌握Java的精髓。
Java舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针侵入系统。
Java对程序提供了安全管理器,防止程序的非法访问。
面向对象
Java吸取了C++面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性。
类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。
程序员只需把主要精力用在类和接口的设计和应用上。
Java提供了众多的一般对象的类,通过继承即可使用父类的方法。
在Java中,类的继承关系是单一的非多重的,一个子类只有一个父类,子类的父类又有一个父类。
Java提供的Object类及其子类的继承关系如同一棵倒立的树形,根类为Object类,Object类功能强大,经常会使用到它及其它派生的子类。
分布式
Java建立在扩展TCP/IP网络平台上。
库函数提供了用HTTP和FTP协议传送和接受信息的方法。
这使得程序员使用网络上的文件和使用本机文件一样容易。
健壮性
Java致力于检查程序在编译和运行时的错误。
类型检查帮助检查出许多开发早期出现的错误。
Java自己操纵内存减少了内存出错的可能性。
Java还实现了真数组,避免了覆盖数据的可能,这些功能特征大大提高了开发Java应用程序的周期。
Java与C/C++语言
Java提供了一个功能强大语言的所有功能,但几乎没有一点含混特征。
C++安全性不好,但C和C++被大家接受,所以Java设计成C++形式,让大家很容易学习。
Java去掉了C++语言中的指针运算、结构、typedefs、#define、需要释放内存等功能,减少了平常出错的50%,让Java的语言功能很精炼。
而且,因为Java很小,所以整个解释器只需215K的RAM,并增加了一些很有用的功能,如自动收集碎片。
Java实现了C++的基本面象对象技术并有一些增强,(为了语言简单,删除了一些功能)。
Java处理数据方式和用对象接口处理对象数据方式一样。
Java与C和C++直接相关.Java继承了C的语法,Java的对象模型是从C++改编而来的.现代程序设计始于C,而后过渡到C++,现在则是JAVA.通过大量的继承,JAVA提供了一个强大的,可以更好地利用已有成果的,逻辑一致的程序设计环境,并且增加了在线环境需求的新功能.或许最重要的一点在于,由于它们的相似性,C,C++和JAVA为专业程序员定义了一个统一的概念架构.程序员从其中的一种语言转到另一种语言时,不会遇到太大的困难.
总体设计思路
程序设计过程
由网络编程可知,我们要分别建立一个服务器端和客服端,并且通过多线程实现多用户同时聊天。
我是先向别人学习了一下,基本了解了需要做的工作,一些同学做的聊天程序课程设计功能强大,界面友好,我也从他们那里学到了很多。
第一步,借鉴别人的界面,我在草稿上画了一个服务器界面,将各个组件标上,便于写程序时使用,如下图1:
第二步,大致描绘一个客服端界面,布局好各个组件,不得不说,还可以添加更多模块实现更多的功能,草图如下图2:
第三步,开始写界面的代码,通过浏览器查看applet界面,不断修改到自认为可以为止;
第四步,建立客户端线程类,构造监听类的构造器,建立线程运行方法,读取服务器端传来的各种信息,如聊天信息,服务器关闭等;
第五步,实现客户端线程类,监听服务器传来的信息,存储客户的信息,接受并读取客户发送到服务器的信息,输出到客户端显示;
第六步,实现线程运行方法,读取客户端发来的数据流,如退出,建立连接,聊天内容等;
第七步,实现各个方法,如向客户端发送消息的方法、监听连接信息,刷新客户端用户列表方法、向每个连接的客户端发送信息的方法、关闭所有连接的方法、断开单个客户的方法等;
草图:
图一:
服务器端草图
图二:
客服端草图
功能模块的流程图
3.2.1服务器端
客户端
遇到的麻烦和解决方法
开始的时候遇到的最大的麻烦就是不能读入和输出汉字,产生了乱码和问号;
另外有时会出现用户列表无法更新、服务器端无法显示客户连接和断开信息,系统动态时间无法获取等等。
对于汉字问题我的解决办法是另外选择了一种读入数据流方法,使用BufferRead(),用readLine()读取;
关于系统的时间我是通过在网上找的一种方法实现的,将其输出到客服端显示;
有时是关联问题,以及输出显示格式,获取信息一些细节步骤如果出错就会产生意想不到的错误,无法解决,还越改越乱。
所以要养成多多的注释和一步一步的修改,避免不可恢复,造成重大的损失。
重要源代码摘录
图形界面实现
JPanelPanel;
//Pane是JPanel类的对象(实例)
JMenuBarjMenuBar1=newJMenuBar();
JMenujMenuFile=newJMenu();
JMenuItemjMenuFileExit=newJMenuItem();
JMenujMenuHelp=newJMenu();
JMenuItemjMenuHelpAbout=newJMenuItem();
JLabelstatusBar=newJLabel();
BorderLayoutborderLayout1=newBorderLayout();
JPaneljPanel1=newJPanel();
BorderLayoutborderLayout2=newBorderLayout();
JLabelback=newJLabel();
JPaneljPanel2=newJPanel(newGridLayout(10,1));
JLabeljLabel1=newJLabel();
TextFieldstatus=newTextField(10);
JLabeljLabel2=newJLabel();
TextFieldmaxnumber=newTextField(10);
JLabeljLabel3=newJLabel();
TextFieldcount=newTextField(15);
JLabeljLabel4=newJLabel();
TextFieldaddress=newTextField(15);
JLabeljLabel5=newJLabel();
TextFieldip=newTextField(15);
staticjava.awt.ListjList1=newjava.awt.List(20);
JscrollPanescrollpane=newJScrollPane(jList1,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
重要方法的代码
实现sendclients方法用来向每个连接的客户端发送信息;
publicstaticsynchronizedvoidsendClients(StringBuffermsg){
for(inti=0;
i<
clients.size();
i++)
{
Clientc=(Client)clients.elementAt(i);
c.send(msg);
}
关闭所有连接,遍历clients数组删除所有连接客户的信息;
PublicstaticvoidcloseAll()
{while(clients.size()>
0){
Clientc=(Client)clients.firstElement();
try{c.socket.close();
}
catch(IOExceptione)
{System.out.println("
Error:
"
+e);
finally
{clients.removeElement(c);
断开单个客户的方法,向其他在线客户发送断开连接信息,synchronized是java中用来维护数据的一致性,通过synchronized机制给共享资源上锁,使所有访问有序进行。
publicstaticsynchronizedvoiddisconnect(Clientc){
try
{jList1.addItem(c.ip+"
离开"
);
c.send(newStringBuffer("
QUIT"
));
c.socket.close();
catch(IOExceptione)
System.out.println("
finally
clients.removeElement(c);
notifyRoom()用来监视连接信息,不断刷新clients数组并刷新客户端用户列表信息;
publicstaticvoidnotifyRoom()
{
StringBufferpeople=newStringBuffer("
PEOPLE"
people.append("
:
+c.name);
sendClients(people);
动态获取本机系统的时间,在用户名之后显示;
publicStringgetStringDate(){
DatecurrentTime=newDate();
SimpleDateFormatformatter=newSimpleDateFormat("
yyyy-MM-ddHH:
mm:
ss"
StringdateString=formatter.format(currentTime);
returndateString;
运行结果与测试
服务器端初始界面
客户端初始界面
服务器端运行结果
客户端运行结果
结论
这次设计经过长期的不懈努力,程序基本满足聊天的需要。
完成后的程序实现了多用户在线聊天、单用户退出、显示在线用户列表、统计在线人数、显示用户主机IP、显示用户主机物理地址等功能。
程序设计期间,通过到图书馆查阅书籍,借阅Java语言开发教程和网上搜索相关解答等多种方式学习到很多课堂上没有的知识,还积累了一定的实践经验,增强了动手能力和解决实际问题的能力。
在此之前,对于Java编程技术或网络socket编程知识都只是略知皮毛,缺乏深入的认识,对其工作方式和原理缺乏透彻的认识。
在这段时间里,我认真学习了Java语言开发,Applet小程序实现,对编程思想有了进一步的体会,养成了一些良好的编程习惯。
程序虽然完成,但是距离优秀仍存在一定差距,用JAVA开发大型项目还有很多我需要去努力学习的知识。
希望自己能不断学习和实践,争取以后做得更好。
限于我的知识水平和经验有限,此程序还有许多有待完善和改正的地方,恳请老师批评指正。
参考文献
[1]李金铭林晓宁宁正元编著面向对象程序设计—JAVA清华大学出版社2005
[2]吕凤翥马皓编著Java语言程序设计清华大学出版社2006。
[3]王克宏Java技术及其应用高等教育出版社1999。
[4]林建铭精通Java2科学出版社2001。
[5]SchildtHJava2参考大全张玉清译清华大学出版社2002。