毕业论文JAVA聊天室的设计

时间:2024.5.15

湖北大学知行学院 本科毕业论文(设计)

题 目 基于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 I

基于JAVA的聊天室设计与实现

摘 要

随着网络的快速发展,网络俨然已经成为了我们了解世界和关注世界各地新动态的一个主要途径了。因此伴随着网络而必然产生的一些软件也越来越多,而能够实现即时通信的聊天软件也是随之诞生,且深受用户们喜爱。而MSN,ICQ,还有国内的QQ等大型聊天软件也成为了人们网络生活中的一部分。

本文中主要阐述的是java聊天室的设计过程,以及聊天功能的实现。前台采用的java语言采用C/S架构来设计聊天室,而后台则采用SQL Server2005 创建的数据库和表格来管理用户的信息。然后利用这2种工具的结合来完成聊天室的设计。

【关键词】网络 聊天室 即时通信 JAVA

II

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

III

湖北大学知行学院本科毕业论文(设计)

绪论

随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。

本系统利用Java实现基于C/S模式的聊天程序。聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登录到服务端才可以实现正常的聊天功能。服务器端的主要实现在特定端口上进行侦听,等待客户端连接;用户可以配置服务端的侦听端口,默认端口为9999;向已经连接到服务端的用户发送系统消息。客户端的主要功能为:连接到已经开启服务的服务端;用户可以配置要连接的端口号;用户可以配置连接后显示的用户的账号;当服务器端开启的话,用户可以随时登录,用户可以向所有人或某一个人发送消息。从而客户与客户之间以及客户与服务器之间可以简单方便地进行通信。

主要使用Sun公司提供Java语言、jdk开发环境及套接字通信socket技术,并利用MyEclipse来进行开发,来是实现对服务器端和客户端之间相互交流的功能。

1

湖北大学知行学院本科毕业论文(设计)

1 课题总体介绍

1.1 项目开发的目的

本课题的研究主要目的是可以加深我们对java编程思想的理解,让我们养成一个良好的项目开发的编程习惯,同时也是对我们所学的java编程的一个综合提高。而对聊天室的开发也可以更好的理解C/S架构开发的原理,能够更加熟练的使用多线程、异常处理、Socket编程、输入输出流的使用。

1.2 项目开发的意义

根据当前网络的需求,网络聊天越来越受各种网民所青睐。因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。而本人也学习过JAVA语言,对网络编程也较有兴趣,为了更好的考验自己对JAVA语言的掌握程度,本人就决定以《Java聊天室》为毕业设计,希望通过这一次能进一步提高本人的网络开发编程的能力。

2

湖北大学知行学院本科毕业论文(设计)

2 总体设计

2.1 应用需求分析

利用Java实现基于C/S模式的聊天程序,聊天系统不外乎两个方面,服务器端和客户端。服务器端程序主要负责侦听客户端发来的消息,客户端需登录到服务端才可以实现正常的聊天功能。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看一下服务器端的任务:

服务器端的主要功能如下:

(1)在特定端口上进行侦听,等待客户端连接。

(2)用户可以配置服务端的侦听端口,默认端口为9999。

(3)向已经连接到服务端的用户发送系统消息。

(4)可以启动和关闭服务器。

以上就是服务器端最主要任务。不难看出,服务器端的任务并不复杂。

客户端的主要功能如下:

(1)连接到已经开启服务的服务端。

(2)用户可以注册账号。

(3)用户可以通过注册好的账号登陆聊天室。

(4)用户可以向所有人或某一个人发送消息。

相对服务器而言,客户端的任务也不很复杂,有了以上的简单分析,可以知道,解决上述问题,即完成了该聊天系统的核心。

聊天室设计好了,同时还需要数据库的支持,数据库的功能就是对用户注册的账号和密码进行管理,当用户登录时可以进行验证。

3

湖北大学知行学院本科毕业论文(设计)

2.2 模块具体分析

模块分析示意图如图2.1所示:

毕业论文JAVA聊天室的设计

图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 数据库模块分析

数据库用于管理用户的信息,当用户在注册界面成功注册了账号,就存在数据库的用户表里面,当新用户注册时,将新账号与数据库中的账号比较来验证账号是否纯在,也可以验证账号密码是否正确。

4

湖北大学知行学院本科毕业论文(设计)

2.3 聊天室的具体实现

2.3.1 登录界面的实现

登陆界面如图2.2所示:

毕业论文JAVA聊天室的设计

图2.2 聊天室的登陆界面

