Java聊天室系统程序设计
实验报告
院 (系):信息与通信工程系
专 业:计算机应用技术
班 级:
学 号:
姓 名:
指导老师:
20##/6/8
目录
第一部分:系统设计总述.... 2
1.设计目的:... 2
2.设计总体要求:... 2
3.实现目的:... 2
第二部分:系统需求分析.... 3
1.系统任务描述... 3
2.系统功能分析... 3
3.系统可行性分析... 3
第三部分:系统设计.... 4
1.系统总体结构设计... 4
2.系统主体的处理流程... 5
3.系统流程逻辑... 5
第四部分:代码分析.... 6
1.服务器端部分代码... 6
2.客户端部分代码... 6
第五部分:系统的具体实现.... 6
界面设计... 6
第六部分:小结.... 10
第七部分:参考文献.... 10
第一部分:系统设计总述
1.设计目的:
1.在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计特性的理解。
2.学会Java程序开发的环境搭建与配置,并在实际运用中学习和掌握Java程序开发的全过程。
3.进一步熟悉掌握Java程序设计语言的基础内容,如用户图形界面设计、文件和网络输入输出流编程、Java数据库编程等。
4.通过亲自动手写程序,一方面拓展知识面,一方面锻炼调试能力。
2.设计总体要求:
1.问题的描述与程序将要实现的具体功能。
2.程序功能实现的具体设计思路或框架,并检查流程设计。
3.代码实现。
4.程序测试。
5.设计小结(包括)
3.实现目的:
本软件是一个实用聊天程序。项目要实现以下目标:
1)建立服务器端和客户端并进行连接;
2)利用线程设计结构合理,运行效率较高的聊天室;
3)实现写消息,发消息,回复,查看聊天记录等功能;
第二部分:系统需求分析
1.系统任务描述
本系统是基于java开发的聊天室。如有用户聊天,服务器会显示出聊天信息。服务器端和客户端可以互相发送和接收信息,还可以查看聊天记录。如果服务器还没有启动,则客户端是不可以利用聊天室收发信息的。如果在运行过程中,服务器断开则系统会有提示。
2.系统功能分析
系统的功能需求
聊天室程序通常需要完成以下一些基本功能:
A.登录聊天室;
B.启动服务器;
C.关闭服务器;
D.用户之间的聊天;
E.退出聊天室。
3.系统可行性分析
从技术方面来看,java语言的优点主要表现在:简单、面向对象、多线程、安全性等方面。
(1)简单性
Java实现了自动的功能收集,简化了内存管理的工作,这使程序设计更简便,同时减少了出错的可能。
(2)面向对象
Java提供了简单的类机制和动态的架构模型。对象中封装了它的状态变量和方法。很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。
Java同样支持继承特性,java的类可以从其他类中继承行为,但java只支持类的单重继承,即每个类只能从一个类中继承。
Java支持界面,界面允许程序员定义方法但不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。
(3)多线程
多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。多线程保证了较高的执行效率。
(4)安全性
用于网络、分布环境下的java必须要防止病毒的入侵,java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
第三部分:系统设计
系统设计是本系统开发的重要阶段,它直接影响目标系统的质量,是整个开发工作的核心。系统设计阶段主要任务是:在系统分析提出的逻辑模型的基础上,科学合理地进行物理模型设计。
1.系统总体结构设计
2.系统主体的处理流程
3.系统流程逻辑
第四部分:代码分析
本系统的IP为本机的网络虚拟IP(127.0.0.1),在任何电脑上都能用,端口号设置为9000。注意:客户端只有在服务端开启的情况下才能正常聊天。
1.服务器端部分代码
public TestServer_zmx() //主构造方法及布局
ServerSocket ss=new ServerSocket(9000);//服务器建立端口号9000
Socket s1 = ss.accept();//服务器监听是否有连接
class MyAction implements ActionListener //处理发送按钮的类
class MyThreadWriter extends Thread //处理输出流类
class MyThreadRead extends Thread {//处理输入流读入类
class qingping implements ActionListener //处理清屏类
class xiaoxijilu extends JFrame implements ActionListener //处理消息记录类
2.客户端部分代码
public TestClient_zmx() //主构造方法及布局
Socket s1 = new Socket("localhost",9000);//建立与服务器的连接,为本地主机,9000号端口
class MyAction1 implements ActionListener //处理发送按钮的类
class MyThreadWriter1 extends Thread //处理输出流类
class MyThreadRead1 extends Thread //处理输入流读入类
class qingping1 implements ActionListener //处理清屏类
class xiaoxijilu1 extends JFrame implements ActionListener //处理消息记录类
第五部分:系统的具体实现
界面是系统之间最直接的交互界面,界面的友好性体现了软件设计的质量,并在很大的程度上决定了软件是否成功。
界面设计
(1).服务器端的启动界面
(2).客户端界面
(3).服务器端和客户端聊天的界面
(4).设置界面图
A.设置字体
B.设置字体大小
C.设置字体颜色
D.显示聊天记录
第六部分:小结
这次设计经过不懈的努力,程序基本满足聊天的需要。完成后的程序实现了写消息,发消息,回复,查看聊天记录等功能。
程序设计期间,通过询问老师、同学和网上搜索相关解答等多种方式学习到很多课堂上没有的知识,增强了解决实际问题的能力。在此之前,对于java编程技术没有很深入的认识,对其工作方式和原理缺乏透彻的认识。在这段时间里,我认真的学习了java语言开发,对编程思想有了进一步的体会,养成了一些良好的编程习惯。程序虽然完成了,但是距离完美还存在一定的差距,用java开发大型项目还有很多我需要去努力学习的知识。希望自己能不断学习和实践,争取以后做得更好。
第七部分:参考文献
【1】 袁然、郑自国、邹丰义编著。《JAVA案例开发集锦》。 电子工业出版社
【2】 刘志成编著。《JAVA程序设计案例教程》。 清华大学出版社
【3】 张基温编著。《JAVA程序开发教程》。 清华大学出版社
【4】 袁晓华编著。《JAVA面向对象程序设计教程》。 机械工业出版社
第二篇:Java聊天室系统
武 汉 科 技 大 学 城 市 学 院
课 程 设 计 报 告
课程设计名称 Java课程设计
题 目: 基于Java两人聊天室系统
院 系: 信息科学与工程系
专 业: 计算机科学与技术
编号:019
题目:基于Java 网络通信编程实现两人聊天室系统
1 课程设计教学条件要求 eclipse/ netbeans/ Jbuilder
2 课程设计任务
本系统要求实现一个两人聊天室的Java 图形用户界面界面程序,主要包括如下功能:
1.主人可以根据输入的IP寻找要聊天的对象。
2.主人和客人之间可以互相发送短消息进行即时聊天。
3 课程设计报告书主要内容
1 需求分析
2 总体设计
2.1 设计的总体思想与算法描述
2.2 模块结构图
2.3 各功能模块的功能与处理流程描述
2.4 界面设计
3 各功能模块程序设计
按照功能模块的功能与处理流程描述给出详细的程序代码,并给出重点语句
的注释.
4 小结
4 课程设计要求
1 按时到机房签到,在指定机位上机。遵守机房纪律。
2 独立完成课程设计任务。指导教师到机位上指导学生和分时段验收学生完成的程序。
3 按时提交打印的课程设计报告书。
5 课程设计参考书
[1] 许文宪 懂子建. Java程序设计教程与实训. 北京:北京大学出版社,2005.
[2] 辛运帏 .Java程序设计.北京:清华大学出版社, 2004
[3] [美]Echel,B .Java编程思想(第三版).北京:机械工业出版社,2005
目 录
1需求分析... 3
2总体设计... 4
2.1 设计的总体思想... 4
2.2程序功能模块设计... 4
2.2.1主窗口对象... 5
2.2.2数据库连接对象... 5
2.2.3聊天室对象... 5
2.3界面设计... 6
2.3.1程序登录界面设计... 6
2.3.2程序注册界面设计... 6
2.3.3程序密码修改界面设计... 7
2.3.4聊天室界面设计... 7
3 程序设计... 7
3.1 程序主界面设计... 7
3.2数据库连接设计... 19
3.3聊天室设计... 20
4 小结... 25
参考文献... 26
1需求分析
聊天室系统使用JAVA+SQL完成,ECLIPSE完成代码编写,JIGLOO完成界面设计,SQL SERVER完成数据库管理。聊天室通过输入的对方IP,将JTextField中的内容发送到拥有此IP的主机(前提是对方也启动了聊天室程序)。网络的通信使用UDP协议,即时搜寻网络上的短消息,并可恢复对方消息。
数据库的表只有一个User_Info,用户通过用户管理模块登录,注册,修改密码。系统有三个类,MainWin、ChatRoom、jdbcodbc。MainWin是程序的入口类,界面是登陆,注册,修改密码的JFrame窗口。ChatRoom是聊天室的主窗口,负责搜发消息。jdbcodbc负责数据库的连接,有一个构造函数,一个查询方法,一个更新方法,三个返回方法。三个类都放在Com包里,Com包在Chat项目里。
具体需要实现以下一些基本功能:
l 用户管理模块
l 数据库连接模块
l 聊天室界面
2总体设计
2.1 设计的总体思想
程序分为三个部分:数据库连接,聊天室管理,用户管理。其中用户管理有分为用户注册,用户登录,用户修改密码。
2.2程序功能模块设计
图2.1 程序功能模块图
2.2.1主窗口对象
MainWin()方法:构造函数,调用initGUI()方法以及父类JFRAME的构造函数。
main()方法:程序的入口。
initGUI()方法:加载窗口的各个组件以及事件处理。
2.2.2数据库连接对象
jdbcodbc():构造函数,加载数据库驱动,建立数据库连接。
CheckInfo():将查询语句得到的数据库内容赋给数据集。
UpdateInfo():用插入语句使数据库更新。
2.2.3聊天室对象
ChatRoom():构造函数,调用initGUI()方法以及父类JFRAME的构造函数。并用循环实现实时接受数据包里的消息。
initGUI():加载窗口的各个组件以及事件处理。
2.3界面设计
2.3.1程序登录界面设计
图2.2登录界面
2.3.2程序注册界面设计
图2.3注册界面
2.3.3程序密码修改界面设计
图2.4密码修改界面
2.3.4聊天室界面设计
图2.5聊天室界面
3 程序设计
3.1 程序主界面设计
public class MainWin extends javax.swing.JFrame {
public static void main(String[] args) {
MyThread th = new MyThread();
th.start();
}
public MainWin() {
super();
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.setPreferredSize(new java.awt.Dimension(571, 395));
getContentPane().setLayout(null);
this.setTitle("\u6b22\u8fce\u8fdb\u5165\u804a\u5929\u5ba4");
getContentPane().setBackground(new java.awt.Color(236, 233, 216));
this.setVisible(false);
this.setResizable(false);
{
jTabbedPane1 = new JTabbedPane();
getContentPane().add(jTabbedPane1, "Center");
jTabbedPane1.setBounds(0, 0, 563, 361);
jTabbedPane1.setBackground(new java.awt.Color(236, 233, 216));
{
jPanel1 = new JPanel();
jTabbedPane1.addTab("登录", null, jPanel1, null);
jPanel1.setPreferredSize(new java.awt.Dimension(522, 250));
jPanel1.setLayout(null);
{
jButton1 = new JButton();
jPanel1.add(jButton1);
jButton1.setText("\u767b\u5f55");
jButton1.setBounds(384, 176, 85, 31);
jButton1.setFont(new java.awt.Font("宋体", 0, 20));
}
{
jTextField1 = new JTextField();
jPanel1.add(jTextField1);
jTextField1.setBounds(208, 80, 93, 31);
jTextField1.setFont(new java.awt.Font("宋体", 0, 20));
}
{
jPasswordField1 = new JPasswordField();
jPanel1.add(jPasswordField1);
jPasswordField1.setBounds(208, 177, 93, 31);
jPasswordField1.setFont(new java.awt.Font("宋体", 0, 20));
}
{
jLabel1 = new JLabel();
jPanel1.add(jLabel1);
jLabel1.setText("\u7528\u6237\u540d\uff1a");
jLabel1.setBounds(52, 76, 93, 31);
jLabel1.setFont(new java.awt.Font("宋体", 0, 22));
}
{
jLabel2 = new JLabel();
jPanel1.add(jLabel2);
jLabel2.setText("\u5bc6 \u7801\uff1a");
jLabel2.setBounds(52, 177, 93, 31);
jLabel2.setFont(new java.awt.Font("宋体", 0, 22));
}
}
{
jPanel2 = new JPanel();
jTabbedPane1.addTab("注册", null, jPanel2, null);
jPanel2.setLayout(null);
{
jLabel3 = new JLabel();
jPanel2.add(jLabel3);
jLabel3.setText("\u7528\u6237\u540d\uff1a");
jLabel3.setBounds(117, 70, 65, 23);
jLabel3.setFont(new java.awt.Font("宋体", 0, 22));
jLabel3.setSize(93, 31);
}
{
jLabel4 = new JLabel();
jPanel2.add(jLabel4);
jLabel4.setText("\u5bc6 \u7801\uff1a");
jLabel4.setBounds(117, 122, 93, 31);
jLabel4.setFont(new java.awt.Font("宋体", 0, 22));
}
{
jLabel5 = new JLabel();
jPanel2.add(jLabel5);
jLabel5.setText("\u59d3 \u540d\uff1a");
jLabel5.setBounds(117, 180, 93, 31);
jLabel5.setFont(new java.awt.Font("宋体", 0, 22));
}
{
jLabel6 = new JLabel();
jPanel2.add(jLabel6);
jLabel6.setText("\u6027 \u522b\uff1a");
jLabel6.setBounds(117, 237, 93, 31);
jLabel6.setFont(new java.awt.Font("宋体", 0, 22));
}
{
jTextField2 = new JTextField();
jPanel2.add(jTextField2);
jTextField2.setBounds(234, 70, 93, 31);
jTextField2.setFont(new java.awt.Font("宋体", 0, 20));
}
{
jPasswordField2 = new JPasswordField();
jPanel2.add(jPasswordField2);
jPasswordField2.setBounds(234, 122, 93, 31);
jPasswordField2.setFont(new java.awt.Font("宋体", 0, 20));
}
{
jTextField3 = new JTextField();
jPanel2.add(jTextField3);
jTextField3.setBounds(234, 180, 93, 31);
jTextField3.setFont(new java.awt.Font("宋体", 0, 20));
}
{
jTextField4 = new JTextField();
jPanel2.add(jTextField4);
jTextField4.setBounds(234, 237, 93, 31);
jTextField4.setFont(new java.awt.Font("宋体", 0, 20));
}
{
jButton2 = new JButton();
jPanel2.add(jButton2);
jButton2.setText("\u6ce8\u518c");
jButton2.setBounds(373, 236, 85, 31);
jButton2.setFont(new java.awt.Font("宋体", 0, 20));
}
}
{
jPanel3 = new JPanel();
jTabbedPane1.addTab("密码修改", null, jPanel3, null);
jPanel3.setLayout(null);
{
jLabel7 = new JLabel();
jPanel3.add(jLabel7);
jLabel7.setText("\u65e7\u5bc6\u7801\uff1a");
jLabel7.setBounds(98, 94, 36, 15);
jLabel7.setFont(new java.awt.Font("宋体", 0, 22));
jLabel7.setSize(93, 31);
}
{
jLabel8 = new JLabel();
jPanel3.add(jLabel8);
jLabel8.setText("\u65b0\u5bc6\u7801\uff1a");
jLabel8.setBounds(98, 148, 36, 15);
jLabel8.setFont(new java.awt.Font("宋体", 0, 22));
jLabel8.setSize(93, 31);
}
{
jLabel9 = new JLabel();
jPanel3.add(jLabel9);
jLabel9.setText("\u786e\u8ba4\u5bc6\u7801\uff1a");
jLabel9.setBounds(98, 202, 114, 31);
jLabel9.setFont(new java.awt.Font("宋体", 0, 22));
}
{
jPasswordField3 = new JPasswordField();
jPanel3.add(jPasswordField3);
jPasswordField3.setBounds(232, 94, 93, 31);
}
{
jPasswordField4 = new JPasswordField();
jPanel3.add(jPasswordField4);
jPasswordField4.setBounds(232, 148, 93, 31);
}
{
jPasswordField5 = new JPasswordField();
jPanel3.add(jPasswordField5);
jPasswordField5.setBounds(232, 202, 93, 31);
}
{
jButton3 = new JButton();
jPanel3.add(jButton3);
jButton3.setText("\u786e\u8ba4");
jButton3.setBounds(373, 203, 85, 31);
jButton3.setFont(new java.awt.Font("宋体", 0, 20));
}
{
jTextField5 = new JTextField();
jPanel3.add(jTextField5);
jTextField5.setBounds(232, 42, 10, 22);
jTextField5.setFont(new java.awt.Font("宋体", 0, 20));
jTextField5.setSize(93, 31);
}
{
jLabel10 = new JLabel();
jPanel3.add(jLabel10);
jLabel10.setText("\u7528\u6237\u540d\uff1a");
jLabel10.setBounds(98, 42, 36, 15);
jLabel10.setFont(new java.awt.Font("宋体", 0, 22));
jLabel10.setSize(93, 31);
}
}
}
pack();
this.setSize(571, 395);
} catch (Exception e) {
e.printStackTrace();
}
jButton1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int visible = 0;
try {
jdbcodbc db = new jdbcodbc();
db.CheckInfo("select * from User_Info");
while (db.GetRS().next()) {
if (db.GetRS().getString("ID").trim().equals(
jTextField1.getText())) {
if (db.GetRS().getString("PassWord").trim().equals(
new String(jPasswordField1.getPassword()))) {
JFrame.setDefaultLookAndFeelDecorated(true);
ChatRoom chatroom = new ChatRoom();
chatroom.setLocationRelativeTo(null);
chatroom.setVisible(true);
visible = 1;// 窗体可见,说明用户信息正确
}
}
}
if (visible == 0) {
JOptionPane.showMessageDialog(null, "用户信息错误", "警告",
JOptionPane.ERROR_MESSAGE);
jTextField1.setText("");
jPasswordField1.setText("");
jTextField1.requestFocus();
}
} catch (SQLException sqe) {
}
}
});
jButton2.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
String ID = jTextField2.getText().trim();
String PassWord = new String(jPasswordField2.getPassword());
String User_Name = jTextField3.getText().trim();
String User_Sex = jTextField4.getText().trim();
String sql = "insert into User_Info values('" + ID + "','"
+ PassWord + "','" + User_Name + "','" + User_Sex
+ "')";
jdbcodbc db1 = new jdbcodbc();
jdbcodbc db2 = new jdbcodbc();
int visible = 0;
db1.CheckInfo("select * from User_Info");
try {
if (jTextField2.getText().length() == 0) {
JOptionPane.showMessageDialog(null, "请输入用户名!", "警告",
JOptionPane.ERROR_MESSAGE);
jTextField2.requestFocus();
return;
}
if (jTextField3.getText().length() == 0) {
JOptionPane.showMessageDialog(null, "请输入姓名!", "警告",
JOptionPane.ERROR_MESSAGE);
jTextField3.requestFocus();
return;
}
if (jTextField4.getText().length() == 0) {
JOptionPane.showMessageDialog(null, "请输入性别!", "警告",
JOptionPane.ERROR_MESSAGE);
jTextField4.requestFocus();
return;
}
if (jPasswordField2.getPassword().length == 0) {
JOptionPane.showMessageDialog(null, "请输入密码!", "警告",
JOptionPane.ERROR_MESSAGE);
jPasswordField2.requestFocus();
return;
}
while (db1.GetRS().next()) {
if (db1.GetRS().getString("ID").trim().equals(
jTextField2.getText())) {
visible = 1;
}
}
if (visible == 1) {
JOptionPane.showMessageDialog(null, "用户信息错误", "警告",
JOptionPane.ERROR_MESSAGE);
jTextField2.setText("");
jTextField2.requestFocus();
}
if (visible == 0) {
JOptionPane.showMessageDialog(null, "恭喜注册成功!", "恭喜",
JOptionPane.INFORMATION_MESSAGE);
db2.UpdateInfo(sql);
jTextField2.setText("");
jPasswordField2.setText("");
jTextField3.setText("");
jTextField4.setText("");
jTextField2.requestFocus();
}
} catch (SQLException sqe) {
}
}
});
jButton3.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jdbcodbc db1 = new jdbcodbc();
jdbcodbc db2 = new jdbcodbc();
int visible = 0;
if (jTextField5.getText().length() == 0) {
JOptionPane.showMessageDialog(null, "请输入用户名!", "警告",
JOptionPane.ERROR_MESSAGE);
jTextField5.requestFocus();
return;
}
if (jPasswordField3.getPassword().length == 0) {
JOptionPane.showMessageDialog(null, "请输入旧密码!", "警告",
JOptionPane.ERROR_MESSAGE);
jPasswordField3.requestFocus();
return;
}
if (jPasswordField4.getPassword().length == 0) {
JOptionPane.showMessageDialog(null, "请输入新密码!", "警告",
JOptionPane.ERROR_MESSAGE);
jPasswordField4.requestFocus();
return;
}
if (jPasswordField5.getPassword().length == 0) {
JOptionPane.showMessageDialog(null, "请输入密码确认!", "警告",
JOptionPane.ERROR_MESSAGE);
jPasswordField5.requestFocus();
return;
}
if (!(new String(jPasswordField5.getPassword())
.equals(new String(jPasswordField4.getPassword())))) {
JOptionPane.showMessageDialog(null, "密码 不 一致!", "警告",
JOptionPane.ERROR_MESSAGE);
jPasswordField4.setText("");
jPasswordField5.setText("");
jPasswordField4.requestFocus();
return;
}
try {
db1.CheckInfo("select * from User_Info");
while (db1.GetRS().next()) {
if (db1.GetRS().getString("ID").trim().equals(
jTextField5.getText())) {
if (db1.GetRS().getString("PassWord").trim()
.equals(
new String(jPasswordField3
.getPassword()))) {
visible = 1;
}
}
}
if (visible == 0) {
JOptionPane.showMessageDialog(null, "用户信息错误", "警告",
JOptionPane.ERROR_MESSAGE);
jTextField5.setText("");
jPasswordField3.setText("");
jTextField5.requestFocus();
}
if (visible == 1) {
String ID = jTextField5.getText();
String PassWord = new String(jPasswordField4
.getPassword());
String sql = "update User_Info set PassWord='"
+ PassWord + "' where ID='" + ID + "'";
db2.UpdateInfo(sql);
JOptionPane.showMessageDialog(null, "修改成功", "恭喜",
JOptionPane.INFORMATION_MESSAGE);
jTextField5.setText("");
jPasswordField3.setText("");
jPasswordField4.setText("");
jPasswordField5.setText("");
jTextField5.requestFocus();
}
} catch (SQLException sqe) {
}
}
});
}
class MyThread extends Thread {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
MainWin inst = new MainWin();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
}
3.2数据库连接设计
class jdbcodbc {
String driverClass = "sun.jdbc.odbc.JdbcOdbcDriver";
String url = "jdbc:odbc:ChatDB";
Statement stmt = null;
ResultSet rs = null;
Connection con=null;
public jdbcodbc() {
try {
Class.forName(driverClass);
con = DriverManager.getConnection(url);
} catch (ClassNotFoundException e) {
System.out.println("can not find driver" + driverClass);
System.exit(-1);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void CheckInfo(String m_rs)
{
try {
stmt = con.createStatement();
rs = stmt.executeQuery(m_rs);
} catch (SQLException sqe) {
sqe.printStackTrace();
}
}
public void UpdateInfo(String m_rs)
{
try {
stmt = con.createStatement();
stmt.executeUpdate(m_rs);
} catch (SQLException sqe) {
sqe.printStackTrace();
}
}
public ResultSet GetRS()
{
return rs;
}
public Connection GetCon()
{
return con;
}
public Statement GetSt()
{
return stmt;
}
}
3.3聊天室设计
public class ChatRoom extends javax.swing.JFrame {
DatagramSocket ds;
public ChatRoom() {
super();
try {
ds = new DatagramSocket(3000);
} catch (Exception ex) {
ex.printStackTrace();
}
new Thread(new Runnable() {
public void run() {
byte buf[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 1024);
while (true) {
try {
ds.receive(dp);
jTextArea1.append(dp.getAddress().getHostAddress()
+ " : " + new String(buf, 0, dp.getLength())
+ "\n");
jTextArea1.selectAll();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
this.setResizable(false);
this.setTitle("\u6b22\u8fce\u8fdb\u5165\u804a\u5929\u5ba4");
{
jScrollPane1 = new JScrollPane();
getContentPane().add(jScrollPane1);
jTextArea1 = new JTextArea();
jTextArea1.setBounds(12, 12, 408, 188);
jTextArea1.setBorder(BorderFactory.createMatteBorder(1, 1, 1,
1, new java.awt.Color(0, 0, 0)));
jScrollPane1.setBounds(12, 12, 408, 188);
jScrollPane1.getViewport().add(jTextArea1, null);
}
{
IP = new JTextField();
getContentPane().add(IP);
IP.setBounds(12, 205, 97, 28);
IP.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1,
new java.awt.Color(0, 0, 0)));
}
{
Message = new JTextField();
getContentPane().add(Message);
Message.setBounds(122, 205, 93, 28);
Message.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1,
new java.awt.Color(0, 0, 0)));
}
{
jButton1 = new JButton();
getContentPane().add(jButton1);
jButton1.setText("\u53d1\u9001");
jButton1.setBounds(227, 205, 87, 28);
}
{
jButton2 = new JButton();
getContentPane().add(jButton2);
jButton2.setText("\u9000\u51fa");
jButton2.setBounds(326, 205, 93, 28);
}
pack();
this.setSize(438, 273);
} catch (Exception e) {
e.printStackTrace();
}
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
ds.close();
System.exit(0);
}
});
Message.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
byte[] buf;
buf = e.getActionCommand().getBytes();
try {
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName(IP.getText()), 3000);
ds.send(dp);
} catch (Exception ex) {
ex.printStackTrace();
}
((JTextField) e.getSource()).setText("");
}
});
jButton1.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
byte[] buf;
buf = Message.getText().getBytes();
try {
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName(IP.getText()), 3000);
ds.send(dp);
} catch (Exception ex) {
ex.printStackTrace();
}
Message.setText("");
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
Message.requestFocus(true);
}
});
jButton2.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
ds.close();
System.exit(0);
}
});
}
}
4 小结
JAVA课程设计终于要结束了,这次的课程设计要比软件工程的课程设计要有意思一些。不仅仅是因为这次的时间要长些,做设计的工作可以更细致一些,还因为JAVA课程设计需要对程序进行更深入的编写。从实际的动手操作中,可以学到更多的知识。
一开始拿到任务书的时候,感觉有点无从下手。一来对ECLIPSE的一些操作还没有完全摸清,二来就是因为我做的是聊天室,所以必须对网络编程有一定的了解。课程设计的第一天我不是拿到任务书就开始敲代码,一整天我都是在看书上网络编程的知识。然后就是在网上找资料,找插件。本来最先开始我使用的是TCP协议进行通信,但是后来感觉聊天系统不需要对数据的传输有绝对的正确,况且是在通信状况非常好的局域网,所以我把协议改成了UDP。设计的聊天窗口需要输入对方IP,如果对方也启动了程序就可以相互发送消息。如果不输入IP则默认的是向本机发送。数据库的连接也遇上了点小麻烦,查询数据库还比较顺利的,可是当要修改数据库时,试了多次都没添加进去。后来发现是因为我写的数据库连接的类查询和插入必须用两个不同的实例。不然数据集会在查询以后有所改变。
界面的设计是用的我在网上找的jigloo插件。因为这个插件功能比较完善,而且添加的也很方便,直接解压到ECLIPSE文件夹就行了。起初我以为有了这个插件就可以像VB那样拖一拖就能完成。可是后来发现它与VB的界面设计完全不一样。最终还是要自己动手修改代码。所以我采取的措施是先把组件都设置好,然后自己添加事件、数据库的连接等等。好在组件设置好以后的JFRAME类的代码写的非常清楚。一个MAIN函数新建窗体实例,然后构造函数新建窗体,运用initGUI()方法将组件都赋值,设置大小等。清楚简洁,所以添加功能比较方便。在运用代码的时候,我学会了运用JDK查找。通过输入的类或接口的名字进行搜索,然后寻找这个类中自己想要的方法进行调用。因为JAVA的类库非常的强大,类实在是太多了,所以JDK是一个非常有用的工具。
这个聊天室基本上是我自己动手做出来的,所以感觉学的东西比较多。但是和QQ,ICQ这些专业人员写的聊天工具简直是天壤之别。其实好多功能都可以扩展的。比如我的聊天系统只能两个人聊而不能多人实时接收消息。又比如可以增加查找本地IP的功能。如果想要和网上的用户进行聊天,可能还要了解服务器通信。这些如果通过查资料都可以自己实现的。这次做的功能有点单一实在是有点遗憾。
最后,想说每次的课程设计都给我带来很大的收获,我体会到看书固然重要,但是实际动手才是程序员熟悉语言的捷径。只有动手编写代码,印象才会深刻。才能在实践中找到自己哪些掌握的好,哪些记的还不是很牢固。
参考文献
[1] 许文宪 懂子建. Java程序设计教程与实训. 北京:北京大学出版社,2005.
[2] 辛运帏 .Java程序设计.北京:清华大学出版社, 2004
[3] [美]Echel,B .Java编程思想(第三版).北京:机械工业出版社,2005
课程设计评分表