版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南京信息职业技术学院·计算机与软件学院·移动应用开发JAVA综合实训报告PAGE20实训报告(2010/2011学年第一学期)实习名称JAVA综合实训班级90916P29姓名刘潮指导老师初耀军日期2010年1月3日目录第一章需求分析 31.1服务器端需求分析 31.2客户端需求分析 4第二章设计重点 82.1设计思路 82.2具体设计 82.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-51.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();final JTextFieldliuchaosystemmeg=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类,让其继承ThreadpublicclassServerListenThreadextendsThread{}②为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中应该包含如下函数:①线程的运行方法runpublicvoidrun(){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添加聊天用户接收线程类ClientReceiveThreadPublicclassClientReceiveThreadextendsThread{}在用户接收线程类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添加聊天用户接收线程类ClientReceiveThreadpublicclassClientReceiveThreadextendsThread{}在用户接收线程类ClientReceiveThread中应该包含如下函数:线程的运行方法runpublicvoidrun(){recevThread();}接收线程的函数recevThread。接收消息的方法recevMsg,能够接收用户名,表情,聊天对象,接收信息的发送日期。增加对于聊天消息的判断。只给出了部分代码。publicvoidrecevThread(){//若套接字没有关闭,则�??直执行循环体while(!isStop&&!clientSocket.isClosed()){try{StringmegType=(String)receiveMeg.readObject();if(megType.equalsIgnoreCase("系统信息")){//处理系统信息StringsystemMeg=(String)receiveMeg.readObject();textPaneUp.setText(textPaneUp.getText()+"[系统信息]"+systemMeg);}elseif(megType.equalsIgnoreCase("服务器关闭")){clientSocket.close();textPaneUp.setText(textPaneUp+"股务器已经关闭!!!"+"\n");break;}elseif(megType.equalsIgnoreCase("聊天信息")){//接受聊天信息 }}(3)为“登陆”按钮添加监听事件,当用户点击“登陆”按钮后,用户能够登陆服务器。该函数的实现与管理员客户端和会员客户端的“登陆”按钮实现有一线不同,但是也没有太大的区别,既然用户以过客的身份登陆服务器聊天,服务器端既不知道用户的姓名也没有用户的相关资料,所以服务器只能通过获取用户所用机器的IP地址来通知其他用户,该过客已经上线聊天了。其代码实现如下:login.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ InetAddressguestIP=null; try{ connect("localhost",6544); dataOut.writeObject("过客"+guestIP.getHostAddress().toString()); dataOut.flush(); liuchaologin.setEnabled(false); liuchaosend.setEnabled(true); }catch(IOExceptionex){ ex.toString(); } } });(4)为“发送”信息按钮添加监听事件,当用户点击按钮后用户可以向其他用户发送聊天信息。它通过调用sendMessage()函数就可以向所有在线用户发送聊天消息。(5)为“离线”按钮添加监听事件,用户点击此按钮后立即离开,但是他并没有关闭对话框,只要他点击登陆按钮就可以上线。用户离线后,其“登陆”按钮和“退出”按钮的状态就应该为真,而“离线”按钮和“发送”按钮的状态就应该为假。(6)为“退出”按钮添加监听事件,当用户点击“退出”按钮后,立刻释放占用的系统资源,与离线不同的是,此时用户已经关闭对话框,用户要想重新登陆就必须再运行一次程序。它主要就是监听客户端套接字,如果套接字已经关闭,则立刻退出,如果套接字没有关闭,则发送用户下线消息。 2.2.10用户登陆类和函数(1)为登陆界面添加登陆类UserLogin.publicclassUserLoginextendsJFrameimplementsActionListener{}(2)为“确定”和“退出”按钮添加事件监听器,“确定”按钮的监听事件主要是先从文本框中取得用户输入的用户名赋值给一个变量,然后再从密码框中取得用户输入的码再赋值给另一个变量。创建一个UserLogining对象,将获得的密码和用户名通过isLogin函数赋值给该变量,如果判断为真则关闭当前登录窗口允许用户接入服务器,否则弹出对话框,提示用户用户名错误或密码错误。(3)为登陆界面添加程序启动画面类StartSplash,当用户输入的密码和用户名都正确时并且以会员的身份登陆服务器,点击确定按钮后会弹出启动画面,显示进度,以提示会员此时正在登录中,请不要着急。申明的全局变量如下所示:ThreadsplashThread=null;privateImageIconliuchaoicon;JLabelliuchaopicture=newJLabel();FinalJpanelliuchaopanel=newJpanel();(4)为登陆界面添加UserLogining类,该类用来向服务器端发送用户输入的用户名和密码,接收服务器端传来的验证结果。为UserLogining添加函数isLogin如下,该函数向服务器端发送用户名和密码,接收返回的验证结果,验证通过返回true,失败返回false。部分代码如下:publicclassUserLogining{
publicbooleanisLogin(StringuserName,Stringpassword){if(userName.equals(“user”)){returntrue;}else{returnfalse;}}}2.3问题解决2.3.1遇到的问题在设计过程中我遇到的问题如下:(1)数据库创建过程中添加表不会添加(2)数据库连接老不成功,对数据源的创建和驱动程序的加载比较陌生。(3)对于界面布局设计器里的控件不是很熟悉,需要参照老师给的材料才能做。(4)线程的使用感觉很陌生,不知道何时该创建线程,该创建什么样的线程,在什么地方调用该线程。(5)在聊天过程中如何使用户可以发送图片和表情,我还没有实现。2.3.2解决问题的办法(1)将以前学习过的与Java相关的资料再复习一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 林业种植合同
- 污水处理厂引孔施工合同
- 机械制造博士工程师聘用协议
- 产教融合与终身教育体系构建策略
- 2023铁路客运规章制度5篇
- 2023年注册土木工程师(水利水电)考试资料(线上试题及答案)
- 人员受伤的应急演练方案
- 泉州华光职业学院《解析几何》2023-2024学年第一学期期末试卷
- 内外架出租合同范例
- 家庭防盗:采取必要措施保护家庭免受盗窃
- 九年级上册数学知识点考点
- 研究开发费用加计扣除的鉴证报告记录要求
- 五金材料进货清单表
- 教学管理系统业务流程图
- 战略规划模板STRATEGICPLANTEMPLAT2E
- 幼儿园教育如何做到寓教育于一日生活之中
- 《药用植物学》课程标准
- 建筑施工企业职业病危害防治技术规范(完整版)
- 政法系统诗朗诵
- 高尔基《我的大学》
- 化工有限公司生产安全事故应急预案
评论
0/150
提交评论