JAVA综合实训报告.docx

上传人:b****6 文档编号:4690202 上传时间:2022-12-07 格式:DOCX 页数:18 大小:399.63KB
下载 相关 举报
JAVA综合实训报告.docx_第1页
第1页 / 共18页
JAVA综合实训报告.docx_第2页
第2页 / 共18页
JAVA综合实训报告.docx_第3页
第3页 / 共18页
JAVA综合实训报告.docx_第4页
第4页 / 共18页
JAVA综合实训报告.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

JAVA综合实训报告.docx

《JAVA综合实训报告.docx》由会员分享,可在线阅读,更多相关《JAVA综合实训报告.docx(18页珍藏版)》请在冰豆网上搜索。

JAVA综合实训报告.docx

JAVA综合实训报告

 

实训报告

(2010/2011学年第一学期)

 

实习名称JAVA综合实训

班级90916P29

姓名刘潮

指导老师初耀军

日期2010年1月3日

 

目录

第一章需求分析3

1.1服务器端需求分析3

1.2客户端需求分析4

第二章设计重点8

2.1设计思路8

2.2具体设计8

2.3问题解决20

第三章测试21

第四章期望与体会23

参考资料23

 

第一章需求分析

1.1服务器端需求分析

当运行服务器端程序时服务器的界面,如图1-1所示:

图1-1

当点击“启动服务”按钮后服务器的界面如图1-2所示,在JTextPane区域能够显示服务器已经正常启动的消息:

图1-2

当在“在此发送系统消息”区域输入信息并点击回车键时,在JTextPane区域能够显示发送的系统消息,如图1-3所示:

图1-3

当点击“停止服务”按钮后服务器的界面,在JTextPane区域能够显示服务器已经停止的消息,而且弹出对话框提示:

您已经关闭了侦听套接字!

如图1-4所示:

图1-4

点击“确定”按钮后如图1-5所示:

图1-5

1.2客户端需求分析

客户端客户登陆的界面,如图1-6所示:

图1-6

当用户输入用户名和密码并选择登陆方式后,点击“确定”按钮,如图1-7。

如果密码或用户名有错误时,将会弹出对话框提醒用户,如图1-8所示:

图1-7

图1-8

当过客点击登陆按钮后在服务器端将显示过客上线的消息,如图1-9所示

图1-9

当用户输入用户名和密码都正确时,点击以会员的方式登陆后,先出现的界面如图1-10所示,然后出现的是会员界面,如图1-11所示

图1-10

图1-11

选择管理员,如图1-12所示。

图1-12

确定后,见图1-13所示:

图1-13

我们可以在第一个文本区域内输入管理员的名称,也可以对第一个进行选择发送的对象,以及点击“悄悄话”单选框发送给自己的消息,我们选择生气的,输入管理员名称,如图1-14所示:

图1-14

第二章设计重点

2.1设计思路

(1)首先在服务器端应该有启动线程用来启动服务器,并且要有监听线程,只要有用户上线或发送聊天信息,在服务器端都应该能够看到。

在服务器端还应该有接收客户端消息的线程,此线程需要接受客户端发来的信息,并对该信息进行分析,执行相应的请求。

(2)在客户端应该有用户接收线程用于接收用户发送的消息,图片,表情。

(3)在客户端还应该有会员客户端类,供会员登陆聊天,并且有会员接收线程。

(4)对于服务器应该有管理员对其进行管理,所以应该有管理员客户端类,同样在管理员客户端也要有管理员接收线程,当管理员登陆时能够及时响应其请求。

(5)在过客类中应该有接收消息的进程用来接收服务器端发来的消息。

2.2具体设计

第一步创建数据库

创建数据库,创建一张member表,包含两个字段username和password,并且这两个字段都不能为空,创建一张Admin表,也包含两个字段username和password,并且这两个字段也都不能为空,分别为表添加几条记录,代表不同用户。

启动Access2003,新建空数据库表,命名为java,选择“使用设计器创建表”然后在表里添加username和password字段,添加几条记录。

最后保存表。

打开“控制面板”打开“管理工具”,然后选择“数据源(ODBC)”,在弹出的对话框中选择“添加”然后选择“DriverdoMicrosoftAccess(*mdb)”点击完成按钮。

在对话框中输入数据源名称“liuchao”,然后选择数据库,选中刚刚在Access2003中新建的表,确定。

