第一篇:5-java基础小结-聊天室
Java基础培训(5)
——java基础小结-聊天室
文档说明
本文档只提出学习要点与考核标准,具体的学习过程由学员自己自学完成。在学习过程中学员可以参考一切可以参考的资料,如:查阅书籍,在网上查找相应教程,参考别人的代码,或是请教他人。
考核通过的标准是以较高的质量独自完成文档中的小练习,在完成程序的过程中可以参考别人的或网上的更优秀的程序,但是对于参考的程序要有自己的见解。
该培训课程需要一定的编程基础,并且要对java语言有所了解;课程只对一些常用的知识点进行考核,不能覆盖java语言的各个方面!
您在使用该培训课题的过程中,如发现有不足之处,欢迎提出改进的意见和建议,我们在此表示感谢!
课程要点
对之前学习的总结,通过一个比较大的应用程序,把java一些常用的、基本的知识串通起来:
1.类的继承与多态 2.容器类
3.I / O 操作,标准I/O流、文件流和Socket流 4.异常处理 5.多线程 6.定时任务 7.Socket编程
考察学员对“大型”程序的掌控能力,掌握系统的功能模块分解;
课程时间:3~4天
小练习
注:
1.写程序时可以使用java api提供的所有类,除非练习题中注明了某项功能要自己实现。
2.为代码加上必要的注释,养成为代码添加注释的习惯。3.程序的参数与返回值如果没有特殊说明时,可以自由定义。
练习:
完成一个小型的聊天室系统: 1.进入聊天室要输入一个昵称 2.能够查询在线用户列表 3.可以与任一位在线用户交流 4.可以向所有在线用户群发消息
5.Client端启动时要读取配置文件,实现以下功能的可配置:
a)聊天时是否显示昵称 b)聊天时是否显示IP c)是否记录聊天日志 d)是否记录群发信息
6.Server端启动时要读取配置文件,实现以下功能的可配置:
a)是否实时更新在线用户列表 b)是否开启用户的群发功能
c)是否记录用户进入和退出房间的日志
可以使用Tcp或Udp的连接方式实现,如果使用Udp方式第6项的Server端功能合并到Client端实现;
配置文件使用Properties文件,系统只需要读取文件中的配置,不需要改变配置并记录到文件中;
聊天室可使用字符界面,也可使用图形界面;
参考程序
以下程序只提供参考,不是标准答案!
第二篇:JAVA聊天室实验报告
Java聊天室实验报告
班 级:学 号:姓 名:
****** ******** ***
目录:
一、实验目的.......................................................3
二、所需技术.......................................................3
三、需求分析.......................................................3
四、系统设计.......................................................4
1、服务器结构..................................................4
2、客户端结构..................................................4
五、实现细节.......................................................5
1、客户端细节...................................................5
2、服务器细节...................................................6
六、系统展示.......................................................7
七、实验小结.......................................................9
Rain153 WeChat 聊天室系统一、实验目的:
1、使用Java技术完成聊天室系统,深入学习使用Java语言。
2、使用Java 的多线程机制,深入理解Java多线程技术的应用。
3、使用GUI,对JFrame的深入学习。
4、使用网络编程,掌握基于TCP协议的Socket编程,了解Socket编程的协议约定,掌握简单应用协议的开发。
5、使用C/S架构,对网络编程有一定的了解。
二、所需技术
本系统要求使用java技术开发。所需知识包括java程序设计语言、swing基本GUI组件、多线程编程、socket编程、集成开发环境使用eclipse。系统采用两层C/S体系结构,C端负责通过GUI与客户交互,实现注册、登陆、收发信息、退出等功能; S端是聊天系统的服务器。
三、需求分析
开发一个类似QQ 的聊天室系统,即WeChat聊天系统。该系统应具有如下功能:
1、2、用户注册、登录 群聊;
3、私聊;
4、服务器发送系统消息;
5、服务器踢人;
6、保存日志;
7、保存聊天信息;
四、系统设计
1、服务器结构
启动服务器监听AppServer服务器控制监听窗体ServerFrameConnection处理所有用户请求
服务器端结构图示
2、客户端结构
启动客户端ChatClient用户登录窗体Login用户聊天主窗体ChatRoom时钟窗体ClockRegister用户注册窗体Windowclose用户窗体监听器
客户端结构图示
1、AppServer.java
为服务器端监听类,负责服务器的启动,包括启动监听端口、服务器监控界面。
2、ServerFrame.java 为服务器监控窗体,负责监控服务器运行状态。
3、Connection.java 为服务器连接处理的具体实现。
4、ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。
5、Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。
6、Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。
7、ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器的Connection合作。
8、Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。
9、Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。(可选)
五、实现细节
概述:聊天室主要功能的实现:从界面输入登录信息,然后与服务器建立Socket连接(连接时应指定服务器的IP地址和端口号,而客户端socket的端口由本方操作系统从空闲端口中确定),服务器端的“倾听Socket”收到连接请求后,一般会接受连接请求,并生成一个服务端socket,专门负责与此客户端socket的通信。一旦连接请求成功,客户端将信息及请求通过本方socket的输出流发送给服务器端相应的socket,服务端则通过服务器端Socket的输入流接受客户端传输过来的信息及请求,分析是何请求,然后根据请求类型,进行相应的处理(如登录、转发信息等)。服务方也可以根据需要,通过socket的输出流发信息和请求给客户端(公告)。客户方和服务方都可以通过关闭本方的socket而结束一次通讯过程。为了实现多客户在线的请求,使用多线程机制来处理,对每一个客户端连接通讯,服务器端都有一个线程专门负责处理。
一)客户端细节
1、注册:
当选择注册时,Register界面等待用户输入注册信息,并将信息封装成Register_Customer类,然后通过建立在Socket的连接之上的对象输出流将用户注册信息发送给服务器端,服务器端将请求转发给Connection处理,Connection 在收到信息后将验证数据的完整性并在数据库中查找该用户名是否已经注册,然后将注册信息加入数据库,最后将注册结果返回给客户端。客户端显示注册结果。
2、登录:
当选择登录时,客户端由Login 界面等待用户输入登录信息后,封装成Customer对象类然后通过建立在Socket的连接之上的对象输出流将用户登录信息发送给服务器端,服务器端将请求转发给Connection处理,Connection 在收到信息后将验证数据的完整性并在对象型数据库中查找该用户名是否已经注册,然后将注册用户的信息与登录请求信息进行密码验证,在登录成功后将该用户添加到在线用户列表,最后将登录结果返回给客户端。若登录成功,客户端将启动聊天室主界面。
3、聊天 a、发送聊天信息:私聊功能需在在线列表中选中私聊聊天对象,并勾选私聊选项。群聊功能取消对私聊功能的勾选即可。当用户点击完发送按钮后,程序开始将当前用户名、聊天对象、聊天内容、表情和是否私聊进行封装,然后获取Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。
b、接收聊天信息:用一个单独的接收线程实现,客户端必须随时接收服务器发来的消息,而读取消息的方法采用的是阻塞式方法,若在事件处理程序中读(占用的是事件处理线程)则会使程序在此后无法响应用户操作,所以需要生成一个单独的线程专门用于读取处理消息。而发送消息的方法则是将消息放入操作系统的发送缓冲区后就返回的,所以发送执行的相当快,可以在事件处理线程中直接调用。发送和接收可以同时进行。二)服务器端细节
1、注册:创建一个File文件类,载入“user.txt”,再用对象输入流ObjectInputStream包装File文件类,将存储在“user.txt”得向量对象Vector中载入内存中,现在系统中的向量就是对象型数据库,存储着每条用户信息对象。判断是否是第一个注册用户,判断用户名是否已经存在,判断用户名是否为系统关键字,用户名有效后 写入数据库,并给客户端返回信息,关闭Socket连接。
2、登录:去数据库读用户数据,打开用户数据库文件“user.txt”,将用户数据对象集载入内存,以供下面的程序使用。验证用户名是否存在,验证用户密码是否正确,验证用户是否已经登录,验证是否已经超过最大登录人数,如果以上验证全部正确,返回客户端信息,关闭Socket连接。
3、退出:接收退出信息,当用户退出时,客户端将会用基于Socket的对象输出流发给服务器退出对象,把用户从在线列表中删除,更新在线列表。
4、聊天:接收用户聊天信息,当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其转换为Message对象,返回聊天信息,然后系统从Message中提出消息类型,再根据类型将消息强制转化ChatMessage,调用ChatMeaage中方法,获取目的客户名称列表,根据目的地用户名从用户名、socket键值表中获取socket,再通过socket将Message转发到相应的用户。
六、系统展示
1、注册
客户端注册界面
2、登录
客户端登录界面
3、聊天界面
聊天界面
4、服务器界面
服务器管理界面
服务器用户信息管理界面
七、实验小结
本次实验是比较复杂的一个题目,采用C/S架构设计的聊天室,使用增量迭代方式开发,从初始的0.1版到最终的2.0正式版。通过本次实验,对C/S架构有了较深的认识,也对多线程编程、网络编程、GUI的认识更清晰。在项目中遇到很多问题,在解决问题的过程中,对Java也渐渐的熟悉,尤其是对各种异常的处理更是对自己的一种锻炼。在此次实验中应用了很多上课时未讲到的知识,自己查阅API,阅读JDK源码学习方法的使用让自己收获颇丰。由于这是一个人的项目,虽然在项目的实施上很自由,可到问题没有人讨论,耗费了很多精力,不过这也是提高自己的好方法。
该Rain153 WeChat聊天室由于时间原因,很多功能实现的并不合理,也有些功能尚未实现。Rain153 WeChat并未与数据库连接,只是简单的用文件保存用具信息及消息记录。
第三篇:Java聊天室课程设计报告
UML课程设计
题 目
网络聊天程序开发设计与实现
学 号:201515614376 姓 名: 卫国辉 指导教师:
完成时间:2017年 12月
0
目录
1.摘要.............................................................................................................................2 2.绪论.............................................................................................................................0 2.开发环境.....................................................................................................................0 3.需求分析....................................................................................................................1
3.1程序简介...........................................................................................................1 3.2程序功能...........................................................................................................1 4.系统设计.....................................................................................................................2
4.1概要设计...........................................................................................................2 4.2详细设计............................................................................................................2 5.测试.............................................................................................................................7 6.结论.............................................................................................................................9 参考文献......................................................................................................................10
摘要
本次训练主要是考查了对JAVA程序设计的综合运用,设计一个Socket通信的聊天程序,用户可以通过程序进行聊天通信,但不支持用户自定义表情及图片的发送。
本程序设计也用到了一些相关的标准Java的类,给程序设计带来了许多的方便,但用那些要切记加相应的类的包,还有一些构造方法和个别接口方法。
本程序可以实现用户之间的一些简单的交互,虽然功能较少,但是我想通过这次程序设计来熟悉并且学习更多关于JAVA编程的东西,来便于以后可以使用。
关键词:java聊天
1.绪论
对于一个选择网络编程的人来说,必须要有足够的细心和耐心,因为编程一般来说是很枯燥的乏味的,而且程序会越来越复杂,它所用到的符号、标记很多,所以不能出点小错误的。还有,我们不能只是看程序,要学会把自己学的自己拿去实践,自己去编一些程序,培养自己的动手能力,掌握一些编程技巧,熟练运用自己学到的理论知识,这样在以后才能开发出属于自己的东西。
如今,随着科学技术的发展,计算机已成为了我们生活中必不可少的设备了,而掌握计算机知识和运用,又成了我们每一个人的目标了。现在IT行业的飞速发展,无不应正了以前、现在、将来计算机行业都是科学发展的主导行业。而这些基本上都建立在程序上的,所以程序员对计算机行业来说,可想而知有多么的重要了,他们所付出的每一滴汗水都将推动这个行业的发展。
现在我就用JAVA语言编写一个简单的程序——Java聊天程序。将所学的基本知识用到其中去,这里包括了构造方法,创建图形界面,引用类等等。这不仅能锻炼我的实践能力,同时也进一步复习和巩固了我所学的理论知识。对以前没有学好的还有督促和促进作用。而且,根据需要,还可以了解一些课外的知识。增加自己的知识面。
2.开发环境
在开发此聊天程序时,该项目所使用的软件开发环境如下:
操作系统:Windows 7
开发工具:eclipse3.2及其VE插件
0
Eclipse简介
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具。
Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语 言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持 使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。
Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE。目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat及Sybase等。Eclipse是一个开发源码项目,它其实是 Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。近期还有包括Oracle在内的许多 大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。
3.需求分析
3.1程序简介
随着网络技术的发展,人们越来越多的依赖于网络,为了方便人们的生活,网络聊天自然成为了热点,各种工具到处都是。此程序便是模仿其他聊天工具设计的,当然只是实现了比较少的功能,可以进行基本的聊天。
3.2 程序功能
该程序功能:该程序分为2个部分,一个是客户端程序,一个是服务端程序,需要先开启服务器,再开启客户端才能使用,客户端程序提供了相互通信、清空聊天记录的等功能,服务端则用于接受客户端的请求,记录客户端的信息等。
4.系统设计 4.1概要设计
此聊天程序共有2个部分,客户端和服务器。客户端中包含了1个Java文件,为主类client.java,;服务器端只有一个主类Server.java。
程序流程图:
服务器程序结构
客户端程序结构
4.2详细设计
(1)服务器程序实现
本程序采用的是Socket通信来设计的,建立一个主类Server.java,其中主类中还包括服务器线程 然后在其构造方法加载程序所需的组件,构造方法如下:
public ClientThread(Socket socket){
try {
this.socket = socket;
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
// 接收客户端的基本用户信息
String inf = reader.readLine();
StringTokenizer st = new StringTokenizer(inf, “@”);
user = new User(st.nextToken(), st.nextToken());
// 反馈连接成功信息
writer.println(user.getName()+ user.getIp()+ “与服务器连接成功!”);
writer.flush();
// 反馈当前在线用户信息
if(clients.size()> 0){
String temp = “";
for(int i = clients.size()1;i >= 0;i--){
clients.get(i).getWriter().println(”ADD@“ + user.getName()+ user.getIp());
clients.get(i).getWriter().flush();
}
} catch(IOException e){
e.printStackTrace();
}
}
@SuppressWarnings(”deprecation“)
public void run(){// 不断接收客户端的消息,进行处理。
String message = null;
while(true){
try {
message = reader.readLine();// 接收客户端消息
if(message.equals(”CLOSE“))// 下线命令
{
contentArea.append(this.getUser().getName()
+ this.getUser().getIp()+ ”下线!rn“);
// 断开连接释放资源
reader.close();
writer.close();
socket.close();
// 向所有在线用户发送该用户的下线命令
for(int i = clients.size()1;i >= 0;i--){
if(clients.get(i).getUser()== user){
ClientThread temp = clients.get(i);
clients.remove(i);// 删除此用户的服务线程
temp.stop();// 停止这条服务线程
return;
}
}
} else {
dispatcherMessage(message);// 转发消息
}
} catch(IOException e){
e.printStackTrace();
}
}
} 其运行截图如下图所示:
(2)、客户端主程序
本程序使用了默认的卡片布局方式,对窗口的大小进行设置,让聊天窗口能
够居中显示,以及登录主窗口类。
实现窗口布局功能和类的调用功能的主要代码如下:
* 连接服务器
*
* @param port
* @param hostIp
* @param name
*/ public boolean connectServer(int port, String hostIp, String name){
// 连接服务器
try {
socket = new Socket(hostIp, port);// 根据端口号和服务器ip建立连接
writer = new PrintWriter(socket.getOutputStream());
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
// 发送客户端用户基本信息(用户名和ip地址)
sendMessage(name + ”@“ + socket.getLocalAddress().toString());
// 开启接收消息的线程
messageThread = new MessageThread(reader, textArea);
messageThread.start();
isConnected = true;// 已经连接上了
return true;
} catch(Exception e){
textArea.append(”与端口号为:“ + port + ” IP地址为:“ + hostIp
+ ” 的服务器连接失败!“ + ”rn“);
isConnected = false;// 未连接上
return false;
} }
(5)、聊天窗口程序设计
程序提供了发送文字和关闭聊天的的简单功能。以下是实现程序的主要方
法:
* 发送消息
*
* @param message
*/ public void sendMessage(String message){
writer.println(message);
writer.flush();}
/**
* 客户端主动关闭连接
*/ @SuppressWarnings(”deprecation“)public synchronized boolean closeConnection(){
try {
sendMessage(”CLOSE");// 发送断开连接命令给服务器
messageThread.stop();// 停止接受消息线程
// 释放资源
if(reader!= null){
reader.close();
}
if(writer!= null){
writer.close();
}
if(socket!= null){
socket.close();
}
isConnected = false;
return true;
} catch(IOException e1){
e1.printStackTrace();
isConnected = true;
return false;
} } 其运行截图如下图所示:
5.测试
程序在编码过程中,出现了许多的问题,有的是因为程序的完善性不够好而造成的,有的是因为技术不够而无法解决。通过不停的调试,修改,多数已发现的问题都已完善,但依然存在少数的问题无法解决。例如,在用户注册这个功能中,当用户的用户名重复时,服务器会出现用户名重复的异常,服务器就不会响应。
6.结论
通过这次程序的实训,我知道了自己在许多地方的不足,虽然书上的程序基本能看懂,但是自己的编程实践能力实在是欠缺,而且我知道了,Java语言最重要的不仅仅是学好语法,而Java中最重要的还是要理解它的面向对象编程的思想,理解它的面向对象的特征。因为学习任何一门语言最重要的就是理解它的思想,要做到知其然,并且知其所以然。要学会真正的编写程序,而不仅仅是把语法背的滚瓜烂熟。还要经常写代码,做到一边写一边理解,这样才能真正的实现学习Java语言的目的。
这次实训也告诉了我,光有书上的知识对我们来说是远远不够的,如果我们要想让自己在编程上有所突破的话,我们必须拓展自己的知识面,此次程序设计就给我增加了不少的知识,让我在编程方面学到了许多编程所需要的东西,还有也锻炼我的耐性,磨砺了我的意志,在错误面前反复修改但是从不气馁。
所以,这次实训让我受益匪浅,不管是在知识方面还是做事方面,都交会了我许多。同时还巩固了以前所学的知识,学到了不少书本上没有的知识;学到了很多java编程知识,并学会了简单的使用Eclipse来开发Java程序的一些使用技巧这次课程设计是对我本学期所学的知识的检验,由此我发现了不少的问题。可以说它给了我一次自我评估的机会。通过设计让我知道了那些方面我还是有欠缺的,促使我花时间弥补。
临近考试,时间太紧迫,致使程序实现的功能在方法上也许不是很完美,但我以后会多向老师请教,自己也要加强对Java 的学习。努力进一步提高自己的编程水平。
参考文献
[1]耿祥义.Java课程设计:清华大学出版社第二版,2008年11月.[2]马皓.Java语言程序设计:机械工业出版社,2007年3月 [3]孙卫琴.java 面向对象编程.电子工业出版社.2007 [4]刘海军.Java程序设计.中国铁道出版社,2006 [5]郑阿奇,姜乃松,殷红先.Java实用教程.电子工业出版社,2005 [6]张广彬、王小宁、高静, Java课程设计案例精编(第二版)清华大学出版社,2011年
第四篇:java聊天室课程设计报告
课程设计报告
2011 ~ 2012 学年 第 一 学期
学 号 20104053020 姓 名 胡勇昌 院 系 信息工程与技术 专 业 计算机工程系 课 程 名 称 JAVA程序设计 课程设计名称 局域网内的多功能聊天室
学 时 学 分 1 指 导 教 师 许烁娜
2011年 12 月 25 日
目录
课程设计报告..........................................................................................................................................1 第1章 引言............................................................................................................................................3 1.1 背景...............................................................................................................................................3 1.2 相关技术.......................................................................................................................................3 1.2.1 JAVA概述...............................................................................................................................3 1.2.2 Socket......................................................................................................................................3 1.2.3 TCP 三次握手.....................................................................................................................4 1.3 术语...............................................................................................................................................4 第2章 需求分析与系统设计................................................................................................................5 2.1 需求分析.......................................................................................................................................5 2.2 系统设计.......................................................................................................................................6 2.2.1多用户在线方案.....................................................................................................................6 2.2.2 系统功能................................................................................................................................6 第3章 系统实施....................................................................................................................................6 3.1聊天室窗口....................................................................................................................................6 3.2 建立客户端窗口...........................................................................................................................8 3.3 内嵌“私聊”窗口.......................................................................................................................9 3.4客服端类继承客户端窗口类,并内嵌私聊程序......................................................................10 第4章 测试..........................................................................................................................................15 4.1 测试环境与使用方法.................................................................................................................15 4.2 功能测试.....................................................................................................................................15 4.2.1聊天室窗口...........................................................................................................................15 4.2.2 客户端窗口..........................................................................................................................16
4.2.3 内嵌“私聊”窗口..........................................................................................................................16
参考文献................................................................................................................................................16
第1章 引言
1.1 背景
网络聊天室通常直称聊天室,是一种人们可以在线交谈的网络论坛,在同一聊天室的人们通过广播消息进行实时交谈。聊天室可以建立在即时通讯软件(如MSN Messenger、QQ)、P2P软件、万维网(如 Halapo,Meebo)等基础上,万维网方式更为普通和种类繁多,交谈的手段不局限于文本,更包括语音、视频。通常聊天室是按照房间或频道为单位的,在同一房间或频道的网人可以实时地广播和阅读公开消息。一般情况下,与其它网络论坛、即时通讯不同的是,聊天室不保存聊天记录。
1.2 相关技术 1.2.1 JAVA概述
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
1.2.2 Socket Socket是java中需一要编写较低层次的网络通信程序(例如Cljent/server应用程序)时提供的一种通讯机制。Socket是两个程序进行双向数据传输的网络通信的端点,一般 由一个地址加上一个端口号来标一识。每个服务程序都在一个众所周知的端口上提供服 务,而想使用服务的客户端程序则需要连接该端口。通过Socket的数据是原始字节流信 息,通信双方必须根据约定的协议对数据进行处理与解释。
Socket通信机制提供了两种通信.方式:有连接方式(TCP)和无连接方式(UDP数
据报)。有连接方式中,通信双方在开始时必须进行一次连接过程,建立一条通信链路。通信链路提供了可靠的,全双工的字节流服务。无连接力一式中,通信双方不存在一个连 接过程,一次网络I/O以一个数据报形式进行,而每次网络I /O可以和不同.主机的不 同进程进行。无连接方式开销小于有连接方式,但是所提供的数据传输服务不可靠,不 能保证数据报一定到达目的地”」·。
JAVA的有连接通信采用流式I/O模式。Socket是两个进程间通信链的端点,每个 Sockct有两个流:一个输入流和一个输出流。只要向Sockct的输出流写,一个进程就可 以通过网络连接向其他进程发送数据;同样,通过读Sockt的输入流,就可以读取传输 来的数据。
有连接通信一般要经历以下四个基本步骤ii
(1)创建Sockct,建立连接;
(2)打开连接到Sockct的输入/输出流;
(3)按照一定的一脚议对Socket进行读/写操作;
(4)关闭Socket。
第(3)步是程序员用来调用Socket和实现程序功能的关键步骤,其他三步在各种 程序中基本相同。
1.2.3 TCP 三次握手
TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-way handshake),过程如下图所示。
1.3 术语
暂无
第2章 需求分析与系统设计
2.1 需求分析
从技术发面来看,Java语言的优点一要表现在:简.单、面向对象、多线程、安全性 等方面。1.简单性
Java与C++语言灰常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对 必要的功能,如头文件、顶处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。Java实现了自动的垃圾收集,简化了内存管理的一作。这使程序一设计更加简便,同时减少了出错的可能。2.面向对象
Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的一方法,从而既实现了代码的复用,又提供了一种动态的解决方案。
Java是一种完全面向对象的程序设计语一言,它除了数组、布尔和字符二个基本数据类型外的其它类都是对象,它不再支持全局变量。在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一个类的实例,然后才能提交运行。
Java同样支持继承特性,Java的类可以从其它类中继承行为,但Java只支持类的 单重继承,即每个类只能从一个类中继承。
Java支持界面,界面允许程序员定义方法但又不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。3.多线程
多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容.易实现网络上的实时交互操作。
Java程序可以有多个执行线程,如可以让一个线程进行复杂的计算,而让另一个线 程与用户进行交互,这样用户可以在不中断计算线程的前提下与系统进行交互。多线程保证了较高的执行效率。4.安全性
Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。2.2 系统设计 2.2.1多用户在线方案 2.2.2 系统功能
聊天室程序通常需要完成以下一些基本功能:
(I)登录聊天室;
(2)启动服务器;
(3)关闭服务器;
(4)用户之间的聊天;
(5)退出聊天室。
本系统其体功能需求如下:
(1)聊天室管理员经登录界面登录到管理界而,即系统的服务器端。用户经登录界而 都进入聊天大厅。
(2)不论是管理员还是用户都需一要在登录界面输入正确的用户名和密码后才可以登录 到各自的界面中去。
(3)系统的两个主要界面都是为方便管理员和用户操作的。首先,管理员进入到管理 界而后可以方便的启动/停止服务器,看到在线用户的信息和聊人信息、。用户进入到聊天 大厅中可以聊天,查看服务器状态。
(4)一个用户退出聊天室对其他用户不能产生影响,而服务器断开与客户端的连接则所有的用户都失去与服务器的连接。
(5)用户的聊天信息录入,重写,发送,接收方便,快捷。
(6)服务器状态,聊天信息和在线用户人数及时刷新。
(7)聊天室系统运行稳定、安全性高、性能可靠。
第3章 系统实施
3.1聊天室窗口
建立服务端窗口类:窗口程序如下 import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.List;import java.awt.TextArea;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class chatroomW { JFrame f=new JFrame(“局域网聊天室”);JLabel label1=new JLabel(“端口”);JLabel label2=new JLabel(“发送”);Button button1=new Button(“启动服务”);Button button2=new Button(“发送”);Button button3=new Button(“刷新用户列表”);JTextField text1=new JTextField(5);JTextField text2=new JTextField(25);TextArea area1=new TextArea(26,84);List userList=new List(27);JScrollPane scro1,scro2;public chatroomW(){
chat();} public void chat(){
area1.setBackground(new Color(204,255,255));
area1.setForeground(Color.black);
userList.setBackground(Color.gray);
userList.setForeground(Color.white);
f.setLayout(new FlowLayout());f.add(area1);f.add(userList);f.add(label1);f.add(text1);f.add(button1);f.add(text2);f.add(button2);f.add(button3);
f.setBounds(300,200,750,485);
f.setResizable(false);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
area1.setEditable(false);text1.setText(“10000”);
myEvent();
} public static void main(String args[]){
new chatroomW();} public void myEvent(){} }
3.2 建立客户端窗口
import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;
import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class ClientW {
JFrame f=new JFrame(“聊天室”);JScrollPane js;TextArea area=new TextArea(19,67);JTextField text1=new JTextField(12);JTextField text2=new JTextField(5);JTextField text3=new JTextField(5);JTextField text4=new JTextField(20);JButton button1=new JButton(“连接”);JButton button2=new JButton(“发送”);JButton button3=new JButton(“私聊”);JLabel label1=new JLabel(“服务器地址”);JLabel label2=new JLabel(“服务器端口”);JLabel label3=new JLabel(“昵称”);public ClientW(){ } public void chat(){
area.setBackground(new Color(204,255,255));area.setForeground(Color.black);f.setLayout(new FlowLayout());f.setBounds(300,200,500,410);f.add(label1);f.add(text1);f.add(label2);chat();//
}
} f.add(text2);f.add(button1);f.add(area);f.add(label3);f.add(text3);f.add(text4);f.add(button2);f.add(button3);f.setVisible(true);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setResizable(false);area.setEditable(false);text2.setText(“10000”);text4.setText(null);myEvent();public void myEvent(){} public static void main(String args[]){ } new ClientW();
3.3 内嵌“私聊”窗口
class netchat{ JFrame f=new JFrame(“私聊”);JLabel label1,label2,label3;Button button1,button2;JTextField text1,text2,text3,text4;TextArea textarea;
f.setLayout(new FlowLayout());f.setBounds(300,200,400,310);//设置窗口大小和位置; label1=new JLabel(“对方主机”);label2=new JLabel(“本地端口”);label3=new JLabel(“对方端口”);button1=new Button(“连接”);button2=new Button(“发送”);text1=new JTextField(7);text2=new JTextField(3);text3=new JTextField(3);public netchat(){ f.setResizable(false);//让窗口大小固定;
// 闭;
} text4=new JTextField(20);textarea=new TextArea(13,53);textarea.setEditable(false);textarea.setBackground(new Color(204,250,255));f.add(label1);f.add(text1);f.add(label2);f.add(text2);f.add(label3);f.add(text3);f.add(button1);f.add(textarea);f.add(text4);f.add(button2);f.setVisible(true);f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//关闭窗口程序同时关myEvent();
3.4客服端类继承客户端窗口类,并内嵌私聊程序
import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.Socket;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;
public class Client extends ClientW{ Socket s=null;public Client(){} public void myEvent(){
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
s=new Socket(text1.getText().toString(),Integer.parseInt(text2.getText()));
new Thread(new LinkC()).start();
area.append(“[系统消息]:连接成功n”);
}catch(Exception ex){area.append(“[系统消息]:连接失败n”);}
}
});
button2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new SentC();
}
});
button3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new netchat();
}
});} public static void main(String args[]){
new Client();}
class LinkC implements Runnable{
public void run(){
try{
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
String msg=null;
PrintStream ps=new PrintStream(s.getOutputStream());
ps.println(text3.getText());
while(true){
try{
while((msg=bufIn.readLine())!=null){
area.append(msg+“n”);
}
}catch(Exception ex){break;}
}
}catch(Exception e){}
}
}
class SentC {
public SentC(){
try{
PrintStream ps=new PrintStream(s.getOutputStream());
if(!text4.getText().equals(“")){
ps.println(text4.getText());//
area.append(text4.getText());//服务器自动会返回
text4.setText(”“);
}
}catch(Exception e){}
}
} //私聊类
class netchat{
JFrame f=new JFrame(”私聊“);
JLabel label1,label2,label3;
Button button1,button2;
JTextField text1,text2,text3,text4;
TextArea textarea;
public netchat(){
f.setLayout(new FlowLayout());
f.setBounds(300,200,400,310);
//设置窗口大小和位置;
f.setResizable(false);
//让窗口大小固定;
label1=new JLabel(”对方主机“);
label2=new JLabel(”本地端口“);
label3=new JLabel(”对方端口“);
button1=new Button(”连接“);
button2=new Button(”发送“);
text1=new JTextField(7);
text2=new JTextField(3);
text3=new JTextField(3);
text4=new JTextField(20);
textarea=new TextArea(13,53);
textarea.setEditable(false);
textarea.setBackground(new Color(204,250,255));
text2.setText(”10000“);
text3.setText(”10000“);
f.add(label1);
f.add(text1);
f.add(label2);
f.add(text2);
f.add(label3);
f.add(text3);
f.add(button1);
f.add(textarea);
f.add(text4);
f.add(button2);
f.setVisible(true);//
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//关闭窗口程序同时关闭;
myEvent();
}
public void myEvent(){
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
try{
DatagramSocket ds=new DatagramSocket();
byte[] buf=”对方已下线“.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
ds.send(dp);
ds.close();
}catch(Exception ex){}
}
});
button2.addActionListener(new ActionListener()//事件源是button2
{
public void actionPerformed(ActionEvent e)
{
if(!text4.getText().equals(”“))
new Thread(new Send()).start();
}
});
button1.addActionListener(new ActionListener()//事件源是button1
{
public void actionPerformed(ActionEvent e)
{
new Thread(new Rece()).start();
}
});
}
class Send implements Runnable{
public void run(){ try{UdpSend();}catch(Exception e){textarea.append(”[系统消息]:发送失败n“);}}
public void UdpSend()throws Exception{
DatagramSocket ds=new DatagramSocket();
byte[] buf=text4.getText().getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
textarea.append(”[我]: “+text4.getText()+”n“);
text4.setText(”“);
ds.send(dp);
ds.close();
}
}
class Rece implements Runnable{
int index=0;
public void run(){
try{
UdpRece();
}catch(Exception e){
textarea.append(”[系统消息]:连接失败n“);
}
}
public void UdpRece()throws Exception{
while(true){
DatagramSocket ds=new DatagramSocket(Integer.parseInt(text2.getText()));
if(index==0){textarea.append(”[系统消息]:连接成功n“);}
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String data=new String(dp.getData(),0,dp.getLength());
textarea.append(dp.getAddress()+” “+data+”n");
index++;
ds.close();
}
}
}
} } 第4章 测试
4.1 测试环境与使用方法
测试环境:测试环境:电脑安装Java JDK 服务器端使用方法:打开服务启动,点击“启动服务”,提示“启动服务成功”表示正常启动。否则,先关闭服务端,再重新打开,启动服务。客户端使用方法:打开客户端,输入“服务器地址”,点击“连接”,如成功连接系统提示“成功连接”,并收到服务端返回的“欢迎”信息,否则关闭并重新启动。
私聊功能使用方法:点击面板上的“私聊”按钮,输入对方的IP地址,点击连接,如连接成功系统会提示“连接成功”。当对方断开时会收到“对方已下线”提示。如果要同时跟多人私聊,则要改变本地端口值,并告知对方。
4.2 功能测试 4.2.1聊天室窗口
4.2.2 客户端窗口
4.2.3 内嵌“私聊”窗口
参考文献
用JAVA程序实现参考文献的录入与生成 刘玮玮 2009 《福建电脑》
基于Java移动Agent系统的安全参考模型 周屹 2007 《黑龙江工程学院学报》
嵌入式Java虚拟机的性能优化技术 李允 2004 《计算机工程》
第五篇:JAVA课程设计之简单聊天室
课程设计报告
课程名称 课程代码 题
目 年级/专业/班 学生姓名 学
号 指导老师 开题时间 完成时间 Java程序设计
简单聊天室
孟青 09308910203
I
: : : : : : : : :
目
录
摘要..............................................................................................................................................................I 1 引言...........................................................................................................................................................1 2 设计任务与目的.......................................................................................................................................1 3 需求分析...................................................................................................................................................1 3.1 系统用例图............................................................................................................................1 3.2 主要用例分析........................................................................................................................2 4 系统设计.................................................................................................................................................3 4.1 总体设计........................................................................................................................................3 4.1.1 系统类图.............................................................................................................................3 4.1.2 主要时序图.........................................................................................................................6 4.2 详细设计........................................................................................................................................8 4.2.1 ChatServer类......................................................................................................................9 4.2.2 ServerListen类..................................................................................................................10 4.2.3 ServerReceive类...............................................................................................................10 4.2.4 PortConf类.......................................................................................................................11 4.2.5 Help类..............................................................................................................................11 4.2.6 UserLinkList类.................................................................................................................11 4.2.7 Node类.............................................................................................................................12 4.2.8 ChatClient类.....................................................................................................................13 4.2.9 ConnectConf类.................................................................................................................15 4.2.10 UserConf类....................................................................................................................15 4.2.11 Help类............................................................................................................................16 4.2.12 ClientReceive类.............................................................................................................16 5 系统实现.................................................................................................................................................16 5.1 系统主要用例的实现..................................................................................................................16 5.1.1 聊天室服务端用例运行效果...........................................................................................17 5.1.2 聊天室客户端用例运行效果...........................................................................................18 5.2 系统发布与运行..........................................................................................................................18 5.2.1 系统打包...........................................................................................................................18 5.2.2 系统发布与运行...............................................................................................................18 6 结束语.....................................................................................................................................................19 参考文献.......................................................................................................................................................19 致谢...............................................................................................................................................................19 附录A:系统源程序...................................................................................................................................20
1、ChatServer类..........................................................................................................................20
2、ServerListen类.......................................................................................................................31
3、ServerReceive类.....................................................................................................................32
4、UserLinkList类.......................................................................................................................36
5、Node类...................................................................................................................................39
I
6、PortConf类.............................................................................................................................40
7、Help类....................................................................................................................................42
8、ChatClient类...........................................................................................................................44
9、ClientReceive类.....................................................................................................................56
10、ConnectConf类.....................................................................................................................58
11、UserConf类...........................................................................................................................61
12、Help类..................................................................................................................................63 附录B:编码规范.......................................................................................................................................66
II
摘要
本课程设计我们通过聊天室的代码实现,体会到将理论知识与具体实现相结合,巩固Java相关方法。聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆到服务器才可以实现正常的聊天功能。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。
关键词:(3-5个,每个之间用分号隔开)聊天室;多线程;C/S模式
Abstract
The course design our chat room through the code, understand the theoretical knowledge and practical realization of the combination, the consolidation of java-related methods.Chat client and the server is divided into two parts, the client, server-side program is mainly responsible for listening client sent the news to be landing the client to the server will be realized only if the normal chat.The chat system to exchange-based chat, in order to provide customers with a network platform for interpersonal communication, but also network with the reality of the practical is the closest site.Key words: Chat rooms, multi-threaded, C / S mode I
简单聊天室 引言
随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。本文所介绍的网络聊天系统是基于开放的JAVA应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求,且具有脱离数据库技术方法,易于维护和更新的特点。设计任务与目的
本聊天室程序基于C/S模式,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆到服务器才可以实现正常的聊天功能。
通过本项目的设计实践,力求熟练掌握GUI程序设计、多线程技术、基于TCP的Socket通信编程。需求分析
本系统所要实现的主要功能是为广大用户提供一个借助网络进行人际交往的平台。因为服务端采用多线程,所以性能有很大提升。因为服务端和客户端之间采用TCP协议进行网络通信,建立的是可靠的、端到端的网络连接,所以可靠性和安全性都很好。
3.1 系统用例图
图3-1 系统用例图
3.2 主要用例分析 服务器端的主要功能如下:
1,在特定端口上进行侦听,等待客户端连接
2,用户可以配置服务端的侦听端口,默认端口为8888.3,向已经连接到服务端的用户发送系统消息。4,统计在线人数
5,当停止服务时,断开所有的用户连接。客户端的主要功能如下:
1,连接到已经开启的聊天服务的服务端。
2,用户可以配置要连接服务器端的IP地址和端口号。3,用户可以配置连接后显示的用户名。
4,当服务器端开启的时候,用户可以随时登录和注销。5,用户可以向所有人或者某一个人发送消息。
系统设计 4.1 总体设计
4.1.1 系统类图
图4-1-1 服务端系统类图
图4-1-2 客户端系统类图
4.1.2 主要时序图
图4-2-1 服务端主要时序类图
图4-2-2 客户端主要时序类图
4.2 详细设计
聊天室服务器端的设计
聊天室服务端主要包括7个类,放在server包中:
4.2.1 ChatServer类
图4-3 ChatServer类图
ChatServer.java 包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加时间
监听与时间处理。调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发。
4.2.2 ServerListen类
图4-4 ServerListen类图
ServerListen.java 该类实现服务器用户上线与下线的监听。该类对用户上线下线的监听是通过调用用户链表类(UserLinkList)来实现的。当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。
4.2.3 ServerReceive类
图4-5 ServerReceive类图
ServerReceive.java 该类是实现服务器消息收发的类,该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的街面上。
4.2.4 PortConf类
图4-6 PortConf类图
PortConf.java
该类继承自Jdialog,是用户对服务器端监听端口进行修改配置的类。
4.2.5 Help类
图4-7 Help类图
Help.java
服务端程序帮助类。
4.2.6 UserLinkList类
图4-8 UserLinkList类图
UserLinkList.java
用户链表节点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。
4.2.7 Node类
图4-9 Node类图
Node.java 用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node类的功能相当。聊天室客户端设计
聊天室客户端主要包括5个类,放在client包中:
4.2.8 ChatClient类
图4-10 ChatClient类图
ChatClient.java 包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加时间监听与事件处理。该类定义了Connect()与DisConnect()方法实现与客户端的连接与断开连接。当登陆到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessaga()方法来其他用户发送带有表情的消息或悄悄话。
4.2.9 ConnectConf类
图4-11 ConnectConf类图
ConnectConf.java 该类继承自Jdialog,是用户对所有要连接的服务器IP及监听端口进行修改配置的类。
4.2.10 UserConf类
图4-12 UserConf类图
UserConf.java
该类继承自Jdialog,是用户对链接到服务器时所显示的用户名进行修改配置的类。
4.2.11 Help类
图4-13 Help类图
Help.java 客户端程序的帮助类。
4.2.12 ClientReceive类
图4-14 ClientReceive类图
ClientReceive.java 该类是实现服务器端与客户端消息收发的类。系统实现
5.1 系统主要用例的实现
5.1.1 聊天室服务端用例运行效果
图5-1 聊天室服务端用例运行效果图
5.1.2 聊天室客户端用例运行效果
图5-2 聊天室客户端用例运行效果图
5.2 系统发布与运行
5.2.1 系统打包
使用MyEclipse自带的打包工具分别将server包和client包中的.class文件打成两个Jar包:ChatServer.jar和CharClient.jar。
5.2.2 系统发布与运行
将server包和client包中的.class文件打成两个Jar包,就可以发布系统了。直接分别双击两个Jar包(ChatServer.jar和CharClient.jar),就可以运行服务端和客户端了。
结束语
Java面向对象程序设计是一门应用广泛并且实用性极强的高级程序设计语言。通过本次课程设计,我们对面向对象的基本思想有了进一步的理解,对项目的各个阶段的任务也有了一定的了解。设计开始阶段必须明确设计的目的与需求分析,总体设计要全面分析聊天室系统的架构。通过这次设计,使我们认识到体系的架构是最重要的,只有准确的系统设计、很好的定义各个模块及模块之间的关系,才能在编码阶段更轻松的的实现。
通过这次课程设计,对我们的逻辑思维能力是一个很大的锻炼,它不仅加强了我们的系统思考问题的能力,而且还改变了我们以前不好的编程习惯,虽然花费了不少的时间,但是我们学到了丰富的知识。
另外,此次课程设计也提高了我们的团对合作精神,让我们明白不是不能一个人能单独完成,而是要集思广益,结合更多的人的创意思维。让我们大家深刻的体会到理论与实际相结合的重要性与微妙之处。对于不同的想法我们都会集中讨论并对好的意见加以借鉴,在这个讨论的过程中,还更正了不少我们各自自身对于某个知识点的误区。
这次程序设计也是一个毅力的考验过程。有时候往往只是一个小小的错误,却要花出几小时甚至是一两天的时间才可能发现它。所以在这个过程不能过于急躁,要很有耐心将程序反复调试,参考文献
[1] 张广彬,孟红蕊,张永宝.Java课程设计案例精编[M].北京:清华大学出版社,2007,1.[2] 黄晓东.Java课程设计案例精编[M].北京:中国水利水电出版社,2004,5.[3] 求是科技.Java信息管理系统开发实例导航[M].北京:人民邮电出版社,2005,4.[4] 求是科技.Java数据库系统开发实例导航[M].北京:人民邮电出版社,2004,9.[5]廖卫东Java程序设计实用指南[M].北京:机械工业出版社,2002.1[3] [6]李卫华,傅晓东.Java语言基础及其应用[M]北京:中国水利水电出版社,1996[5]
致谢
本次课程由上海杰普公司三为指导老师以及我们任课老师郭老师精心辅导,让我们大家深刻的体会到理论与实际相结合的重要性与微妙之处。使我们对java有了更深刻的认识,产生浓厚的学习兴趣。我们由衷对他们表示感谢。
附录A:系统源程序
1、ChatServer类
功能:为定义服务器端的界面,添加时间监听与时间处理。调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发。代码:
package server;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.net.*;/* * 聊天服务端的主框架类 */ public class ChatServer extends JFrame implements ActionListener{
/** * */ private static final long serialVersionUID = 1L;
public static int port = 8888;//服务端的侦听端口
ServerSocket serverSocket;//服务端Socket JComboBox combobox;//选择发送消息的接受者
JTextArea messageShow;//服务端的信息显示
JScrollPane messageScrollPane;//信息显示的滚动条
JTextField showStatus;//显示用户连接状态
JLabel sendToLabel,messageLabel;JTextField sysMessage;//服务端消息的发送
JButton sysMessageButton;//服务端消息的发送按钮
UserLinkList userLinkList;//用户链表
//建立菜单栏
JMenuBar jMenuBar = new JMenuBar();//建立菜单组
JMenu serviceMenu = new JMenu(“服务(V)”);//建立菜单项
JMenuItem portItem = new JMenuItem(“端口设置(P)”);JMenuItem startItem = new JMenuItem(“启动服务(S)”);
JMenuItem stopItem=new JMenuItem(“停止服务(T)”);JMenuItem exitItem=new JMenuItem(“退出(X)”);
JMenu helpMenu=new JMenu(“帮助(H)”);JMenuItem helpItem=new JMenuItem(“帮助(H)”);//建立工具栏
JToolBar toolBar = new JToolBar();//建立工具栏中的按钮组件
JButton portSet;//启动服务端侦听 JButton startServer;//启动服务端侦听 JButton stopServer;//关闭服务端侦听 JButton exitButton;//退出按钮
//框架的大小
Dimension faceSize = new Dimension(400, 600);
ServerListen listenThread;JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;/** * 服务端构造函数 */ public ChatServer(){ init();//初始化程序
//添加框架的关闭事件处理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//设置框架的大小
this.setSize(faceSize);//设置运行时窗口的位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(“聊天室服务端”);//设置标题
setVisible(true);
//为服务菜单栏设置热键'V'
serviceMenu.setMnemonic('V');
//为端口设置快捷键为ctrl+p
portItem.setMnemonic('P');
portItem.setAccelerator(KeyEvent.VK_P,InputEvent.CTRL_MASK));
//为启动服务快捷键为ctrl+s
startItem.setMnemonic('S');
startItem.setAccelerator(KeyEvent.VK_S,InputEvent.CTRL_MASK));
//为端口设置快捷键为ctrl+T
stopItem.setMnemonic('T');
stopItem.setAccelerator(KeyEvent.VK_T,InputEvent.CTRL_MASK));
//为退出设置快捷键为ctrl+x
exitItem.setMnemonic('X');
exitItem.setAccelerator(KeyEvent.VK_X,InputEvent.CTRL_MASK));
//为帮助菜单栏设置热键'H'
helpMenu.setMnemonic('H');
//为帮助设置快捷键为ctrl+p
helpItem.setMnemonic('H');
helpItem.setAccelerator(KeyEvent.VK_H,InputEvent.CTRL_MASK));
}
/** * 程序初始化函数
*/ public void init(){
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
//添加菜单栏
serviceMenu.add(portItem);serviceMenu.add(startItem);serviceMenu.add(stopItem);serviceMenu.add(exitItem);jMenuBar.add(serviceMenu);helpMenu.add(helpItem);jMenuBar.add(helpMenu);setJMenuBar(jMenuBar);//初始化按钮
portSet = new JButton(“端口设置”);startServer = new JButton(“启动服务”);stopServer = new JButton(“停止服务”);exitButton = new JButton(“退出”);//将按钮添加到工具栏 toolBar.add(portSet);toolBar.addSeparator();//添加分隔栏 toolBar.add(startServer);toolBar.add(stopServer);toolBar.addSeparator();//添加分隔栏 toolBar.add(exitButton);contentPane.add(toolBar,BorderLayout.NORTH);//初始时,令停止服务按钮不可用 stopServer.setEnabled(false);stopItem.setEnabled(false);//为菜单栏添加事件监听
portItem.addActionListener(this);startItem.addActionListener(this);stopItem.addActionListener(this);exitItem.addActionListener(this);helpItem.addActionListener(this);
//添加按钮的事件侦听
portSet.addActionListener(this);startServer.addActionListener(this);stopServer.addActionListener(this);exitButton.addActionListener(this);
combobox = new JComboBox();combobox.insertItemAt(“所有人”,0);combobox.setSelectedIndex(0);23
messageShow = new JTextArea();messageShow.setEditable(false);//添加滚动条
messageScrollPane = new JScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(new Dimension(400,400));messageScrollPane.revalidate();
showStatus = new JTextField(35);showStatus.setEditable(false);
sysMessage = new JTextField(24);sysMessage.setEnabled(false);sysMessageButton = new JButton();sysMessageButton.setText(“发送”);//添加系统消息的事件侦听
sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel = new JLabel(“发送至:”);messageLabel = new JLabel(“发送消息:”);downPanel = new JPanel();girdBag = new GridBagLayout();downPanel.setLayout(girdBag);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 0;girdBagCon.gridwidth = 3;girdBagCon.gridheight = 2;girdBagCon.ipadx = 5;girdBagCon.ipady = 5;JLabel none = new JLabel(“ ”);girdBag.setConstraints(none,girdBagCon);downPanel.add(none);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 2;girdBagCon.insets = new Insets(1,0,0,0);girdBagCon.ipadx = 5;24
girdBagCon.ipady = 5;girdBag.setConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx =1;girdBagCon.gridy = 2;girdBagCon.anchor = GridBagConstraints.LINE_START;girdBag.setConstraints(combobox,girdBagCon);downPanel.add(combobox);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 3;girdBag.setConstraints(messageLabel,girdBagCon);downPanel.add(messageLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 1;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessage,girdBagCon);downPanel.add(sysMessage);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 2;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 4;girdBagCon.gridwidth = 3;girdBag.setConstraints(showStatus,girdBagCon);downPanel.add(showStatus);contentPane.add(messageScrollPane,BorderLayout.CENTER);contentPane.add(downPanel,BorderLayout.SOUTH);
//关闭程序时的操作
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
stopService();25
}
System.exit(0);
} });/** * 事件处理 */ public void actionPerformed(ActionEvent e){ Object obj = e.getSource();if(obj == startServer || obj == startItem){ //启动服务端
startService();} else if(obj == stopServer || obj == stopItem){ //停止服务端
int j=JOptionPane.showConfirmDialog(this,“真的停止服务吗?”,“停止服务”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j == JOptionPane.YES_OPTION){
stopService();
} } else if(obj == portSet || obj == portItem){ //端口设置
//调出端口设置的对话框
PortConf portConf = new PortConf(this);
portConf.setVisible(true);} else if(obj == exitButton || obj == exitItem){ //退出程序
int j=JOptionPane.showConfirmDialog(this,“真的要退出吗?”,“退出”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j == JOptionPane.YES_OPTION){
stopService();
System.exit(0);
} } else if(obj == helpItem){ //菜单栏中的帮助
//调出帮助对话框
Help helpDialog = new Help(this);
helpDialog.setVisible(true);} else if(obj == sysMessage || obj == sysMessageButton){ //发送系统消息
sendSystemMessage();} } /** * 启动服务端 */ public void startService(){ try{
serverSocket = new ServerSocket(port,10);
messageShow.append(“服务端已经启动,在”+port+“端口侦听...n”);
startServer.setEnabled(false);
startItem.setEnabled(false);
portSet.setEnabled(false);
portItem.setEnabled(false);
stopServer.setEnabled(true);
stopItem.setEnabled(true);
sysMessage.setEnabled(true);} catch(Exception e){
//System.out.println(e);} userLinkList = new UserLinkList();
listenThread = new ServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);listenThread.start();} /** * 关闭服务端 */ public void stopService(){ try{
//向所有人发送服务器关闭的消息
sendStopToAll();
listenThread.isStop = true;
serverSocket.close();
int count = userLinkList.getCount();
int i =0;27
while(i < count){ Node node = userLinkList.findUser(i);
node.input.close();node.output.close();node.socket.close();
i ++;} stopServer.setEnabled(false);stopItem.setEnabled(false);startServer.setEnabled(true);startItem.setEnabled(true);portSet.setEnabled(true);portItem.setEnabled(true);sysMessage.setEnabled(false);messageShow.append(“服务端已经关闭n”);
combobox.removeAllItems();
combobox.addItem(“所有人”);} catch(Exception e){
//System.out.println(e);} } /** * 向所有人发送服务器关闭的消息 */ public void sendStopToAll(){ int count = userLinkList.getCount();
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(“服务关闭”);28
node.output.flush();
}
catch(Exception e){
//System.out.println(“$$$”+e);
}
i++;} } /** * 向所有人发送消息 */ public void sendMsgToAll(String msg){ int count = userLinkList.getCount();//用户总数
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(“系统信息”);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch(Exception e){
//System.out.println(“@@@”+e);
}
i++;} sysMessage.setText(“");} /** * 向客户端用户发送消息 */ public void sendSystemMessage(){ 29
} String toSomebody = combobox.getSelectedItem().toString();String message = sysMessage.getText()+ ”n“;
messageShow.append(message);
//向所有人发送消息
if(toSomebody.equalsIgnoreCase(”所有人“)){ sendMsgToAll(message);} else{ //向某个用户发送消息
Node node = userLinkList.findUser(toSomebody);
try{
node.output.writeObject(”系统信息“);
node.output.flush();
node.output.writeObject(message);
node.output.flush();} catch(Exception e){
//System.out.println(”!!“+e);} sysMessage.setText(”“);//将发送消息栏的消息清空 } public static void main(String[] args){ try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} catch(ClassNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(InstantiationException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(IllegalAccessException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(UnsupportedLookAndFeelException e){
// TODO Auto-generated catch block
e.printStackTrace();} new ChatServer();} 30
}
2、ServerListen类
功能:实现服务器用户上线与下线的监听。该类对用户上线下线的监听是通过调用用户链表类(UserLinkList)来实现的。当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。
代码:
package server;
import javax.swing.*;import java.io.*;import java.net.*;/* * 服务端的侦听类 */ public class ServerListen extends Thread { ServerSocket server;
JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList userLinkList;//用户链表
Node client;ServerReceive recvThread;
public boolean isStop;
/* * 聊天服务端的用户上线于下线侦听类
*/ public ServerListen(ServerSocket server,JComboBox combobox,JTextArea textarea,JTextField textfield,UserLinkList userLinkList){
this.server = server;
this.combobox = combobox;
this.textarea = textarea;
this.textfield = textfield;
this.userLinkList = userLinkList;
isStop = false;}
public void run(){
while(!isStop &&!server.isClosed()){
try{
client = new Node();
client.socket = server.accept();
client.output = new ObjectOutputStream(client.socket.getOutputStream());
client.output.flush();
client.input = new ObjectInputStream(client.socket.getInputStream());
client.username =(String)client.input.readObject();
//显示提示信息
combobox.addItem(client.username);
userLinkList.addUser(client);
textarea.append(”用户 “ + client.username + ” 上线“ + ”n“);
textfield.setText(”在线用户“ + userLinkList.getCount()+ ”人n“);
recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);
recvThread.start();
}
catch(Exception e){
}
} } }
3、ServerReceive类
功能:实现服务器消息收发的类,该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的街面上。
代码:
package server;
import javax.swing.*;/* * 服务器收发消息的类 */ public class ServerReceive extends Thread { JTextArea textarea;JTextField textfield;JComboBox combobox;
Node client;UserLinkList userLinkList;//用户链表
public boolean isStop;
public ServerReceive(JTextArea textarea,JTextField textfield, JComboBox combobox,Node client,UserLinkList userLinkList){ this.textarea = textarea;this.textfield = textfield;this.client = client;this.userLinkList = userLinkList;this.combobox = combobox;
isStop = false;}
public void run(){ //向所有人发送用户的列表
sendUserList();
while(!isStop &&!client.socket.isClosed()){
try{
String type =(String)client.input.readObject();
if(type.equalsIgnoreCase(”聊天信息“)){
String toSomebody =(String)client.input.readObject();
String status =(String)client.input.readObject();
String action =(String)client.input.readObject();
String message =(String)client.input.readObject();
String msg = client.username
+” “+ action
+ ”对 “
+ toSomebody
+ ” 说 : “
+ message
+ ”n“;
if(status.equalsIgnoreCase(”悄悄话“)){
msg = ” [悄悄话] “ + msg;
}
textarea.append(msg);
if(toSomebody.equalsIgnoreCase(”所有人“)){ 33
sendToAll(msg);//向所有人发送消息
} else{
try{
client.output.writeObject(”聊天信息“);
client.output.flush();
client.output.writeObject(msg);
client.output.flush();
}
catch(Exception e){
//System.out.println(”###“+e);
}
Node node = userLinkList.findUser(toSomebody);
if(node!= null){
node.output.writeObject(”聊天信息“);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
} } } else if(type.equalsIgnoreCase(”用户下线“)){ Node node = userLinkList.findUser(client.username);userLinkList.delUser(node);
String msg = ”用户 “ + client.username + ” 下线n“;int count = userLinkList.getCount();
combobox.removeAllItems();combobox.addItem(”所有人“);int i = 0;while(i < count){ node = userLinkList.findUser(i);if(node == null){
i ++;
continue;} combobox.addItem(node.username);i++;} combobox.setSelectedIndex(0);34
textarea.append(msg);
textfield.setText(”在线用户“ + userLinkList.getCount()+ ”人n“);
sendToAll(msg);//向所有人发送消息
sendUserList();//重新发送用户列表,刷新
break;
}
}
catch(Exception e){
//System.out.println(e);
} } } /* * 向所有人发送消息 */ public void sendToAll(String msg){ int count = userLinkList.getCount();
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(”聊天信息“);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch(Exception e){
//System.out.println(e);
}
i++;} }
} /* * 向所有人发送用户的列表 */ public void sendUserList(){ String userlist = ”“;int count = userLinkList.getCount();
} int i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){
i ++;
continue;}
userlist += node.username;userlist += 'n';i++;}
i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){
i ++;
continue;}
try{
node.output.writeObject(”用户列表“);
node.output.flush();
node.output.writeObject(userlist);
node.output.flush();} catch(Exception e){
//System.out.println(e);} i++;}
4、UserLinkList类
功能:用户链表节点的具体实现类。该类通过构造函数构造用户链表,定义了添加
用户、删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。
代码:
package server;/** * 用户链表 */ public class UserLinkList { Node root;Node pointer;int count;
/** * 构造用户链表
*/ public UserLinkList(){
root = new Node();
root.next = null;
pointer = null;
count = 0;}
/** * 添加用户
*/ public void addUser(Node n){
pointer = root;
while(pointer.next!= null){
pointer = pointer.next;
}
pointer.next = n;
n.next = null;
count++;
}
/** * 删除用户
*/ public void delUser(Node n){
pointer = root;
while(pointer.next!= null){
if(pointer.next == n){
pointer.next = n.next;
count--;
break;
}
pointer = pointer.next;} } /** * 返回用户数 */ public int getCount(){ return count;} /** * 根据用户名查找用户 */ public Node findUser(String username){ if(count == 0)return null;
pointer = root;
while(pointer.next!= null){
pointer = pointer.next;
if(pointer.username.equalsIgnoreCase(username)){
return pointer;
} }
return null;} /** * 根据索引查找用户 */ public Node findUser(int index){ if(count == 0){
return null;38
}
} }
if(index < 0){ return null;}
pointer = root;
int i = 0;while(i < index + 1){ if(pointer.next!= null){
pointer = pointer.next;} else{
return null;}
i++;}
return pointer;
5、Node类
功能:用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node类的功能相当。
代码:
package server;
import java.net.*;import java.io.*;/** * 用户链表的结点类 */ public class Node { String username = null;Socket socket = null;ObjectOutputStream output = null;ObjectInputStream input = null;
Node next = null;39
}
6、PortConf类
功能:该类继承自Jdialog,是用户对服务器端监听端口进行修改配置的类。代码:
package server;
import java.awt.*;import javax.swing.*;import java.awt.event.*;/** * 生成端口设置对话框的类 */ public class PortConf extends JDialog { /** * */ private static final long serialVersionUID = 1L;JPanel panelPort = new JPanel();JButton save = new JButton();JButton cancel = new JButton();public static JLabel DLGINFO=new JLabel(” 默认端口号为:8888“);
JPanel panelSave = new JPanel();JLabel message = new JLabel();
public static JTextField portNumber;
public PortConf(JFrame frame){
super(frame, true);
try {
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
//设置运行位置,使对话框居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width600)/ 2 + 150);
this.setResizable(false);40
}
private void jbInit()throws Exception {
this.setSize(new Dimension(300, 120));
this.setTitle(”端口设置“);
message.setText(”请输入侦听的端口号:“);
portNumber = new JTextField(10);
portNumber.setText(”“+ChatServer.port);
save.setText(”保存“);
cancel.setText(”取消“);
panelPort.setLayout(new FlowLayout());
panelPort.add(message);
panelPort.add(portNumber);
panelSave.add(new Label(” “));
panelSave.add(save);
panelSave.add(cancel);
panelSave.add(new Label(” “));
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(panelPort, BorderLayout.NORTH);
contentPane.add(DLGINFO, BorderLayout.CENTER);
contentPane.add(panelSave, BorderLayout.SOUTH);
//保存按钮的事件处理
save.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent a){
int savePort;
try{
savePort=Integer.parseInt(PortConf.portNumber.getText());
if(savePort<1 || savePort>65535){
PortConf.DLGINFO.setText(” 侦听端口必须是0-65535之间的整数!“);
PortConf.portNumber.setText(”“);
return;
}
ChatServer.port = savePort;
dispose();
} 41
catch(NumberFormatException e){
PortConf.DLGINFO.setText(” 错误的端口号,端口号请填写整数!“);
PortConf.portNumber.setText(”“);
return;
}
}
});
//关闭对话框时的操作
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
DLGINFO.setText(”
为:8888“);
}
});
//取消按钮的事件处理
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
DLGINFO.setText(”
为:8888“);
dispose();
}
});} }
7、Help类
功能:服务端程序帮助类。代码:
package server;
import java.awt.*;import javax.swing.*;import java.awt.event.*;/** 42
默认端口号默认端口号
* 生成设置对话框的类 */ public class Help extends JDialog {
/** * */ private static final long serialVersionUID = 1L;JPanel titlePanel = new JPanel();JPanel contentPanel = new JPanel();JPanel closePanel = new JPanel();
JButton close = new JButton();JLabel title = new JLabel(”聊天室服务端帮助“);JTextArea help = new JTextArea();
Color bg = new Color(255,255,255);
public Help(JFrame frame){
super(frame, true);
try {
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
//设置运行位置,使对话框居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width320)/ 2);
this.setResizable(false);}
private void jbInit()throws Exception {
this.setSize(new Dimension(400, 200));
this.setTitle(”帮助“);
titlePanel.setBackground(bg);;
contentPanel.setBackground(bg);
closePanel.setBackground(bg);
help.setText(”
1、设置服务端的侦听端口(默认端口为8888)。n“+
”
2、点击 启动服务 按钮便可在指定的端口启动服务。n“+
”
3、选择需要接受消息的用户,在消息栏中写入消息,之后便可发送消息。n“+ 43
}
} ”
4、信息状态栏中显示服务器当前的启动与停止状态、“+ ”用户发送的消息和n 服务器端发送的系统消息。“);help.setEditable(false);titlePanel.add(new Label(” “));titlePanel.add(title);titlePanel.add(new Label(” “));contentPanel.add(help);closePanel.add(new Label(” “));closePanel.add(close);closePanel.add(new Label(” “));Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout());contentPane.add(titlePanel, BorderLayout.NORTH);contentPane.add(contentPanel, BorderLayout.CENTER);contentPane.add(closePanel, BorderLayout.SOUTH);close.setText(”关闭“);//事件处理
close.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dispose();
} });
8、ChatClient类
功能:定义客户端的界面,添加时间监听与事件处理。该类定义了Connect()与DisConnect()方法实现与客户端的连接与断开连接。当登陆到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessaga()方法来其他用户发送带有表情的消息或悄悄话。
代码:
package client;
import java.awt.*;import java.awt.event.*;import javax.swing.*;
import java.io.*;import java.net.*;/* * 聊天客户端的主框架类 */ public class ChatClient extends JFrame implements ActionListener{
/** * */ private static final long serialVersionUID = 1L;String ip = ”127.0.0.1“;//连接到服务端的ip地址
int port = 8888;//连接到服务端的端口号
String userName = ”匆匆过客“;//用户名
int type = 0;//0表示未连接,1表示已连接
JComboBox combobox;//选择发送消息的接受者
JTextArea messageShow;//客户端的信息显示
JScrollPane messageScrollPane;//信息显示的滚动条
JLabel express,sendToLabel,messageLabel;
JTextField clientMessage;//客户端消息的发送
JCheckBox checkbox;//悄悄话
JComboBox actionlist;//表情选择
JButton clientMessageButton;//发送消息
JTextField showStatus;//显示用户连接状态
Socket socket;ObjectOutputStream output;//网络套接字输出流
ObjectInputStream input;//网络套接字输入流
ClientReceive recvThread;
//建立菜单栏
JMenuBar jMenuBar = new JMenuBar();//建立菜单组
JMenu operateMenu = new JMenu(”操作(O)“);//建立菜单项
JMenuItem loginItem = new JMenuItem(”用户登录(I)“);JMenuItem logoffItem = new JMenuItem(”用户注销(L)“);JMenuItem exitItem=new JMenuItem(”退出(X)“);
JMenu conMenu=new JMenu(”设置(C)“);JMenuItem userItem=new JMenuItem(”用户设置(U)“);JMenuItem connectItem=new JMenuItem(”连接设置(C)“);
JMenu helpMenu=new JMenu(”帮助(H)“);JMenuItem helpItem=new JMenuItem(”帮助(H)“);//建立工具栏
JToolBar toolBar = new JToolBar();//建立工具栏中的按钮组件
JButton loginButton;//用户登录 JButton logoffButton;//用户注销 JButton userButton;//用户信息的设置 JButton connectButton;//连接设置 JButton exitButton;//退出按钮
//框架的大小
Dimension faceSize = new Dimension(400, 600);JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;
public ChatClient(){ init();//初始化程序
//添加框架的关闭事件处理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//设置框架的大小
this.setSize(faceSize);//设置运行时窗口的位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(”聊天室客户端");//设置标题 setVisible(true);//为操作菜单栏设置热键'V' operateMenu.setMnemonic('O');46