该界面用到了3个Jlabel,分别是“聊天室登录器”、“账号”、“密码”。用到了1个JTextFilet,1个JpasswordField,和2个Jbuttton(登录和注册)。然后用网格包布局来管理这些控件。当填写了正确的账号和密码后点击登录按钮可以进入聊天界面,错误则提示“用户名或密码错误”:点击注册按钮则可以进入注册账号的界面。

2.3.2注册界面的实现

注册界面的实现如图2.3所示:

毕业论文JAVA聊天室的设计

图2.3 注册界面

该界面主要用的了4个Jlabel分别是4个填写文字的部分,然后一个JtextField和2个JpasswordField,用来填写要注册的账号和密码。这些控件被放入第一个Jpanel中,然后放于Jframe的居中部分。然后2个按钮放在了第二个jpanel中,放于jframe的南边。

2.3.3 聊天界面的实现

聊天界面的实现如图2.4所示:

毕业论文JAVA聊天室的设计

图2.4 聊天界面

5

湖北大学知行学院本科毕业论文(设计)

该界面的控件很少,用一个JtextArea来显示用户们的聊天内容,该空间放在了居中部分。然后是在南边有一个JtextField用来填写用户想说的话,然后点击唯一的Jbutton(发送),就可以发送自己说的话了。

2.3.4服务器界面的实现

服务器界面的实现如图2.5所示:

毕业论文JAVA聊天室的设计

图2.5 服务器界面

该界面只用到了2个Jbutton,用来启动和关闭服务器。

2.3.5 服务器验证登录的实现

当用户点击了登录界面的登录按钮之后,用户填写的账号和密码会发送到服务器进行验证,如果账号密码正确,则向客户端发送登录成功的信息;如果账号密码不正确,则向客户端发送信息并以客户端为父窗口弹出子窗口提示说:“账号或密码错误!”。

2.3.6 聊天功能的实现

用户在聊天界面点击发送按钮后,消息发送到服务器,服务器的消息进行分析,如果是私聊,分析出发送这和接收者后,将消息转发给接收者。如果是发送给所有人,就遍历管理服务器连接所有人线程的hashmap,得到连接所有人的线程,将消息发送给所有人,而客户端则遍历管理所有人的聊天界面的hashmap,得到所有人的聊天界面,将消息发送到所有人的界面上。

6

湖北大学知行学院本科毕业论文(设计)

3 聊天室的详细设计

3.1 开发环境的配置

JDK(Java Development kit)是 SUN公司提供的一套Java开发环境,通常称之为它主要包括了一些常用的JDK工具、执行时需要的函数库、与C连接时所需的文件及一些Java应用程序范例等。

JDK可以从SUN公司的网站或国内一些常用的资料下载网站免费下载而得。下载完毕便可安装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所示:

毕业论文JAVA聊天室的设计

图3.1 类视图1

这是服务器端的开发,model层中的类是在后台运行的程序,view层中的类是服务器界面,启动服务器其实是调用的Server类,这个类才是真正的服务器。而SerConClientThread类是服务器连接客户端的线程类,它的作用是接收客户端发来的消息并且转发出去。ManageClientThread类是管理服务器连接客户端线程的类,这个类用HashMap将服务器连接客户端的所有线程管理了起来,方便调用。

同样在客户端的开发也是有良好的分层结构,如图3.2所示:

7

湖北大学知行学院本科毕业论文(设计)

毕业论文JAVA聊天室的设计

图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)聊天功能的测试

在测试聊天的功能时,主要是站在用户的角度,看看聊天的功能是否真的实现,因此,当程序

8

湖北大学知行学院本科毕业论文(设计)

全部都成功启动后,就可以注册几个账号,同时登陆2到3个进入聊天室,让他们相互聊天,在私聊和群聊里面都发送一些消息,看看是否达到了预期的效果。

9

湖北大学知行学院本科毕业论文(设计)

结 论

(一)毕业设计的总结和展望

本聊天室实现了简单的实时聊天功能,经过细心的调试和排错解决了绝大部分的问题。但几乎每一个计算机程序都会有这样那样的不足,尤其是未经过精心维护的非商业软件。即使是作为操作系统的各种版本的Windows也时常会发生许多类型的错误和漏洞。本聊天系统程序对于初涉此领域的毕业设计课题来说,尤其在开始初期,感觉逻辑复杂,难以控制,因此至今还有许多未能解决的缺陷。

目前本聊天系统还有待完善的功能列表如下:

(1)因为设想中是在显示聊天信息的地方点击说话人的账号就可以直接与其私聊,但是也实现不了这个功能,所以私聊功能也暂时搁浅,只完成了群聊的功能。

(2)聊天系统缺乏各种屏蔽发言、发送表情、踢人等功能;

(3)因为电脑无法连接数据源,导致数据库不能被程序使用,所以注册功能最终也没有实现。

(4)也没有详细考虑到服务器端对的聊天室管理功能。

尽管毕业设计到现在已接近尾声,但是对于上述的缺陷,本人还会不断对聊天系统进一步的完善它,期望在今后的日子里凭借自身的技术把系统做成一套深受欢迎的聊天系统。

(二)经验和感想

(1)通过这次毕业设计获得的宝贵经验

经验一:通过本次课题,我对C/S架构的设计流程有了一个更深刻的认识,清晰的感觉到了服务器端与客户端之间的交互过程,

经验二:这次的课题让我对以前掌握的不太好的Socket编程,输入输出流的使用和多线程的使用有了更好的了解。

经验三:这次的课题让我掌握了一些以前不知道的知识,比如hashmap是不能直接遍历的,需要用到迭代器Iterator来实现。

经验四:通过这次的课题,我对以前搁置很久的数据库知识又进行了一遍新的回顾,虽然大多只是回顾了添删改查和几个约束的知识。

(2)完成毕业设计的感想

Java聊天室作为毕业设计,是本人目前做过的最大的程序。虽然大学期间在设计过一个简单的ASP聊天室设计,并且经过反复的调试修改也达到了一定的精确性,但接手这个题目时仍感觉十分棘手,但最终还是坚持完成了这个任务。

平时自己也常到其它聊天室进行聊天,因此,自己也曾想过以后学会了电脑就一定亲自设计一款聊天系统,如今,总算实现了自己的梦想。

在学习期间,本人还通过网上的各种JAVA源码进行学习与研究,我原以为这样的设计水平将无法完成毕业设计,但当掌握了大部分应用技巧时,剩下的聊天系统思路的设计就显得不是最大的障碍了。

我在三个月内写完这个程序,经过了很多次的调试,终于完成了现在的程序。原先认为不可能的事,我发现,如果有不畏困难的信心和肯钻研的勇气,就一定会完成,甚至达到意想不到的效果。

10

湖北大学知行学院本科毕业论文(设计)

参考文献

[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

11

湖北大学知行学院本科毕业论文(设计)

致 谢

紧张而忙碌的毕业设计就要结束了,在完成了系统的功能设计后,我感到由衷的喜悦和自豪。在我做毕业设计期间,许多老师,同学和朋友给我我无私的关怀和帮助,尤其是我的导师尤新华老师。在此,我要向他们表示衷心的感谢。

首先,我要感谢学校的老师在毕业设计期间给了我悉心的关怀与帮助,并且给了我许多关键的,建设性的指导。

这次的毕业设计让我受益匪浅。可以这样说,用计算机来解决繁重而低效的手工管理工作,计算机发展史上的必然。在理论课的学习中,我掌握了基础课和专业课的理论知识,也曾经做过一些小的程序设计,但真正动手设计一个这种聊天类的软件,还是第一次。在这次的毕业设计中,我曾遇到了许多困难,而在克服这些困难的过程中,我的各方面的能力又有了很大的提高,使我的理论知识更好的与实践相结合,增强了专业技能的可实践性。从调研,需求分析到查找资料,结构设计,详细设计以及调试程序。我终于设计出了一个比较完整的,周密的,可使用的聊天系统。通过这次的毕业设计,我真正了解了软件工程设计的整个过程,既巩固了以前的理论知识,也为我以后的工作奠定了良好的基础。

当然,由于时间的短促,我所完成的系统并不是尽善尽美的,还有待进一步的修改和完善。最后,请允许我再一次向毕业期间无私帮助过我的老师,同学和朋友表示最衷心的感谢。

12

湖北大学知行学院本科毕业论文(设计)

附录

(1)登录界面源代码:

package com.client.view;

import javax.swing.*;

import com.client.model.ClientUser;

import com.client.tools.ManageChat;

import mon.*;

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) { } 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);

13 // TODO Auto-generated method stub ClientLogin cl=new ClientLogin();

湖北大学知行学院本科毕业论文(设计)

GridBagLayout gbl=new GridBagLayout(); GridBagConstraints gc1=new GridBagConstraints();//创建约束对象 jpl1.setLayout(gbl); gc1.fill=GridBagConstraints.BOTH;//设置fill约束,当控件的大小小于单元格时,填充单元格