第二步界面的搭建

2.2.1服务器端界面设计

需要的基本控件如下:

finalJScrollPaneliuchaotscroll=newJScrollPane();

finalJPanelpanel=newJPanel();

finalJTextPaneliuchaotextPane=newJTextPane();

finalJTextFieldliuchaosystemmeg=newJTextField();

finalJButtonliuchaostopserver=newJButton();

finalJButtonliuchaostartserver=newJButton();

2.2.2管理员客户端界面设计

其基本布局需要的控件如下:

finalJButtonliuchaomessageNote=newJButton();

finalJButtonliuchaologin=newJButton();

finalJButtonliuchaosendMeg=newJButton();

finalJButtonliuchaologout=newJButton();

finalJButtonliuchaoexit=newJButton();

finalJButtonliuchaohideNote=newJButton();

finalJTextPaneliuchaoreceiveMeg=newJTextPane();

finalJCheckBoxliuchaostatusCheckBox=newJCheckBox();

finalJScrollPaneliuchaosendMegScrollPane=newJScrollPane();

finalJPanelliuchaootherPane=newJPanel();

finalJSplitPanesplitPane=newJSplitPane();

finalJScrollPanejTreeScrollPane=newJScrollPane();

finalJScrollPanereceiveMegScrollPane=newJScrollPane();

2.2.3会员客户端界面设计

其基本布局需要的控件如下:

finalJButtonliuchaohideLogin=newJButton();

finalJButtonliuchaosendMeg=newJButton();

finalJButtonliuchaologout=newJButton();

finalJButtonliuchaoexit=newJButton();

finalJButtonliuchaomessageNote=newJButton();

finalJButtonliuchaohideNote=newJButton();

finalJCheckBoxliuchaostatusCheckBox=newJCheckBox();

finalJScrollPaneliuchaosendMegScrollPane=newJScrollPane();

finalJScrollPanereceiveMegScrollPane=newJScrollPane();

2.2.4过客类界面设计

其基本布局需要的控件如下:

finalJComboBoxliuchaouserOnlineList=newJComboBox();

finalJComboBoxliuchaoactionList=newJComboBox();

finalJButtonliuchaologout=newJButton();

finalJPanelliuchaootherPane=newJPanel();

finalJScrollPaneliuchaoreceiveMegScrollPane=newJScrollPane();

2.2.5用户登录界面设计

其基本布局需要的控件如下:

finalJButtonliuchaologinButton=newJButton();

finalJButtonliuchaoexitButton=newJButton();

finalJRadioButtonloginStyle=newJRadioButton();

finalJLabelliuchaoUnLabel=newJLabel();

finalJLabelliuchaopwLabel=newJLabel();

第三步添加类和函数

2.2.6服务器端的类和函数

(1)创建用户信息类SingleUserMegData

在server包下创建SingleUserMegData类,此类用来描述单个用户的信息,包括:

用户名,套接字,输入流输出流等。

服务端每次接受一个用户成功登陆,便会为这个用户窗口一个SingleUserMegData对象,其中存储该用户的信息。

并把所有用户的SingleUserMegData对象组成一个列表,作为查询的依据。

类包括下面5个成员变量,以及它们的get和set方法,用于存取这些变量:

publicclassliuchaoSingleUserMegData{

StringuserName,msg;

Socketsocket=null;

ObjectInputStreamdataIn=null;

SingleUserMegDatanextID=null;}

(2)创建类MyTextPane继承于JTextPanel,为其添加文本方法append,它的功能是取文档共享的默认AttributeContext,将该属性添加到给定的集合中属性,并返回新的有代表性的集合。

将滚动条自动拉到JTextArea最底端,将属性应用于字符内容。

再用给定字符串所表示的新内容替换当前选定的内容。

为其添加方法append,其功能为将滚动条自动拉到JTextArea最底端,将属性应用于字符内容。

再用给定字符串所表示的新内容替换当前选定的内容。

(3)用户信息链表类UserInfoList,用户信息链表类要实现对用户信息的添加删除和查询的功能,如果用户离开了,就将存储在服务器端的用户信息删除,同时如果有用户上线,也能够在服务器端添加用户信息。

户信息链表类的查找功能可以分为按名字查找和单用户信息数据查找。

用户信息链表类声明的全局量:

privateSingleUserMegDataroot,rootID;

