首页 毕业论文JAVA聊天室的设计

毕业论文JAVA聊天室的设计

举报
开通vip

毕业论文JAVA聊天室的设计湖北大学知行学院 本科毕业论文(设计) 题 目 基于JAVA的聊天室设计与实现 计算机与信息工程 系 计算机科学与技术 专业 学 号 0811050002 学生姓名 万小龙 指导教师 尤新华 起讫日期 2011. 10 ~ 2012. 4 工作地点 湖北大...

毕业论文JAVA聊天室的设计
湖北大学知行学院 本科毕业论文(设计) 题 目 基于JAVA的聊天室设计与实现 计算机与信息工程 系 计算机科学与技术 专业 学 号 0811050002 学生姓名 万小龙 指导教师 尤新华 起讫日期 2011. 10 ~ 2012. 4 工作地点 湖北大学知行学院 目 录 绪论 1 1 课题总体介绍 2 1.1 项目开发的目的 2 1.2 项目开发的意义 2 2 总体设计 3 2.1 应用需求分析 3 2.2 模块具体分析 4 2.2.1 服务器端模块分析 4 2.2.2 客户端模块分析 4 2.2.3 数据库模块分析 4 2.3 聊天室的具体实现 5 2.3.1 登录界面的实现 5 2.3.2注册界面的实现 5 2.3.3 聊天界面的实现 5 2.3.4服务器界面的实现 6 2.3.5 服务器验证登录的实现 6 2.3.6 聊天功能的实现 6 3 聊天室的详细设计 7 3.1 开发环境的配置 7 3.2 开发的过程 7 3.3 聊天室功能的测试 8 结 论 10 11参考文献 12致 谢 13附 录 基于JAVA的聊天室设计与实现 摘 要 随着网络的快速发展,网络俨然已经成为了我们了解世界和关注世界各地新动态的一个主要途径了。因此伴随着网络而必然产生的一些软件也越来越多,而能够实现即时通信的聊天软件也是随之诞生,且深受用户们喜爱。而MSN,ICQ,还有国内的QQ等大型聊天软件也成为了人们网络生活中的一部分。 本文中主要阐述的是java聊天室的设计过程,以及聊天功能的实现。前台采用的java语言采用C/S架构来设计聊天室,而后台则采用SQL Server2005 创建的数据库和 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 格来管理用户的信息。然后利用这2种工具的结合来完成聊天室的设计。 【关键词】网络 聊天室 即时通信 JAVA Chat room Design with realization based on JAVA Abstract With the rapid development of network, the network has become in a major way for us to understand the world . So with the network and inevitable has some software is also more and more, and can realize instant communication chat software is also comes and loved by uses. So MSN, ICQ, QQ and other large chat software has become a part of the people’s life for network. This article mainly elaborated in the chat room of the design process is Java, and the realization of the function of chat. The front desk of the Java language using C/S architecture to design a chat room, and the back desk, using the database and SQL Server2005 create form to manage customer information. Finally, using the combination of these two tools to complete the design of the chat room. 【Key words】network Chat room Instant communication JAVA 绪论 随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。 本系统利用Java实现基于C/S模式的聊天程序。聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登录到服务端才可以实现正常的聊天功能。服务器端的主要实现在特定端口上进行侦听,等待客户端连接;用户可以配置服务端的侦听端口,默认端口为9999;向已经连接到服务端的用户发送系统消息。客户端的主要功能为:连接到已经开启服务的服务端;用户可以配置要连接的端口号;用户可以配置连接后显示的用户的账号;当服务器端开启的话,用户可以随时登录,用户可以向所有人或某一个人发送消息。从而客户与客户之间以及客户与服务器之间可以简单方便地进行通信。 主要使用Sun公司提供Java语言、jdk开发环境及套接字通信socket技术,并利用MyEclipse来进行开发,来是实现对服务器端和客户端之间相互交流的功能。 1 课题总体介绍 1.1 项目开发的目的 本课题的研究主要目的是可以加深我们对java编程思想的理解,让我们养成一个良好的项目开发的编程习惯,同时也是对我们所学的java编程的一个综合提高。而对聊天室的开发也可以更好的理解C/S架构开发的原理,能够更加熟练的使用多线程、异常处理、Socket编程、输入输出流的使用。 1.2 项目开发的意义 根据当前网络的需求,网络聊天越来越受各种网民所青睐。因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。而本人也学习过JAVA语言,对网络编程也较有兴趣,为了更好的考验自己对JAVA语言的掌握程度,本人就决定以《Java聊天室》为毕业设计,希望通过这一次能进一步提高本人的网络开发编程的能力。 2 总体设计 2.1 应用需求分析 利用Java实现基于C/S模式的聊天程序,聊天系统不外乎两个方面,服务器端和客户端。服务器端程序主要负责侦听客户端发来的消息,客户端需登录到服务端才可以实现正常的聊天功能。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看一下服务器端的任务: 服务器端的主要功能如下: (1)在特定端口上进行侦听,等待客户端连接。 (2)用户可以配置服务端的侦听端口,默认端口为9999。 (3)向已经连接到服务端的用户发送系统消息。 (4)可以启动和关闭服务器。 以上就是服务器端最主要任务。不难看出,服务器端的任务并不复杂。 客户端的主要功能如下: (1)连接到已经开启服务的服务端。 (2)用户可以注册账号。 (3)用户可以通过注册好的账号登陆聊天室。 (4)用户可以向所有人或某一个人发送消息。 相对服务器而言,客户端的任务也不很复杂,有了以上的简单分析,可以知道,解决上述问题,即完成了该聊天系统的核心。 聊天室设计好了,同时还需要数据库的支持,数据库的功能就是对用户注册的账号和密码进行管理,当用户登录时可以进行验证。 2.2 模块具体分析 模块分析示意图如图2.1所示: 图2.1 模块分析 2.2.1 服务器端模块分析 服务器与客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8888,然后无限循环调用accept()方法接受客户程序的连接。 2.2.2 客户端模块分析 客户通过Socket(InetAddress,port)建立与服务器的连接。服务器与客户都通过构造对象流来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息,服务器收到来自客户的请求后,针对不同的消息处理请求。 2.2.3 数据库模块分析 数据库用于管理用户的信息,当用户在注册界面成功注册了账号,就存在数据库的用户表里面,当新用户注册时,将新账号与数据库中的账号比较来验证账号是否纯在,也可以验证账号密码是否正确。 2.3 聊天室的具体实现 2.3.1 登录界面的实现 登陆界面如图2.2所示: 图2.2 聊天室的登陆界面 该界面用到了3个Jlabel,分别是“聊天室登录器”、“账号”、“密码”。用到了1个JTextFilet,1个JpasswordField,和2个Jbuttton(登录和注册)。然后用网格包布局来管理这些控件。当填写了正确的账号和密码后点击登录按钮可以进入聊天界面,错误则提示“用户名或密码错误”:点击注册按钮则可以进入注册账号的界面。 2.3.2注册界面的实现 注册界面的实现如图2.3所示: 图2.3 注册界面 该界面主要用的了4个Jlabel分别是4个填写文字的部分,然后一个JtextField和2个JpasswordField,用来填写要注册的账号和密码。这些控件被放入第一个Jpanel中,然后放于Jframe的居中部分。然后2个按钮放在了第二个jpanel中,放于jframe的南边。 2.3.3 聊天界面的实现 聊天界面的实现如图2.4所示: 图2.4 聊天界面 该界面的控件很少,用一个JtextArea来显示用户们的聊天内容,该空间放在了居中部分。然后是在南边有一个JtextField用来填写用户想说的话,然后点击唯一的Jbutton(发送),就可以发送自己说的话了。 2.3.4服务器界面的实现 服务器界面的实现如图2.5所示: 图2.5 服务器界面 该界面只用到了2个Jbutton,用来启动和关闭服务器。 2.3.5 服务器验证登录的实现 当用户点击了登录界面的登录按钮之后,用户填写的账号和密码会发送到服务器进行验证,如果账号密码正确,则向客户端发送登录成功的信息;如果账号密码不正确,则向客户端发送信息并以客户端为父窗口弹出子窗口提示说:“账号或密码错误!”。 2.3.6 聊天功能的实现 用户在聊天界面点击发送按钮后,消息发送到服务器,服务器的消息进行分析,如果是私聊,分析出发送这和接收者后,将消息转发给接收者。如果是发送给所有人,就遍历管理服务器连接所有人线程的hashmap,得到连接所有人的线程,将消息发送给所有人,而客户端则遍历管理所有人的聊天界面的hashmap,得到所有人的聊天界面,将消息发送到所有人的界面上。 3 聊天室的详细设计 3.1 开发环境的配置 JDK(Java Development kit)是 SUN公司提供的一套Java开发环境,通常称之为它主要包括了一些常用的JDK工具、执行时需要的函数库、与C连接时所需的文件及一些Java应用程序范例等。 JDK可以从SUN公司的网站http://java.sun.com或国内一些常用的资料下载网站免费下载而得。下载完毕便可安装JDK。 在安装完JDK之后,必须配置环境变量classpath和path,JDK才能够正常运行。 ①.在环境变量中新建名为classpath的环境变量(如已经存在则只要修改),值为:E:\Program Files\Java\jdk1.6.0_10\lib ②.classpath指明Java虚拟机要装载类的路径,“.” 表示当前目录 ③.在环境变量中新建名为path的环境变量(如已经存在则只要修改),值为:E:\Program Files\Java\jdk1.6.0_10\jre\bin ④.path指明了操作系统查找JDK工具如javac、java等文件的路径 Sun公司为程序开发者提供了编译、测试、执行程序等一套完备的工具体系,它们被集中存放在主目录的bin目录下。 3.2 开发的过程 开发的过程不是盲目的,要有清晰的思路。分好工作区,建好要用到的包,如:界面就写在名为view的包里面,后台运行的类就写在model包里面等。 类视图1如图3.1所示: 图3.1 类视图1 这是服务器端的开发,model层中的类是在后台运行的程序,view层中的类是服务器界面,启动服务器其实是调用的Server类,这个类才是真正的服务器。而SerConClientThread类是服务器连接客户端的线程类,它的作用是接收客户端发来的消息并且转发出去。ManageClientThread类是管理服务器连接客户端线程的类,这个类用HashMap将服务器连接客户端的所有线程管理了起来,方便调用。 同样在客户端的开发也是有良好的分层结构,如图3.2所示: 图3.2 类视图2 其中view层是3个界面类,Chat是聊天界面类,ClientLogin是登陆界面类,Register是登陆界面类。在这里我给大家介绍一下这些类得功能,在model层中的ClientConServer类是客户端第一次连接服务器要调用的类,也就是登陆时要调用的类,将登陆的信息发给服务器验证,同时创建一个连接服务器的线程。而ClientUser类是客户端用户类,当用户点击登录是会调用这个类,然后由这个类调用ClientConServer类。 在tools层中,这里和之前服务器端的model基本上是一个原理,服务器端管理了服务器连接客户端的线程,这里也是用ManageClientConServerThread类来管理客户端连接服务器端的线程的类ClientConServerThread。这里的客户端连接服务器的线程类ClientConServerThread是用来读取从服务器发来的消息,并显示数来的。ManageChat则是将所有用户的聊天界面放在一个hashmap里管理起来,当遍历这个hashmap时,就可以将消息显示在所有用户的聊天界面了。然后可以看见在服务器端和客户端都有一个common包,这个是公共包,里面放的是一些javaBean,里面有一些无参数的构造器。它的存在使得客户端与服务器端的信息交互成为了可能。其中Message类里是发送信息时用到的构造器,MessageType类里面是服务器验证登录后返回的信息,User类里面则是用户账号和密码的构造器。 而完成上面的所有类中的代码,也是有一定的开发顺序的,首先是完成4个界面的开发。 然后是实现各个界面上的控件的功能和客户端与服务器的链接功能,先完成服务器,设置端口号,完成启动服务器的功能;接着就是客户端连接服务器的功能,再完成服务器对消息的验证和对线程的创建和管理。 最后就是客户端对消息的发送和接收以及服务器端对消息的接收验证和转发。 3.3 聊天室功能的测试 (1)工作过程 首先启动服务器,如果启动成功,会再控制台打印出“在9999端口监听”,然后再运行用户登录的类点击注册账号,账号注册成功后再回到登录界面进行登录,点击登录按钮就可以进入聊天室了。 (2)测试方法 根据工作过程,来启动程序,如果在启动某一程序时出现了错误,先查看错误信息,然后再启动的程序的类里面寻找问题,并多使用System.out.printl方法来打印一些提示的话语,方便自己知道程序运行到了哪一步,是从哪里开始程序没再运行了,通过这样的测试方法就可以慢慢的找到错误的根源,从而不断完善聊天室的功能。 (3)聊天功能的测试 在测试聊天的功能时,主要是站在用户的角度,看看聊天的功能是否真的实现,因此,当程序全部都成功启动后,就可以注册几个账号,同时登陆2到3个进入聊天室,让他们相互聊天,在私聊和群聊里面都发送一些消息,看看是否达到了预期的效果。 结 论 (一)毕业设计的 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 和展望 本聊天室实现了简单的实时聊天功能,经过细心的调试和排错解决了绝大部分的问题。但几乎每一个计算机程序都会有这样那样的不足,尤其是未经过精心维护的非商业软件。即使是作为操作系统的各种版本的Windows也时常会发生许多类型的错误和漏洞。本聊天系统程序对于初涉此领域的毕业设计课题来说,尤其在开始初期,感觉逻辑复杂,难以控制,因此至今还有许多未能解决的缺陷。 目前本聊天系统还有待完善的功能列表如下: (1)因为设想中是在显示聊天信息的地方点击说话人的账号就可以直接与其私聊,但是也实现不了这个功能,所以私聊功能也暂时搁浅,只完成了群聊的功能。 (2)聊天系统缺乏各种屏蔽发言、发送表情、踢人等功能; (3)因为电脑无法连接数据源,导致数据库不能被程序使用,所以注册功能最终也没有实现。 (4)也没有详细考虑到服务器端对的聊天室管理功能。 尽管毕业设计到现在已接近尾声,但是对于上述的缺陷,本人还会不断对聊天系统进一步的完善它,期望在今后的日子里凭借自身的技术把系统做成一套深受欢迎的聊天系统。 (二)经验和感想 (1)通过这次毕业设计获得的宝贵经验 经验一:通过本次课题,我对C/S架构的设计流程有了一个更深刻的认识,清晰的感觉到了服务器端与客户端之间的交互过程, 经验二:这次的课题让我对以前掌握的不太好的Socket编程,输入输出流的使用和多线程的使用有了更好的了解。 经验三:这次的课题让我掌握了一些以前不知道的知识,比如hashmap是不能直接遍历的,需要用到迭代器Iterator来实现。 经验四:通过这次的课题,我对以前搁置很久的数据库知识又进行了一遍新的回顾,虽然大多只是回顾了添删改查和几个约束的知识。 (2)完成毕业设计的感想 Java聊天室作为毕业设计,是本人目前做过的最大的程序。虽然大学期间在设计过一个简单的ASP聊天室设计,并且经过反复的调试修改也达到了一定的精确性,但接手这个题目时仍感觉十分棘手,但最终还是坚持完成了这个任务。 平时自己也常到其它聊天室进行聊天,因此,自己也曾想过以后学会了电脑就一定亲自设计一款聊天系统,如今,总算实现了自己的梦想。 在学习期间,本人还通过网上的各种JAVA源码进行学习与研究,我原以为这样的设计水平将无法完成毕业设计,但当掌握了大部分应用技巧时,剩下的聊天系统思路的设计就显得不是最大的障碍了。 我在三个月内写完这个程序,经过了很多次的调试,终于完成了现在的程序。原先认为不可能的事,我发现,如果有不畏困难的信心和肯钻研的勇气,就一定会完成,甚至达到意想不到的效果。 参考文献 [1] 王养廷.JAVA.SE应用程序设计[M] .机械工业出版社,2007. 1~3 [2] 张利国.JAVA软件开发大师[M].科学出版社,2008.3~4 [3] 李刚.疯狂JAVA[M].人民邮电出版社,2010.4~6 [4] 孙卫琴.JAVA面向对象编程[M].电子工业出版社,2006.4~6 [5] Katthy Sierra.深入浅出JAVA程序设计[M].机械工业出版社,2006.4~6 [6] Bruce Eckel. Think in java 4[M]. 机械工业出版社,2008.5~8 [7] 沃尔斯. Spring in action[M].人民邮电出版社,2005.5~7 [8] 杨继平. SQL Server2000自学教程[M].清华大学出版社,2000.7~35 [9] 陈曼红. 数据库系统原理与自学应用技术[M].机械工业出版社,2010.28~33 [10] 王强. SQL Server数据库原理及应用[M]. 清华大学出版社,2003.28~33 致 谢 紧张而忙碌的毕业设计就要结束了,在完成了系统的功能设计后,我感到由衷的喜悦和自豪。在我做毕业设计期间,许多老师,同学和朋友给我我无私的关怀和帮助,尤其是我的导师尤新华老师。在此,我要向他们表示衷心的感谢。 首先,我要感谢学校的老师在毕业设计期间给了我悉心的关怀与帮助,并且给了我许多关键的,建设性的指导。 这次的毕业设计让我受益匪浅。可以这样说,用计算机来解决繁重而低效的手工管理工作,计算机发展史上的必然。在理论课的学习中,我掌握了基础课和专业课的理论知识,也曾经做过一些小的程序设计,但真正动手设计一个这种聊天类的软件,还是第一次。在这次的毕业设计中,我曾遇到了许多困难,而在克服这些困难的过程中,我的各方面的能力又有了很大的提高,使我的理论知识更好的与实践相结合,增强了专业技能的可实践性。从调研,需求分析到查找资料,结构设计,详细设计以及调试程序。我终于设计出了一个比较完整的,周密的,可使用的聊天系统。通过这次的毕业设计,我真正了解了软件工程设计的整个过程,既巩固了以前的理论知识,也为我以后的工作奠定了良好的基础。 当然,由于时间的短促,我所完成的系统并不是尽善尽美的,还有待进一步的修改和完善。最后,请允许我再一次向毕业期间无私帮助过我的老师,同学和朋友表示最衷心的感谢。 附录 (1)登录界面源代码: package com.client.view; import javax.swing.*; import com.client.model.ClientUser; import com.client.tools.ManageChat; import com.client.common.*; import java.awt.*; import java.awt.event.*; public class ClientLogin extends JFrame implements ActionListener { //定义上面的组件 JLabel jbl1; JPanel jpl1; JLabel jbl2,jbl3; JTextField jtf; JPasswordField jpf; //定义下面的组件 JPanel jpl2; JButton jb1,jb2; public static void main(String[] args) { // TODO Auto-generated method stub ClientLogin cl=new ClientLogin(); } public ClientLogin() { jpl1=new JPanel(); jpl2=new JPanel(); jbl1=new JLabel("聊天室登陆器",JLabel.CENTER); jbl2=new JLabel("账号",JLabel.CENTER); jbl3=new JLabel("密码",JLabel.CENTER); jtf=new JTextField(); jpf=new JPasswordField(); jb1=new JButton("登录"); jb1.addActionListener(this); jb2=new JButton("注册"); jb2.addActionListener(this); GridBagLayout gbl=new GridBagLayout(); GridBagConstraints gc1=new GridBagConstraints();//创建约束对象 jpl1.setLayout(gbl); gc1.fill=GridBagConstraints.BOTH;//设置fill约束,当控件的大小小于单元格时,填充单元格 gc1.weightx=0; gc1.weighty=1; gc1.insets=new Insets(10,10,10,10); gc1.gridwidth=GridBagConstraints.REMAINDER;//下一个组件将是这行的最后一个组件 gbl.setConstraints(jbl1, gc1);//第一行填完,共一个组件 GridBagConstraints gc2=new GridBagConstraints(); gc2.fill=GridBagConstraints.BOTH; gc2.weightx=1; gc2.weighty=1; gbl.setConstraints(jbl2, gc2); gc2.weightx=3; gc2.weighty=1; gc2.insets=new Insets(0,0,0,10); gc2.gridwidth=GridBagConstraints.REMAINDER; gbl.setConstraints(jtf, gc2); GridBagConstraints gc3=new GridBagConstraints(); gc3.fill=GridBagConstraints.BOTH; gc3.weightx=1; gc3.weighty=1; gbl.setConstraints(jbl3, gc3); gc3.weightx=3; gc3.weighty=1; gc3.insets=new Insets(0,0,10,10); gc3.gridwidth=GridBagConstraints.REMAINDER; gbl.setConstraints(jpf, gc3); jpl1.add(jbl1); jpl1.add(jbl2); jpl1.add(jtf); jpl1.add(jbl3); jpl1.add(jpf); jpl2.add(jb1); jpl2.add(jb2); this.add(jpl1,"Center"); this.add(jpl2,"South"); this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==jb1) { ClientUser clientUser=new ClientUser(); User u=new User(); u.setUserId(jtf.getText().trim()); u.setPasswd(new String(jpf.getPassword())); if(clientUser.checkUser(u)) { Chat chat=new Chat(u.getUserId()); //把聊天界面加入到管理类 ManageChat.addChat(u.getUserId(),chat); this.dispose(); } else { JOptionPane.showMessageDialog(this,"用户名密码错误"); } } else if(e.getSource()==jb2) { new Register(); this.dispose(); } } } (2)注册界面的源代码: package com.client.view; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.sql.*; public class Register extends JFrame implements ActionListener { JPanel jpl1,jpl2; JLabel jbl1,jbl2,jbl3,jbl4; JTextField jtf; JPasswordField jpf1,jpf2; JButton jb1,jb2; public static void main(String[] args) { // TODO Auto-generated method stub Register rgt=new Register(); } public Register() { jpl1=new JPanel(); jpl2=new JPanel(); jbl1=new JLabel("注册聊天账号",JLabel.CENTER); jbl2=new JLabel("输入账号",JLabel.CENTER); jbl3=new JLabel("输入密码",JLabel.CENTER); jbl4=new JLabel("确认密码",JLabel.CENTER); jtf=new JTextField(); jpf1=new JPasswordField(); jpf2=new JPasswordField(); jb1=new JButton("确定"); jb1.addActionListener(this); jb2=new JButton("取消"); jb2.addActionListener(this); GridBagLayout gbl=new GridBagLayout(); GridBagConstraints gc1=new GridBagConstraints();//创建约束对象 jpl1.setLayout(gbl); gc1.fill=GridBagConstraints.BOTH;//设置fill约束,当控件的大小小于单元格时,填充单元格 gc1.weightx=0; gc1.weighty=1; gc1.insets=new Insets(10,10,10,10); gc1.gridwidth=GridBagConstraints.REMAINDER;//下一个组件将是这行的最后一个组件 gbl.setConstraints(jbl1, gc1);//第一行填完,共一个组件 GridBagConstraints gc2=new GridBagConstraints(); gc2.fill=GridBagConstraints.BOTH; gc2.weightx=1; gc2.weighty=1; gbl.setConstraints(jbl2, gc2); gc2.weightx=3; gc2.weighty=1; gc2.insets=new Insets(0,0,10,10); gc2.gridwidth=GridBagConstraints.REMAINDER; gbl.setConstraints(jtf, gc2); GridBagConstraints gc3=new GridBagConstraints(); gc3.fill=GridBagConstraints.BOTH; gc3.weightx=1; gc3.weighty=1; gbl.setConstraints(jbl3, gc3); gc3.weightx=3; gc3.weighty=1; gc3.insets=new Insets(0,0,10,10); gc3.gridwidth=GridBagConstraints.REMAINDER; gbl.setConstraints(jpf1, gc3); GridBagConstraints gc4=new GridBagConstraints(); gc4.fill=GridBagConstraints.BOTH; gc4.weightx=1; gc4.weighty=1; gbl.setConstraints(jbl4, gc4); gc4.weightx=3; gc4.weighty=1; gc4.insets=new Insets(0,0,10,10); gc4.gridwidth=GridBagConstraints.REMAINDER; gbl.setConstraints(jpf2, gc4); jpl1.add(jbl1); jpl1.add(jbl2); jpl1.add(jtf); jpl1.add(jbl3); jpl1.add(jpf1); jpl1.add(jbl4); jpl1.add(jpf2); jpl2.add(jb1); jpl2.add(jb2); this.add(jpl1,"Center"); this.add(jpl2,"South"); this.setSize(300,260); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Connection ct = null; Statement sm=null; if(e.getSource()==jb1) { try { //加载驱动 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //得到连接数据源 try { ct=DriverManager.getConnection("jdbc:odbc:mychat"); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { sm=ct.createStatement(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { ResultSet rs=sm.executeQuery("select * from chat1"); while(rs.next()) { String userId=rs.getString(1); String passwd=rs.getString(2); if(userId.equals(this.jtf.getText())) { JOptionPane.showMessageDialog(this,"用户名已存在,请重新注册!"); }else if((this.jpf1.getText()).equals(this.jpf2.getText())) { JOptionPane.showMessageDialog(this,"密码不一致,请重新注册!"); }else { //把填写的内容写入数据库 } } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }finally{ //关闭 try { sm.close(); ct.close(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }else if(e.getSource()==jb2) { this.dispose(); } } } (3)聊天界面的源代码: package com.client.view; import javax.swing.*; import com.client.tools.*; import com.client.common.*; import com.client.model.*; import java.util.*; import java.awt.*; import java.awt.event.*; import java.io.*; public class Chat extends JFrame implements ActionListener { public static void main(String[] args) { //Chat chat=new Chat(); } JTextArea jta; JTextField jtf; JButton jb; JPanel jpl; String ownerId; public Chat(String ownerId) { this.ownerId=ownerId; jta=new JTextArea(); jtf=new JTextField(15); jb=new JButton("发送"); jb.addActionListener(this); jpl=new JPanel(); jpl.add(jtf); jpl.add(jb); this.add(jta,"Center"); this.add(jpl,"South"); this.setTitle(ownerId); this.setSize(500, 400); this.setVisible(true); } //写一个方法,让它显示消息 public void showMessage(Message m) { String info=m.getSender()+" 说:"+m.getCon()+"\r\n"; this.jta.append(info); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==jb) { //如果用户点击了发送按钮 Message m=new Message(); m.setCon(jtf.getText()); m.setSendTime(new Date().toString()); m.setSender(this.ownerId); //发送信息到服务器 try{ ObjectOutputStream oos=new ObjectOutputStream(ManageClientConServerThread.getClientConServerThread(ownerId).getS().getOutputStream()); oos.writeObject(m); }catch(Exception ex){ ex.printStackTrace(); } } } (4)服务器界面的源代码: package com.server.view; import javax.swing.*; import com.server.model.Server; import java.awt.*; import java.awt.event.*; public class ServerFrame extends JFrame implements ActionListener{ JPanel jpl; JButton jb1,jb2; public static void main(String[] args) { ServerFrame sf=new ServerFrame(); } public ServerFrame() { jpl=new JPanel(); jb1=new JButton("启动服务器"); jb1.addActionListener(this); jb2=new JButton("关闭服务器"); jb2.addActionListener(this); jpl.add(jb1); jpl.add(jb2); this.add(jpl); this.setSize(500,400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==jb1) { new Server(); }else if(e.getSource()==jb2){ this.dispose(); } } (5)Server类得源代码: package com.server.model; import java.net.*; import java.io.*; import java.util.*; import com.client.common.*; public class Server { public Server() { try{ System.out.println("在9999监听"); ServerSocket ss=new ServerSocket(9999); while(true) { //阻塞,等待连接 Socket s=ss.accept(); ObjectInputStream ois=new ObjectInputStream(s.getInputStream()); User u=(User)ois.readObject(); System.out.println("服务器接收到用户id:"+u.getUserId()+" 密码:"+u.getPasswd()); Message m=new Message(); ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream()); if(u.getPasswd().equals("123456")) { //返回一个成功登陆的信息报 m.setMesType("1"); oos.writeObject(m); //单开一个线程与客户端保持通信 SerConClientThread scct=new SerConClientThread(s); ManageClientThread.addClientThread(u.getUserId(), scct); //启动与该客户端保持通信的线程 scct.start(); }else{ m.setMesType("2"); oos.writeObject(m); //关闭Socket s.close(); } } }catch (Exception e) { e.printStackTrace(); // TODO: handle exception }finally{ } } } (6)SerConClientThread类的源代码: /* * 工能:服务器与某个客户端的通信线程 */ package com.server.model; import java.io.*; import java.net.*; import java.util.*; //import javax.swing.text.html.HTMLDocument.Iterator; import com.client.common.*; import com.client.common.*; public class SerConClientThread extends Thread { Socket s; public SerConClientThread(Socket s) { //把服务器与该客户端的连接赋给s; this.s=s; } public void run() { while(true) { System.out.println("==============="); //该线程接受客户端的信息 try{ ObjectInputStream ois=new ObjectInputStream(s.getInputStream()); Message m=(Message)ois.readObject(); //Thread tSend; for(Iterator iter=(Iterator)ManageClientThread.hm.keySet().iterator();((java.util.Iterator) iter).hasNext();) { //遍历管理服务器连接客户端的线程的hashmap,获得这些线程,并把消息发送出去 Object key=iter.next(); SerConClientThread scct=(SerConClientThread)ManageClientThread.hm.get(key); ObjectOutputStream oos=new ObjectOutputStream(scct.s.getOutputStream()); oos.writeObject(m); } }catch(Exception e){ e.printStackTrace(); } } } } (7)ManageClientThread类的源代码: package com.server.model; import java.util.*; public class ManageClientThread { public static HashMap hm=new HashMap
本文档为【毕业论文JAVA聊天室的设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_035538
暂无简介~
格式:doc
大小:250KB
软件:Word
页数:34
分类:工学
上传时间:2012-04-28
浏览量:105