gc1.weightx=0;

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);

14 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); 组件

湖北大学知行学院本科毕业论文(设计)

} } this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); @Override public void actionPerformed(ActionEvent e) { } // TODO Auto-generated method stub if(e.getSource()==jb1) { } else if(e.getSource()==jb2) { } new Register(); this.dispose(); ClientUser clientUser=new ClientUser(); User u=new User(); u.setUserId(jtf.getText().trim()); u.setPasswd(new String(jpf.getPassword())); if(clientUser.checkUser(u)) { } else { } JOptionPane.showMessageDialog(this,"用户名密码错误"); Chat chat=new Chat(u.getUserId()); //把聊天界面加入到管理类 ManageChat.addChat(u.getUserId(),chat); 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;

15

湖北大学知行学院本科毕业论文(设计)

JPasswordField jpf1,jpf2; JButton jb1,jb2; public static void main(String[] args) { } 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;

16 // TODO Auto-generated method stub Register rgt=new Register(); 填充单元格 组件

湖北大学知行学院本科毕业论文(设计)

} 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;

17

湖北大学知行学院本科毕业论文(设计)

Statement sm=null; if(e.getSource()==jb1) { try { //加载驱动 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //得到连接数据源 try { } try { } 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,"用户名已存在,请重sm=ct.createStatement(); // TODO Auto-generated catch block e1.printStackTrace(); } catch (SQLException e1) { ct=DriverManager.getConnection("jdbc:odbc:mychat"); // TODO Auto-generated catch block e1.printStackTrace(); } catch (SQLException e1) { 新注册!"); }else { JOptionPane.showMessageDialog(this,"密码不一致,请重新if((this.jpf1this.jpf2注册!"); }else {

//把填写的内容写入数据库

}

} // TODO Auto-generated catch block

18 } // TODO Auto-generated catch block e1.printStackTrace(); } catch (SQLException e1) { } catch (ClassNotFoundException e1) {

湖北大学知行学院本科毕业论文(设计)

}

{ } } e1.printStackTrace(); //关闭 try { } sm.close(); ct.close(); // TODO Auto-generated catch block e1.printStackTrace(); }finally{ } catch (SQLException e1) { }else if(e.getSource()==jb2) this.dispose(); }

(3)聊天界面的源代码:

package com.client.view;

import javax.swing.*;

import com.client.tools.*;

import mon.*;

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) { } JTextArea jta; JTextField jtf; JButton jb; JPanel jpl; String ownerId; public Chat(String ownerId) { this.ownerId=ownerId;

19 //Chat chat=new Chat();

湖北大学知行学院本科毕业论文(设计)

} 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) { } @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 String info=m.getSender()+" 说:"+m.getCon()+"\r\n"; this.jta.append(info);

ObjectOutputStream(ManageClientConServerThread.getClientConServerThread(ownerId).getS().getOutputStream());

} } } oos.writeObject(m); ex.printStackTrace(); }catch(Exception ex){

20

湖北大学知行学院本科毕业论文(设计)

(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) { } public ServerFrame() { } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==jb1) { 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); ServerFrame sf=new ServerFrame();

21

湖北大学知行学院本科毕业论文(设计)

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 mon.*;

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);

22 密

湖北大学知行学院本科毕业论文(设计)

} } } } } ManageClientThread.addClientThread(u.getUserId(), scct); //启动与该客户端保持通信的线程 scct.start(); m.setMesType("2"); oos.writeObject(m); //关闭Socket s.close(); }else{ }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 mon.*;

import mon.*;