privateSingleUserMegDatapointer;

privateintuserCount;

构造方法UserInfoList算法:

用空参数创建SingleUserMegData,赋值给root;

用空参数创建SingleUserMegData,赋值给rootID;

使root的next为空;使rootID的nextID为空;使pointer为空;

(4)接收客户端信息类ServerReceiveThread

(5)服务器侦听类ServerListenThread类的实现。

①在server包下创建ServerListenThread类,让其继承Thread

publicclassServerListenThreadextendsThread{}

②为ServerListenThread类添加函数startListen。

③为ServerListenThread类添加发送数据方法sendObject

④为ServerListenThread类添加run函数如下

publicvoidrun(){

startListen();}

该类用来验证客户端传来的用户名和密码是否在服务器端的数据库中存在,如果存在表示为合法用户,准予登陆;如果不存在,表示无此用户,不准登陆。

如果是合法用户登录,还要将该用户的信息对象SingleUserMegData加入列表userInfoList中,同时在服务器界面的下拉框中增加该用户的名字。

2.2.7管理员客户端的类和函数

(1)为管理员客户端添加界面布局IMPanelAdminClient类。

①为“登陆”按钮添加事件监听器,当用户点击“登陆”按钮后,立刻连接服务器并到指定的端口,然后设置“登陆”按钮的状态为假,即此刻如果用户没有下线就不能使用此按钮,设置“发送”按钮、“离线”按钮和“退出”按钮的状态为真,即用户可以使用这三个按钮。

②为IMPanelAdminClient类添加连接到服务器的方法connect。

首先获取服务器的IP地址和端口号然后建立客户端套接字并获取套接字的数据输出流和数据输入流。

创建一个新的客户接收线程并利用参(clientSocket,dataOut,dataIn,receiveMeg,userOnlineList,getSendMeg(),geminate(),getSendMegTextField())向该线程发送数据。

然后启动该监听线程。

③为“发送”按钮添加事件监听器

算法:

设置sendMeg的侦听,并侦听:

{如果clientSocket为空,返回;

如果clientSocket.isClosed()为假,则:

{设置各个按钮的状态:

调用sendMessage函数,向所有用户发送消息;

设定sendMegTextField为空;

}否则{返回}}

④为“退出”按钮添加事件监听器,如果侦听到套接字已经关闭,直接退出。

如果套接字没有关闭或者服务器没有关闭,说明用户已经下线。

(2)为管理员客户端添加接收线程的AdminClientReceiveThread类

publicclassAdminClientReceiveThreadextendsThread{}

在管理员接收线程类AdminClientReceiveThread中应该包含如下函数:

①线程的运行方法run

publicvoidrun(){recevThread();}

接收线程的函数recevThread。

主要用来读取服务器发送过来的聊天消息并处理。

具体实现代码如下:

publicvoidrecevThread(){

while(!

isStop&&!

liuchaoclientSocket.isClosed()){

try{//读取服务器发送过来的聊天信息

StringmegType=(String)dataIn.readObject();

if(megType.equalsIgnoreCase("系统信息")){//处理系统信息StringsystemMeg=(String)dataIn.readObject();

liuchaoreceiveMeg.setText("[系统信息]");

liuchaoreceiveMeg.setText(systemMeg);

mn.liuchaogetMegNote().setText("[系统消息]"+systemMeg);

//自动下滚

receiveMeg.setCaretPosition(liuchaoreceiveMeg.getDocument().getLength());}

(3)为管理员客户端添加聊天记录类MessageNote,方便管理员观看自己的聊天记录,由自己决定是否保存聊天记录。

①为“清除”按钮添加事件监听器

clear.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

如果clear为空null,则clear为JButton();设置clear的文本为clear;为clear添加侦听,点击clear,geminate()的文本设置为空字符串;}});

2.2.8会员客户端的类和函数

(1)为会员客户端添加界面布局IMPanelClient类。

(2)当会员关闭聊天窗口时在服务器端应该断开与会员的连接,释放其占有的资源,因此需要为IMPanelClient类添加窗口关闭事件,保证窗口关闭时,关闭和服务器端的连接。

(3)为Client添加聊天用户接收线程类ClientReceiveThread

PublicclassClientReceiveThreadextendsThread{}

在用户接收线程类ClientReceiveThread中应该包含如下函数:

