Java课程设计实习报告
学 校:技术学院
系 部: 信息工程系
班 级: 计网0831班
姓 名:
日 期: 2009年12月31日
指导老师:
JAVA课程设计实习日志
20##年12月21日 星期一 天气有点冷
今天是实习的第一天,在电脑旁边坐了一天,说真的还挺累的,但是一分耕耘一份收获的道理不是没有的,由于JAVA这门课程对我们来说,是今年刚刚学过的,所以学习起来也比较容易接受,吸收的也比较快,对于今天JAVA课程设计实习出现的一系列问题,进行了如下记载
今天学的是数据库编程,首先是创建数据库,创建数据表,创建数据源,连接数据库和数据查询等等,在创建数据库的时候,用的是SQL2005,这是一个新型版本的数据库软件,所以刚刚使用的时候有点不顺手,甚至可以说是不会用,但是在老师的指导下,渐渐熟悉起来,这也是今天的一个收获,因为我学到了一个新软件的应用。
在今天的编程中,存在着很多问题,例如语法错误,粗心造成大小写错误等等,但是在自己的耐心调试下和同学的相互帮助下都能够一一解决,在今天中,也学到了几个新的方法,
对于数据库和JAVA的连接,在连接数据库和加载驱动的时候我学会了两个方法:
(一)import java.sql.*;本行是引入SQLSERVER数据库连接
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}本行是加载JDBC直接连接数据库驱动程序
Connection con=DriverManager.getConnection("jdbc:odbc:happychatJDBC","sa","");直接连接数据库利用JDBC ODBC数据源才能实现数据库的加载
(二)
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;databasename=zsj3","sa","");
本程序是利用JDBC并且要导入JAR包才能够实现的一种加载驱动和连接数据库的方法。
JAVA课程设计实习日志
20##年12月22日 星期二 天气有点冷
实习继续,今天还是继续学习新方法,外加复习学习过的知识,并将它们与新方法相结合,做出GUI组件。下面是对今天做组件时的问题分析:
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.sql.*;
利用这些包来执行其包下的方法
public class T3 extends JFrame implements ActionListener
JPanel JLabel JButton JTextField 利用这些类来构造方法
构造GUI面板并且设置属性,在这段编写中已经能够很好的掌握!大概没有什么问题!
下面是添加事件处理使其和数据库连接,来完成对数据的保存,修改和删除的功能。在做这个的时候,费的时间特别的多,存在的问题大多是在数据库的建立和连接上,可能还是对数据库不太熟悉的原因,再一个就是大小写和单词错误,使得程序运行不出来。具体分析如下:
连接数据库在程序中由于数据库的原因没有加载成功,在多次尝试新建数据库后成功将本程序运行出来。
public Connection openDatebase(){
String ur1="jdbc:microsoft:sqlserver://localhost:1433;databasename=conn";
try{
加载驱动 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection conn=DriverManager.getConnection(ur1,"sa","");
return conn;
}
catch(Exception e){
JOptionPane.showMessageDialog(null,"数据库连接失败");
System.out.println("^^");
return null;
}
}
public void insertRecord()
{
try
{构造PreparedStatement对象
PreparedStatement psm=openDatebase().prepareStatement("Insert users(U_name,U_pass) values(?,?)");插入语句
psm.setString(1,txtName.getText());
psm.setString(2,txtPass.getText());
psm.executeUpdate();
使用psm.executeUpdate()方法;将插入的数据保存成功
JOptionPane.showMessageDialog(null,"记录保存成功!");
psm.close();
}
catch(Exception e){
JOptionPane.showMessageDialog(null,"记录插入失败!");
}
}
更新数据
public void updateRecord1()
{
try{
Statement sm=openDatebase().createStatement();
使用一个数据查询语句
String strUpdate="update users set U_pass='"+txtPass.getText()+"'where U_name='"+txtName.getText()+"'";
sm.executeUpdate(strUpdate);
JAVA课程设计实习日志
20##年12月23日 星期三 天气有点冷
实习继续,今天学习过的知识,做出学生管理系统GUI组件。主要是做出主界面、添加学生信息界面并且实现其功能。
引入包,使用其方法和类
import javax.swing.*;
import java.awt.*;
创建主界面
设置背景,在设置背景时,由于没有搞清楚Jpanel和JLabel的关系还有就是图片的路径导致图片背景不能够添加成功,在经过和郭小龙的研讨后,将其添加成功,然后在给其他同学条这节程序时加以巩固,使我能够对这块知识有了更加深刻的认识和了解。
mbMain=new JMenuBar();
jpMain=new JPanel();
getContentPane().add(jpMain);
Icon logol1=new ImageIcon("G:\\1.jpg");
lbl=new JLabel(logol1);
利用setBackground()方法设置背景颜色
利用Font fontstr=new Font("隶书",Font.PLAIN,24);
jm1.setFont(fontstr);方法设置字体、大小属性
利用addActionListener(this)为菜单添加事件
jpMain.setBackground(Color.red);
jpMain.add(lbl);
设置下拉菜单利用setForeground()设置其字体颜色
jm1=new JMenu("学生系统");
jm1.setForeground(Color.red);
Font fontstr=new Font("隶书",Font.PLAIN,24);
jm1.setFont(fontstr)
添加菜单栏,将各个菜单添加到JPanel面板上去
mbMain.add(jm1);
mbMain.add(jm2);
JAVA课程设计实习日志
20##年12月24日 星期四 天气有点冷
实习继续,今天学习过的知识,做出学生管理系统部分GUI组件。主要是做出主界面与其他页面的连接、查修页面和修改页面。
引入包,使用其方法和类
对于主界面与其他页面的连接,首先是写处理方法这一段程序,是经过调用方法来实现各个板块的连接,在没有连接的时候,对它充满了好奇,不知道是如何使其连接到一块的,也是好奇心的原因,然后快快的通过和同学的研讨,外加对API查询,使其各个板块连接到一起。在连接时先是通过给菜单添加事件即addActionListener(this),然后通过if(ea.getSource()==it3)
{
new S1();
语句来调用这个方法,使其实现其事件功能。
public void actionPerformed(ActionEvent ea)
{
if(ea.getSource()==it3)
{
new S1();
}
对于换背景的这一段,要用setIcon()这个方法来实现。
在没有想到这个方法的时候,我们在想回背景是不是要换容器,但是做完后发现不是,因为如果换了容器就会换掉界面,那样就不是在给容器换背景了!
JAVA课程设计实习日志
20##年12月25日 星期五 天气有点冷
实习继续,今天的实习主要是对这几天做的和学的东西进行总结和完善,对于做完并且完善好的同学,去帮助一下其他的同学去调节程序,发现安问题,提升自己对知识的运用能力。
我今天主要是完善自己的主页面,使其更加的逼真,然后不没有写好的日志进行添补,做完这些的时候去帮助其他的同学跳了一下程序,虽然有的没有调节出来,但是也有调节出来的,例如我在写程序是入到的一些问题,其他同学也遇上了,我就用我解决问题的方法,给她解决掉了,是别人能够顺利的跟上老师的脚步,自己也会对知识有了更深的认识。
在自己工作全部完成的时候,我在翻阅课外书的时候,看到这样一个程序,然后我就有了自己的想法,那就是编一个程序,把自己班同学的照片放进一个程序中通过输入姓名来对其照片查询,但是这个工作做完后,发现照片出不来,原因可能是照片的路径不正确,具体原因还没有找出来,但是我不会放弃的,我会去查资料或者,来完成它。
JAVA课程设计实习日志
20##年12月28日 星期一 天气有点冷
实习继续,今天的实习主要是对修改主页面进行实现其功能,在完成这个功能的时候,问题还是挺多的,首先是数据库就没有连接好,我就在数据库上面下了一点功夫,使得数据库能够连接成功,在连接成功后,页面显示修改成功,但是,在我返回数据库的时候,我发现里面并没有我修改的资料,我就再修改,情况还是和原来一样,然后我就去找其他同学帮我看看,等她输入一遍以后,里面就有了修改的资料,但是等我再做的时候,又恢复了原样,唉!头疼啊!看来真是编程不是谁都能玩的啊!
在做完修改的时候,我又继续做我的“班级靓照”这个板块,对于星期五出现的问题,果然是照片的路径没有放对,经过老师的指导和调试,成功的完成了这个程序,但是在我往主面板上加载连接的时候,竟然不能显现,于是我就问其他同学这是为什么,他说,是不是只有JFrame容器才能连接,于是我又把本程序让它继承了JFrame,而程序本身是继承的JPanel。照老师所说JFrame、JPanel、Appeat、都属于容器,应该都能被继承,原理应该是一样的,为什么却不行呢?当时也没有思考出来,我想,以后有机会和时间,再去查查吧!因为幸运的是在我把它改成JFrame的时候,和主面板连接成功了!!!嘿嘿^ ^有了一点小小的成功!
美好的一天过去了!明天又是美好的一天!!!
JAVA课程设计实习日志
20##年12月29日 星期二 天气有点冷
实习继续,今天的实习主要是对查询主页面进行实现其功能,在完成这个功能的时候,问题还是挺多的,调了整整一个下午都没有调出来,但是我会继续努力的,今天唯一的收获就是把查询界面中的上一条,下一条、最后一条和第一条的查询功能。
在做这段程序的时候,
JAVA课程设计实习日志
20##年12月30日 星期三 天气有点冷
实习继续,今天的实习主要是完善界面为明天做报告奠定基础,对于完善,我做的是在插入页面中做了一个实现查询功能的按钮,这也是我昨天没有做出来的,而对于这段代码,我是参考别的同学的,因为我实在是静不下心继续写下去!不过在完成查询功能的时候,我在进一步完善界面时,我发现我没有做注册界面,所以只有我一个人可以进入,这是一个缺点,于是为了比现在更好一点,所以我通过TextArea做了一个面板,把密码和用户名都放进去,而在登陆界面的时候,又用一句话提醒登陆者,到帮助界面看密码和用户名,这样就不会只有 一个人可以进入了……虽然这样做不是太完美,但是它却通过不一样的方式完善了这个界面,这也让我对做事情有了一个新的认识,那就是做事要懂得变通!!!
JAVA课程设计实习日志
20##年12月31日 星期四 天气有点冷
今天是实习的最后一天,本天的工作就是做报告和交报告。
对于这几天的实习,今天的报告也就是对自己这段时间的一个评价,也是对自己的一个考验。我觉得这段时间的实习对我来说还是非常有作用的,同时也希望系部能够多给一些这样的实习课程,在课堂上,我们往往学到的都是理论,或者是程序中的一个小板块,对于完成一个系统文件是不知道如何去组合的,通过本次的实习,我学会了不仅仅是做GUI组件,我还学会了对它们中的小组件实现功能,并且学会了通过调用来实现其功能。我觉得这是我这段时间在JAVA学习上最有成就的一件事,虽然编程序非常的累,但是看见结果,就会高兴的把疲惫抛到九霄云外去了!!!
对于本次实习的心的就是:
(一) 不管是在那里做什么事都要有团结协作的意识。
(二) 学什么都要为了方便自己而学,不能只是为了考试而学。
(三) 做事学会思考和变通,重要的是一定要有自己的想法.
(四) 要多培养自己的自学能力。
报告人:张
日期:20##年12月31日
攀枝花学院
学生课程设计(论文)
题 目: 聊天程序 学生姓名: 学 号:
所在院(系): 计算机学院 专 业:
班 级:
指 导 教 师: 职称: 讲师
20xx年 12 月 16 日
攀枝花学院教务处制
攀枝花学院本科学生课程设计任务书
注:任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表
摘 要
21世纪是一个信息时代,伴随着计算机网络的迅速发展,人们的生活以及工作也产生了巨大的变化,人们之间越来越趋于通过网络来交流和传递信息。而聊天系统正式当前人们使用最多的中介。在这个平台上,许多认识或不认识的人们彼此间能够随意的相互交流。因此,开发和架构这种平台符合时代发展的需要。
本系统在开发中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法
关键词 服务器端,客户端,连接
目 录
摘 要??????????????????????????????I
1 需求分析??????????????????????????1
1.1功能分析????????????????????????????1
1.2性能分析????????????????????????????2 2 总体设计 ???? ????????????????????????2
2.1 功能模块图???????????????????????????2
2.2数据库设计???????????????????????????3
2.2.1表结构设计?????????????????????????3 3 详细设计及实现????????????????????????? 4
3.1界面设计????????????????????????????4
3.1.1登陆界面??????????????????????????4
3.1.2 注册界面??????????????????????????4
3.1.3 主界面???????????????????????????5
3.2 数据输入输出设计????????????????????????6
3.2.1 数据输入??????????????????????????6
3.2.1.1登陆界面的输入要求???????????????????6
3.2.1.2 注册界面的输入?????????????????????6
3.2.2数据输出???????????????????????????6
3.3 代码实现????????????????????????????6
3.3.1 服务器端设计????????????????????????6
3.3.1.1连接池的设计??????????????????????6
3.3.1.2 服务器监听线程的设计??????????????????7
3.3.2 传递包的设计????????????????????????7
3.3.3 聊天客户端设计???????????????????????8
3.3.4 接收服务器端的设计?????????????????????10 结论?????????????????????????????????15 参考文献???????????????????????????????16
1 需求分析
1.1功能分析
本系统要实现的功能如下:
1)注册
服务器收到用户的注册请求,客户的呢称,性别,籍贯,个人资料等,接受完毕后,便通过便开始接受客户传递的信息,然后向数据库添加记录,如果成功,便向客户返回其号码。客户收到服务器返回的信息后,便打开主登陆窗口。
2)登陆
在客户端,用户输入其号码和密码,然后建立与服务器的连接,告诉服务器我要登录,服务器收到后,开始通过JdbcOdbc读取数据库,然后与用户输入的信息比较,如果成功,便打开主程序窗口。
3)私聊
私聊就是两个聊天。客户端首先发送消息到服务器端,服务器端根据发送人信息和接收者信息来转发。如果是未建立对话窗口,就询问是否建立对话,否则就丢弃信息。
4)群聊
群聊,就是多人一起聊天。过程与私聊差不多。唯一的不同就是服务器会将信息转发给指定群的所有成员。
5)创建分组
用户注册以后默认的好友分组只有一个。用户在执行添加分组操作以后,客户端分将一个这个动作的信息发送给服务器端(主要是FromClientlisten)。服务器端的fromClientListen接收到这个请求,会进行数据库操作,将要添加的分组信息插入到数据库中。如果成功,则返回这个分组的信息给客户端,否则返回错误提示信息。
6)创建群
用户注册以后群个数为0。用户在执行添加群操作以后,客户端分将一个这个动作的信息发送给服务器端(主要是FromClientlisten)。服务器端的fromClientListen接收到这个请求,会进行数据库操作,将要添加的群信息插入到数据库中。如果成功,则返回这个群的信息给客户端,否则返回错误提示信息。
7)查找好友并加为好友
输入要查找的用户ID号,客户端发送一个查询信息给服务器端,如果找到 1
就返回用户服务信息。打开一个用户信息显示界面,该界面会提供一个“添加为好友”按钮,点击后可将此人加为好友。如果未找到,弹出一个信息提示框。
8)查找群并加入群
输入要查找的群ID号,客户端发送一个查询信息给服务器端,如果找到就返回用户服务信息。打开一个群信息显示界面,该界面会提供一个“加入此群”按钮,点击后可将此人加为好友。如果未找到,则弹出一个信息提示框。
1.2性能分析
本系统由于采用免费的oracle数据库软件,连接数最多不能超过200,所以并发访问数据库的人数不能超过200人。
2 总体设计
2.1功能模块图
本系统主要由由聊天系统构成。
图2.1系统功能模块图
聊天子系统的功能有:1)注册;2)登陆;3)添加群;4)查找群5)私聊;
6)群聊;7)查看好友资料;8)查找好友;9)添加好友;10)创建好友分组。 2
2.2数据库设计
2.2.1表结构设计
表2.1 客户信息表(qquser)
表2.2 Qq消息表(QQMessage)
表2.3 用户分组表(qqpersongroup)
以上各表创建的代码如下: 1)创建用户表
create table qquser( number primary key, account number unique, nickname varchar(100), sign varchar(500),
3
sex varchar(10),
email varchar(100),
head varchar(200));
2)创建消息表
create table qqmessage(
id number primary key,
account_from number,
account_to number,
content varchar(1000));
3)创建分组表
create table qqperson_Group(
id number primary key,
userid references qquser(id),
name varchar(100));
3 详细设计及实现
3.1界面设计
3.1.1登陆界面
本界面需要填写的有两个,一个是用户账号,另一个是用户密码。在客户端,用户输入其号码和密码,然后建立与服务器的连接,告诉服务器我要登录,服务器收到后,开始通过Jdbc方式读取数据库,然后与用户输入的信息比较,否则返回错误,如果客户收到成功信息就打开主窗口,否则提示出错。如果成功,便打开主程序窗口。然后客户向服务器请求读取好友名单,服务器收到该请求,开始读取数据库中的friend表,得到好友的号码后,再在好友表中读取好友资料,然后向客户端发送这些信息,客户收到后就在主窗口显示好友,并且建立几个Vector用以存储好友的信息。
图3.1 登陆界面图
3.1.2注册界面
本界面要填写的项目包括:用户昵称,密码,邮件地址,个性签名。
需要选择的项目包括:性别,头像。
4
本界面主要负责将用户的信息包装成一个QQUserClass对象。注册按钮一旦被点击,就会试图创建一个与服务器端的连接。连接创建成功就会将填写的信息发送到服务器端。如果服务器写入数据库成功,就回返回一个账号。使用这个账号,用户可以登陆到系统中。
图3.2注册界面图
3.2.3主界面
主界面是系统的核心部分。它可以列出所有好友和客户所有加入的群,也可以提供共享文件和文件下载功能。如果用户服务双击好友分组或群,好友列表或群成员列表将会显示出来。双击一个好友,可以与他进行私聊。双击一个群成员,可以与群里的所有成员对话。本界面还提供了以下右键菜单:添加好友分组、查找好友并加为好友、查找群并加为群、创建群、移动好友到其它分组、查看好友资料、查看群资料。
图3.3主界面图
5
3.2数据输入输出设计
3.2.1数据输入
3.2.1.1登陆界面数据的输入要求
Number(账号)输入的必须是整型,它是一个用户登陆的账号。Password(密码)可以是你设置好的字符串,字符串内容可以随便,如果用户设置不正确,将会导致登陆不成功,系统会弹出相应的对话框。
3.2.1.2注册界面的输入
Nickname(昵称),password(密码),sign(个性签名)可以是任意的字符串。Email必须是Email地址格式,也就是中间必须含有“@”,否则提示输入不正确。
3.2.2 数据输出
用户注册的信息必须写入数据库中。 下载的文件存放到的指定的目录中,如果未指定就存放到默认路径中,当默认路径不存在的时候给提示用户路径不存在。
3.3 代码实现
3.3.1服务器端设计
3.3.1.1 连接池的设计
连接池,就是生产一定数量的数据库连接存储在一个容器中,等待程序来索取,当这个容器器中的数据库连接全部被使用完的时候,就立即再产生指定数量的数据库连接。这样做的优点就是可以充分利用资源,减少创建和关闭所带来的资源消耗。在程序中它是以一个集合来存储这些连接的。如果访问的程序过多,而连接又少,连接池可以迅速增加多个连接以供程序需求。如果连接需求量超出连接池所设定的最高值。连接池将不理会程序的请求。
连接池主要由以下几个类创建:
(1)poolSet.properties 该文件的内容如下: poolname=QQPool user=root password=root url=jdbc:mysql://127.0.0.1:3306/javaqq driver=org.gjt.mm.mysql.Driver minconn=5 reuse=20 6
maxconn=1000 logfile=c:/QQPool.log 第一行声明要创建的数据库连接池的名字。第二行是访问数据库的用户名。第三行是访问数据库的密码。第四行是访问(mysql)数据库的url。第五行是声明驱动程序所在的类全名。第六行设定了数据库连接池中最少应保持的连接数。第七行设定了一个连接(Connection)最多可重复使用的次数。第八行设定了连接池是最多创建的连接数。第九行声明了一个日志文件(该日志文件记录的是数据库连接方面的信息)存放的路径。
(2)GetPoolSet.java,本程序的主要功能是获取上一配置文件中的信息,并将获得的信息返回给其他程序。由于代码过多,本文并不列出源代码只以表格的形式说明各方法的作用。
3.3.1.2 服务器端监听线程的设计
服务器在监听到一个客户以后,它就会创建一个线程去管理这个客户。至于如何去管理这个客户,服务器端不做任何干涉,完全由监听线程决定。 监听线程主要对客户端的请求进行响应,做到有求必应。接收到信息后,首先判断该信息是哪种类型,如果是要访问数据库服务器,则直接根据发送信息内容操作数据库。如果是聊天内容,服务器会将该信息再次转发到目的地。这些判断将会全放部在一个线程的run方法中。
3.3.2传递包的设计
由于请求的服务不同,包的类型应该所区别。所以在设计的时候,应该在包中加一个存储包类型的属性并提供设置和获取这个属性的方法。以下就是对包抽象出来的应该有的方法,所有要传输的方法必须实现以下接口中的方法: package javaqq.datagram;
import java.io.Serializable;
public interface DatagramPacket extends Serializable
{
7 // define class number for the packet which need to send to others public static final int MESSAGESHOW_PIC_PERSONAL = 1; public static final int MESSAGESHOW_PHOTO = 2; public static final int MESSAGESHOW_WORD_PERSONAL = 3; public static final int MESSAGESHOW_WORD_GROUP = 4; public static final int MESSAGESHOW_PIC_GROUP = 5;
} // define class number for the packet which not need to send to others public static final int DATABASEHANDLE_FIND = 11; public static final int DATABASEHANDLE_DEAL = 12; public static final int DATABASEHANDLE_RESULT = 13; public static final int DATABASEHANDLE_FLAG = 14; public static final int USER_INFO = 21; public static final int USER_LOGIN = 22; public static final int USER_REGISTER = 23; public static final int USER_REGISTERINFO = 24; //find infomation public static final int FIND_USER=31; public static final int RETURN_USERINFO=32; public static final int FIND_GROUP=33; public static final int RETURN_GROUPINFO=34; public static final int JOIN_GROUP=35; public static final int RETURN_GROUPMEMBERS=36; // system information public static final int SYSTEM_INFO = 91; public static final int SYSTEM_ON_OR_OFFLINE = 92; public int getType(); public Object getData(); public long getFromuserid(); // if (getTouerid()==0),then the datapacket will be sended to server public long getTouserid(); public String getTalkroomid();
服务器在接收包的时候,就调用它的getType()获得type的值,并采取相应的措施。
3.3.3聊天客户端设计
聊天窗口发送文件文字与图片的代码如下:
//发送文字
public void insertString(String s, SimpleAttributeSet attributset) 8
{
}
catch (BadLocationException e) {
}
//发送图片 public void insertIcon(String str) { String picurl = TalkFrame.class.getResource("pic").getPath() { }
catch (Exception e)
{
// TODO Auto-generated catch block e.printStackTrace(); ImageIcon icon = new ImageIcon(picurl + str); showText.setCaretPosition(doc.getLength()); showText.insertIcon(icon); doc.insertString(doc.getLength(), "\n", null); showScroll.getVerticalScrollBar().setValue( showScroll.getVerticalScrollBar().getMaximum()); + File.separator; try } e.printStackTrace(); Try { doc.insertString(doc.getLength(), s, attributset); doc.insertString(doc.getLength(), "\n", null); showScroll.getVerticalScrollBar().setValue( showScroll.getVerticalScrollBar().getMaximum()+20); showText.setCaretPosition(showText.getDocument().getLength()); 9
}
}
3.3.4服务器端的设计
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ChatServer extends JFrame {
private JTextField inputBox;
private JTextArea outFrame;
private ObjectOutputStream outputS;
private ObjectInputStream inputS;
private ServerSocket toserver;
private Socket connection;
private int counter = 1;
public ChatServer()
{
super( "Server" );
Container container = getContentPane();
inputBox = new JTextField();
inputBox.setEnabled( false );
//输出
inputBox.addActionListener(
//监听
new ActionListener() {
// 发送信息
public void actionPerformed( ActionEvent event ) {
sendMsg( event.getActionCommand() );
}
}
);
container.add( inputBox, BorderLayout.NORTH );
10
// 输出框
outFrame = new JTextArea();
container.add( new JScrollPane( outFrame ),
BorderLayout.CENTER );
setSize( 280, 160 );
setVisible( true );
}
// 处理连接
public void connectServer()
{
try {
// 创建一个ServerSocket.
toserver = new ServerSocket( 4000, 100 );
while ( true ) {
// 等待连接
wait4Connection();
// 获取输入输出流
getStreams();
// 处理连接
processConnection();
// 关闭连接
closeConnection();
++counter;
}
}
catch ( EOFException eofException ) {
System.out.println( "Client terminated connection" ); }
//捕获异常
catch ( IOException ioException ) {
ioException.printStackTrace();
}
}
private void wait4Connection() throws IOException
11
{
outFrame.setText( "等待连接??\n" );
connection = toserver.accept();
outFrame.append( "Connection " + counter +
"from: " +
connection.getInetAddress().getHostName()
);
}
private void getStreams() throws IOException {
// 设置输出流
outputS = new ObjectOutputStream(
connection.getOutputStream()
);
outputS.flush();
// 设置输入流
inputS = new ObjectInputStream(
connection.getInputStream()
);
outFrame.append( "\nGet I/O streams\n" );
}
//处理客户端连接
private void processConnection() throws IOException {
// 连接成功
String message = "服务器端>> 连接成功";
outputS.writeObject( message );
outputS.flush();
// 输入框
inputBox.setEnabled( true );
// 处理来自客户端的信息
do {
// 读取消息
try {
12
message = ( String ) inputS.readObject();
outFrame.append( "\n" + message );
outFrame.setCaretPosition(
outFrame.getText().length()
);
}
catch ( ClassNotFoundException classNotFoundException ) { outFrame.append( "\nUnknown object type received" ); }
} while ( !message.equals( "客户端>> TERMINATE" ) ); }
// 关闭socket
private void closeConnection() throws IOException
{
outFrame.append( "\nUser terminated connection" ); inputBox.setEnabled( false );
outputS.close();
inputS.close();
connection.close();
}
// 向客户端发送消息
private void sendMsg( String message )
{
try {
outputS.writeObject( "服务器端>> " + message );
outputS.flush();
outFrame.append( "\n服务器端>>" + message );
}
catch ( IOException ioException ) {
outFrame.append( "\nError writing object" );
}
}
// main()方法
public static void main( String args[] )
13
{
ChatServer process = new ChatServer(); process.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
process.connectServer();
}
} // end class ChatServer
14
结 论
五天的课程设计终于落下帷幕,这次的课程设计的题目是聊天程序,我对聊天并不陌生,但是对聊天程序还是比较生疏。很多东西都不懂,比如界面的设计,还有聊天程序的实现。这次我使用开发语言是java,在这当中也用到了UML和软件工程的一些内容,主要是系统功能模块图的设计,还有构建c/s结构等。用java开发GUI系统,比较麻烦的一点在于界面的设计。主要包括两个方面:组件不能随意设置背景图片、布局比较困难。目前有的工具(如netbeans,JBuilder)在这这布局方面可能比较好,但是手动更改代码非常不方便。关于背景的设置就更不好解决,设置颜色还可以办到,要想设置背景图片,那就得自己去重写某个类了。还有其他的一些方面,我也没有做得很好。但是通过这次的课程设计,让我把平时学到的java知识和实际联系起来,这样还是很有意义的。在今后的学习中,我会更加努力。
15
参 考 文 献
[1] 陆维厅,邵燕.基于JAVA的SOCKET实现网上交谈.河海常州分校学报,2005,
3(14):31~35.
[2] 戴歆.JAVA Swing程序开发.软件导刊,2007,2(6):22~29.
[3] 莫足琴.基于Java Socket多客户端并发通信聊天程序的设计与实现.十堰职业技术学博
士论文,2008:253~255.
[4] 王静,曲凤娟.基于Socket的多用户并发通信的设计[J].福建电脑,2007(3):164.
[5] 赵文清,姜波.基于Socket的Java语言网络通讯机制和程序设计.信息技术,2006,
8(7):66~67.
[6] 温涛.工程概念.软件工程师,2006(1):16~18
[7] 朗波.JAVA语言程序设计.清华大学出版社,2005:189~190.
[8] 曹健.计算机软件发展.IT时代周刊,2005(2):12~15
[9] 周燕飞,左敦稳,李亮.数据库原理与应用.北京:机械工业出版社,2003:78~89
[10] 张景中.应用计算机.计算机应用,2008(1):23~28
[11] Ian Somerville. Software engineering.北京:机械工业出版社,2004:73~84.
16
河南机电高等专科学校学生课程设计报告实验课程名称Java程序设计开课实验室实验楼308机房系、部计科系年级11专业班软件技术学生姓…
Java语言程序设计综合实验报告系别计算机科学与技术系学科专业信息管理与信息系统课题题目qq聊天系统人员及分工白娟20xx1006…
Java课程设计报告课目计算器学院基础学院班级光信息20xx1学生指导教师丁振凡张晓瑞辅导教师江宇完成时间20xx年7月1日课程设…
河北科技大学课程设计报告学生姓名祝冬冬学号专业班级计算机科学与技术课程名称学年学期指导教师2011年6月课程设计成绩评定表目录示例…
软件学院课程设计报告书课程名称设计题目专业班级学号姓名指导教师年月目录JAVA日历设计31设计目标32设计要求33制作要点34设计…
中南大学本科生课程设计(实践)任务书、设计报告(SQL数据库程序设计)题目学生姓名指导教师学院专业班级学生学号网吧会员管理系统戴云…
中南大学本科生课程设计(实践)任务书、设计报告(大学计算机基础)题目时间旅行学生姓名龙辰指导教师刘光瑜学院化学化工学院高级工程人才…
中南大学本科生课程设计(实践)任务书、设计报告(大学计算机基础)题目学生姓名指导教师学院专业班级学生学号课程设计实践报告计算机基础…
XXX学院实习报告系别年级专业(班级)学号姓名实习类别专业课程设计指导教师实习期间教务部XXXX年制专业课程设计周小结为期一周的专…
平面设计公司实习报告经过了在大学里三年的理论学习,我们对平面设计有了一些基本掌握,对于平面设计这个专业也有了一个系统的学习和掌握。…
河北科技师范学院欧美学院实习类型教学实习实习单位河北科技师范学院欧美学院实习起止时间年月年日指导教师刘正林所在院(系)信息技术系专…