public class SerConClientThread extends Thread {

Socket s; public SerConClientThread(Socket s) {

23

湖北大学知行学院本科毕业论文(设计)

} //把服务器与该客户端的连接赋给s; this.s=s; public void run() { while(true) { System.out.println("==============="); //该线程接受客户端的信息 try{ ObjectInputStream ois=new Message m=(Message)ois.readObject(); //Thread tSend; for(Iterator ObjectInputStream(s.getInputStream());

iter=(Iterator)ManageClientThread.hm.keySet().iterator();((java.util.Iterator) iter).hasNext();)

} { //遍历管理服务器连接客户端的线程的hashmap,获得这些线程,并把消息发送出去 Object key=iter.next(); } } } } e.printStackTrace(); SerConClientThread ObjectOutputStream oos=new oos.writeObject(m); scct=(SerConClientThread)ManageClientThread.hm.get(key); ObjectOutputStream(scct.s.getOutputStream()); }catch(Exception e){

(7)ManageClientThread类的源代码:

package com.server.model;

import java.util.*;

public class ManageClientThread {

public static HashMap hm=new HashMap<String,SerConClientThread>(); //想hm中添加一个客户端通讯线程 public static void addClientThread (String uid,SerConClientThread ct) { }

24 hm.put(uid, ct);

湖北大学知行学院本科毕业论文(设计)

} //得到客户端通信线程 public static SerConClientThread getClientThread(String uid) { } return (SerConClientThread)hm.get(uid);

(8)ClientConServer类的源代码:

package com.client.model;

import java.util.*;

import java.net.*;

import java.io.*;

import mon.*;

import com.client.tools.*;

public class ClientConServer {

public Socket s; //发送第一次请求 public boolean sendLoginInfoToServer(Object o) { boolean b=false; try { //System.out.println("kk"); s=new Socket("127.0.0.1",9999); ObjectOutputStream oos=new oos.writeObject(o); ObjectInputStream ois=new ObjectInputStream(s.getInputStream()); Message ms=(Message)ois.readObject(); //验证用户登录 if(ms.getMesType().equals("1")) { //登录成功就创建一个该用户与服务器连接通讯的线程 ClientConServerThread ccst=new ClientConServerThread(s); ccst.start(); ObjectOutputStream(s.getOutputStream());

ManageClientConServerThread.addClientConServerThread(((User)o).getUserId

(), ccst);

b=true; b=false;

25 }else{

湖北大学知行学院本科毕业论文(设计)

} } } } //关闭Scoket s.close(); } catch (Exception e) { e.printStackTrace(); // TODO: handle exception }finally{ return b;

(9)ClientUser类的源代码:

package com.client.model;

import mon.*;

public class ClientUser {

} public boolean checkUser(User u) { } return new ClientConServer().sendLoginInfoToServer (u);

(10)ClientConServerThread类的源代码:

package com.client.tools;

import java.io.*;

import java.net.*;

import java.util.Iterator;

import mon.*;

import com.client.view.Chat;

public class ClientConServerThread extends Thread {

26 private Socket s; public Socket getS() { } return s;

湖北大学知行学院本科毕业论文(设计)

public void setS(Socket s) { } //构造函数 public ClientConServerThread(Socket s) { } public void run() { while(true) { //不停的读取从服务器发来的消息 try{ ObjectInputStream ois=new Message m=(Message)ois.readObject(); for(Iterator this.s=s; this.s = s; ObjectInputStream(s.getInputStream());

iter=(Iterator)ManageChat.hmChat.keySet().iterator();((java.util.Iterator) iter).hasNext();)

} } } }catch(Exception e){ } e.printStackTrace(); { } Object key=iter.next(); Chat chat=(Chat)ManageChat.hmChat.get(key); //把从服务器获得消息,显示到该显示的聊天界面 chat.showMessage(m);

(11)ManageChat类的源代码:

package com.client.tools;

import java.util.*;

import com.client.view.*;

27

湖北大学知行学院本科毕业论文(设计)

public class ManageChat{

} public static HashMap hmChat=new HashMap<String,Chat>(); //加入 public static void addChat(String uid,Chat Chat) { } //取出 public static Chat getChat(String uid) { } return (Chat)hmChat.get(uid); hmChat.put(uid, Chat);

(12)ManageClientConServerThread类的源代码:

package com.client.tools;

import java.util.HashMap;

public class ManageClientConServerThread{

} private static HashMap hm=new HashMap<String, ClientConServerThread>(); //把创建好的ClientConServerThread放入到hm public static void addClientConServerThread(String { hm.put(uid, ccst); } //可以通过userId取得该线程 public static ClientConServerThread getClientConServerThread(String uid) { return (ClientConServerThread)hm.get(uid); } uid,ClientConServerThread ccst)

(13)Message类的源代码:

package mon;

public class Message implements java.io.Serializable{

private String mesType; private int hmSize;

28

湖北大学知行学院本科毕业论文(设计)

} private String sender; private String con; private String sendTime; public int getHmSize() { } public void setHmSize(int hmSize) { } public String getSender() { } public void setSender(String sender) { } public String getCon() { } public void setCon(String con) { } public String getSendTime() { } public void setSendTime(String sendTime) { } public String getMesType() { } public void setMesType(String mesType) { } this.mesType = mesType; return mesType; this.sendTime = sendTime; return sendTime; this.con = con; return con; this.sender = sender; return sender; this.hmSize = hmSize; return hmSize;