接收消息的方法recevMsg,能够接收用户名,表情,聊天对象,接收信息的发送日期。

增加对于聊天消息的判断。

if(megType.equalsIgnoreCase("聊天信息")){接收消息显示在文本区域中}

elseif(megType.equalsIgnoreCase("用户列表")){已实现}

(4)为IMPanelClient类添加连接到服务器的方法connect,其算法和管理员客户端的connect方法类似。

(5)会员的聊天信息应该由会员自己选择是否保存,因此需要为会员客户端添加MessageNote类,在该类中应该包含两个按钮“保存”和“清除”,其按钮的监听事件和管理员客户端的一样。

(6)为“登陆”按钮添加监听事件,当用户点击“登陆”按钮后,用户能够登陆服务器。

login.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEventarg0){

try{调用connect函数登陆到指定的服务器并定位到指定的端口号,

设定各个按钮的状态;使聊天记录为可见;

}catch(IOExceptione1)

{e1.printStackTrace();}

}});

(7)为“发送”信息按钮添加监听事件,当用户点击按钮后用户可以向其他用户发送聊天信息。

该按钮的功能和管理员客户端的类似。

(8)为IMPanelClient类添加接收消息方法receiveMeg,当其他用户发送聊天消息或管理员发送系统消息时在TextPanel区域可以显示。

该函数返回的参数类型是MyTextPane类型如果(receiveMeg==null)为真,就创建空参数MyTextPane,并赋值给receiveMeg;然后利用setCursor为receiveMeg设置鼠标形状(newCursor(Cursor.TEXT_CURSOR))并侦听鼠标,对鼠标的每一个动作都能响应,例如:

鼠标单击,鼠标按下,鼠标释放,鼠标进入,鼠标退出。

(9)为“隐身登陆“按钮添加监听事件,用户不想让其他人看到自己在线时点击此按钮,但是他并没有离线,而是隐藏起来,他仍然占用系统资源。

hideLogin.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEventarg0){

try{

获取隐藏登录帐号赋值给整型量count,初始化随机函数;

连接到connect("服务器的IP",服务器的端口号);

利用writeObject为dataOut输出("匿名用户"+count);

利用flush刷新dataOut;

"匿名用户"+count赋值给yourHideLoginName;

利用setEnabled使hideNote使能为真;

利用setEnabled使mn使能为真;

利用setText为userName设置文本为空字符串"";

以上出现异常,则

{显示JOptionPane.showMessageDialog(null,"匿名登陆失败!

","系统警告",JOptionPane.WARNING_MESSAGE);

}}}

(10)为“离线”按钮添加监听事件,用户点击此按钮后立即离开,但是他并没有关闭对话框,只要他点击登陆按钮就可以上线。

logout.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEventarg0){

if(liuchaoclientSocket==null){

return;

}

liuchaologin.setEnabled(true);

liuchaosendMeg.setEnabled(false);

liuchaoexit.setEnabled(true);

liuchaohideNote.setEnabled(false);

liuchaomessageNote.setEnabled(true);

liuchaomn.setVisible(false);

if(liuchaoclientSocket.isClosed()){

JOptionPane.showMessageDialog(null,"客户端套接字已经关闭!

"+"请退出",

"系统警告",JOptionPane.ERROR_MESSAGE);

liuchaoClientReceiveThread.isStop=true;

}elseif(!

liuchaoclientSocket.isClosed()){

try{

liuchaodataOut.writeObject("用户下线");

liuchaoClientReceiveThread.isStop=true;

liuchaouserOnlineList.removeAllItems();

}catch(IOExceptionex){

ex.printStackTrace();}}}});

2.2.9过客类和函数

(1)为过客添加界面布局IMGuestClient类。

(2)为Guest添加聊天用户接收线程类ClientReceiveThread

publicclassClientReceiveThreadextendsThread{}

在用户接收线程类ClientReceiveThread中应该包含如下函数:

1线程的运行方法run

publicvoidrun(){recevThread();}

2接收线程的函数recevThread。

接收消息的方法recevMsg,能够接收用户名,表情,聊天对象,接收信息的发送日期。

增加对于聊天消息的判断。

只给出了部分代码。

publicvoidrecevThread(){

//若套接字没有关闭,则�?

?

直执行循环体

while(!

isStop&&!

clientSocket.isClosed()){

try{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1