29

湖北大学知行学院本科毕业论文(设计)

(14)MessageType类的源代码:

package mon;

public class MessageType {

} String message_succeed="1";//表明是登陆成功 String message_login_fail="2";//表明登录失败 String message_comm_mes="3";//普通信息包

(15)User类的源代码:

/**

* 这是用户信息类

*/

package mon;

public class User implements java.io.Serializable {

} private String userId; private String passwd; public String getUserId() { } public void setUserId(String userId) { } public String getPasswd() { } public void setPasswd(String passwd) { } this.passwd = passwd; return passwd; this.userId = userId; return userId;

30

更多相关推荐:
毕业设计论文规范

毕业设计论文规范为了确保毕业设计(论文)质量,特制定毕业设计(论文)撰写规范。一、论文撰写主要格式及要求:1、标题:论文题目----黑体小二2、摘要:“摘要”字样----加粗宋体小三号摘要正文----宋小四关键…

毕业设计论文

审定成绩:成都电子机械高等专科学校毕业设计(论文)设计(论文)题目:基于矢量控制的交流调速系统设计系部名称:学生姓名:姚秀娟专业:数控技术班级:08425学号:指导教师:黎帆答辩组负责人:填表时间:20xx年x…

毕业设计(论文)管理工作

毕业设计(论文)管理工作对学生的基本要求一、毕业设计(论文)中学生应遵循的基本原则1、毕业设计(论文)教学环节是综合性的实践教学活动,不仅可使学生综合运用所学过的知识和技能解决实际问题,还训练学生学习、钻研、探…

毕业设计(论文)编写格式

上海应用技术学院成人高等教育学生毕业设计(论文)编写格式为了保证我院成人高等教育毕业设计(论文)质量,特制订《上海应用技术学院成人高等教育毕业设计(论文)编写格式》。一、毕业设计(论文)撰写的内容与要求:一份完…

毕业设计(论文)读书报告(读书笔记)

毕业论文读书笔记08011226-梅路遥-会计085一、本科论文一般包括哪几部分1、封面:包括学校名、题目、作者姓名、专业班级、学号、指导老师姓名、完成时间等。题目字数一般不超过20个字,有特殊要求的可加注副标…

毕业设计(论文)

湖南九嶷职业技术学院毕业设计(论文)标题:学生姓名:系部:专业:班级:指导教师:湖南九嶷职业技术学院教务处制目录(三号黑体字)摘要………………………………………………………………11、XXXXXXXXXXXXX…

毕业设计论文

毕业设计论文摘要快走丝线切割机床是我国独立创造的电加工设备,结构简单,价格低廉,被广泛的应用于精密零件加工和特殊材料加工等领域中。走丝系统是快走丝电火花线切割机床中的重要组成部分,走丝系统既要保证电极丝在走丝的…

毕业设计论文框架模板

大连交通大学20xx届本科生毕业设计论文摘要本次设计采用实现了实例从最初的需求分析到后来的数据库设计程序设计以至最终的项目验收及后期的升级维护其中的每一步都严格按照软件工程方法学进行了严密的分析并充分利用优秀的...

软件开发类毕业设计(论文)文档写作模板

西安邮电学院管理工程学院毕业设计论文题目姓名学号专业班级指导教师年月日摘要随着时代的发展信息化已成为了一个非常热门的话题信息化程度也成为社会考核公司学校以及政府机构的新参考西安邮电学院管理工程学院作为高校中的一...

毕业设计、论文周进展情况记录 范例

知识不仅是指课本的内容还包括社会经验文明文化时代精神等整体要素才有竞争力知识是新时代的资本五六十年代人靠勤劳可以成事今天的香港要抢知识要以知识取胜共周第1周进展情况记录学生进展情况记录接到学校开展毕业设计的通知...

毕业设计论文格式模板(定稿)

宁宁波大红鹰学院毕业设计(论文)毕业设计(论文)题目20##年9月制诚信承诺我谨在此承诺:本人所写的毕业论文《XXXXXXXX》均系本人独立完成,没有抄袭行为,凡涉及其他作者的观点和材料,均作了注释,若有不实,…

毕业设计论文写作指导(分享)

毕业设计论文写作指导仅供参考毕业设计论文是毕业设计工作的总结和提高和做科研开发工作一样要有严谨求实的科学态度毕业设计论文应有一定的学术价值和实用价值能反映出作者所具有的专业基础知识和分析解决问题的能力在毕业设计...

毕业设计论文(152篇)