版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嘉兴学院Java综合实训报告PAGEPAGE23目录TOC\o"1-3"\p""\h\z\u1. 需求分析………………………12. 概要设计……………………….22.1功能图…………………..……..23. 详细设计………………………23.1 类关系图………………………23.2 类设计图………………………33.2.1、类client…………………33.2.2、类RTFSend…………………43.2.3、类RTFReceive……………43.2.4、类Server…………………53.2.5、类YeeKuMap………………53.2.6、类ServerThread…………63.2.8、类ClinetThread…………64. 主要程序实现………………….75. 测试与结果………………….165.1功能模块界面.……………….166. 心得体会…………………….22参考文献…………..23聊天小程序需求分析聊天工具大多数由客户端程序和服务器程序外加服务器端,本程序采用客服机/服务器架构模式。通过Java提供的Socket类来连接客户机和服务器并使客户机与服务器之间相互通信。由于聊天是多点对多点的而Java提供的多线程功能,用多线程可完成多点对多点的聊天。主要有两个应用程序,分别为服务器程序和客户端程序。服务器应用程序主要用于消息转发,以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天记录的显示和信息输入。采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。该聊天系统实现私聊,群聊,用户登陆,退出聊天系统等功能。本系统的主要功能有以下几个部分组成:服务器端模块:系统信息的输入:可以输入任何信息;功能:将系统信息广播至各个客户端;踢除用户:服务器可以选择性删除在线的用户;客户端模块:登陆服务器列出当前在线用户信息;私聊和多人聊天的选择;发言:对输入的数据进行发送;离开状态;概要设计2.1功能图图1.程序功能图详细设计类关系图图2:类关系图类设计图3.2.1、类client模块名称Client功能描述启动客户端系统接口与属性SERNER:intJfcPeoplrlistPskeyIn:stringFrame():voiduserName:stringFunction:启动客户端InPut:无OutPut:无Return:空publicClient()windowClosing(WindowEvente)mouseClicked(MouseEvente)InPut:OutPut:Return:voidcloseSocket()Function:退出时,关闭Socket3.2.2、类RTFSend模块名称RTFSend功能描述信息发送接口与属性BinBoutSocketSocketRun():void3.2.3、类RTFReceive模块名称RTFReceive功能描述信息接收接口与属性voidrun()Function:运行多线程InPut:无OutPut:无Return:空3.2.4、类Server模块名称server功能描述启动服务器端接口与属性voidmain(Stringargs[])Function:启动服务器端InPut:无OutPut:无Return:空server()Function:InPut:无OutPut:无Return:空voidcloseSocket()Function:设置关闭socketInPut:无OutPut:无Return:空voidgonggao(inta,Strings)Function:InPut:无OutPut:无Return:空Stringchakan(Stringname)Return:name/nullvoiddel(Stringtmp)Return:空3.2.5、类YeeKuMap模块名称YeeKuMap功能描述按钮事件的处理接口与属性Put():voidgetkeyByVALLEactionPerformed(ActionEvente)Function:InPut:OutPut:Return:3.2.6、类ServerThread模块名称ServerThread功能描述负责所有客户的接待接口与属性BrPSSSvoidrun()Function:运行该线程InPut:无OutPut:无Return:空3.2.7、类ClinetThread模块名称ClinetThread功能描述处理每一个连接上的客户接口与属性ClinetThread(Socketsc)BrgetRESTmeg()viodInPut:无OutPut:无Return:空StringgetLogName()InPut:无OutPut:无Return:空voidrun()Function:运行该线程InPut:无OutPut:无Return:空主要程序实现客户端:importjava.io.*;.*;importjava.awt.*;importjava.awt.List;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.*;importjava.util.*;publicclassClientextendsJFrameimplementsActionListener{ privatestaticfinalintSERVER_PORT=30000; privateSocketsocket; privatePrintStreamps; privateBufferedReaderbrServer; privateJFileChooserjfc; privateStringkeyIn; publicstaticDefaultListModellistModel=newDefaultListModel();//ListModel对象 privatestaticJListpeopleList;Buttonbutton1=newButton("发送"); staticButtonbutton2=newButton("私聊"); staticButtonbutton3=newButton("发送文件"); staticJCheckBoxjcb=newJCheckBox("私聊"); StringuserName=null; //JButtonsendflie=null; staticTextAreatxtA1=newTextArea(); //staticListlist1=null; staticTextAreatxtA2=newTextArea(); //JTextAreatxtA2=null; publicvoidFrame(){ JFrameframe=newJFrame("客户端:聊天窗口"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Containerpane=frame.getContentPane(); pane.setLayout(null); frame.setLocation(320,240); frame.setSize(500,500); frame.setVisible(true); //TextAreatxtA1=newTextArea(); Client.txtA1.setBounds(10,10,370,300); //TextAreaClient.txtA2=newTextArea(); Client.txtA2.setBounds(10,340,370,80); /*Listlist2=newList(); list2.setBounds(400,10,90,300);*/ peopleList=newJList(listModel); peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置单选 JScrollPaneListScrollPane=newJScrollPane(peopleList); Client.peopleList.setBounds(400,10,90,300); //Listlist3=newList(); //list3.setBounds(400,340,90,120); //Buttonbutton3=newButton("发送文件"); button3.setBounds(405,350,50,20); button3.addActionListener(this); //Buttonbutton1=newButton("发送"); jcb.setBounds(160,430,80,40); // button1.setBounds(240,440,30,20); button1.addActionListener(this); //Buttonbutton2=newButton("私聊"); button2.setBounds(300,440,30,20); button2.addActionListener(this); pane.add(txtA1); pane.add(txtA2); pane.add(peopleList); //pane.add(list1); //pane.add(list2); //pane.add(list3); pane.add(jcb); pane.add(button1); pane.add(button2); pane.add(button3); } /*publicstaticvoidmain(String[]args){ Frameframe1=newFrame();// //Frameframe2=newFrame(); frame1.gost();*/ /*setVisible(true); setBounds(400,100,600,500); Containercon=getContentPane(); con.setVisible(true); con.setLayout(newFlowLayout()); txtA1=newJTextArea(15,45); listModel=newDefaultListModel(); peopleList=newJList(listModel); peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置单选 JScrollPaneListScrollPane=newJScrollPane(peopleList); txtA2=newJTextArea(5,45); yesBt=newJButton("确定发送"); yesBt.addActionListener(this); cancelBt=newJButton("发送文件"); cancelBt.addActionListener(this); //fr.add(btnSend); //fr.setSize(200,200); //fr.setVisible(true); //为发送按钮注册事件 cancelBt.addActionListener(this); add(newJLabel("客户端:")); con.add(newJLabel("聊天内容:")); con.add(txtA1); add(ListScrollPane,BorderLayout.EAST); con.add(txtA2); con.add(cancelBt); con.add(yesBt); //this.addWindowListener(this); validate(); con.validate(); //server=SocketSever();*/ publicvoidinit(Clientclient){ try { //初始化代表键盘的输入流 //keyIn=this.txtA2.getText(); //keyIn=newBufferedReader(newInputStreamReader(System.in)); //连接到服务器 socket=newSocket("",SERVER_PORT); //获取该Socket对应的输入流和输出流 ps=newPrintStream(socket.getOutputStream()); brServer=newBufferedReader(newInputStreamReader(socket.getInputStream())); Stringtip=""; //采用循环不断地弹出对话框要求输入用户名 while(true){ client.userName=JOptionPane.showInputDialog(tip+"输入用户名"); //将用户输入的用户名的前后增加协议字符串后发送 ps.println(YeekuProtocol.USER_ROUND+userName+YeekuProtocol.USER_ROUND); //读取服务器的响应 Stringresult=brServer.readLine(); //如果用户重复,开始下次循环 /*if(result.equals(userName)){ Client.listModel.addElement(userName); }*/ if(result.equals(YeekuProtocol.NAME_REP)){ tip="用户名重复!请重新"; continue; } //如果服务器返回登录成功,结束循环 if(result.equals(YeekuProtocol.LOGIN_SUCCESS)){ client.Frame(); //Client.listModel.addElement(userName); break; } } } //捕捉到异常,关闭网络资源,并退出该程序 catch(UnknownHostExceptionex){ System.out.println("找不到远程服务器,请确定服务器已经启动!"); closeRs(); System.exit(1); }catch(IOExceptionex){ System.out.println("网络异常!请重新登录!"); closeRs(); System.exit(1); } //以该Socket对应的输入流启动ClientThread线程 newClientThread(brServer).start(); } //定义一个读取键盘输出,并向网络发送的方法 /*privatevoidreadAndSend(StringkeyIn){ //try{ //不断读取键盘输入 Stringline=null; while((line=keyIn)!=null) { //如果发送的信息中有冒号,且以//开头,则认为想发送私聊信息 if(line.indexOf(":")>0&&line.startsWith("//")){ line=line.substring(2); ps.println(YeekuProtocol.PRIVATE_ROUND+ line.split(":")[0]+ YeekuProtocol.SPLIT_SIGN+ line.split(":")[1]+ YeekuProtocol.PRIVATE_ROUND); }elseif(line.equals("byebye")){ System.out.println("aaaaaaaaaaaaabbbbbbbbbbbbbbbb"+ps); Stringkey=(String)Server.clients.getKeyByValue(ps); System.out.println("aaaaaaaaaaaaa"+key); ps.println(YeekuProtocol.LOGIN_OUT+key+YeekuProtocol.LOGIN_OUT); }else{ ps.println(YeekuProtocol.MSG_ROUND+line+YeekuProtocol.MSG_ROUND); } } //} //捕捉到异常,关闭网络资源,并退出该程序 //catch(IOExceptionex){ System.out.println("网络通信异常!请重新登录!"); closeRs(); System.exit(1); } //}*/ @Override publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub if(e.getSource()==button1){ Stringline=Client.txtA2.getText(); while(line!=null) { //Stringusername=null; Stringname=null; //如果发送的信息中有冒号,且以//开头,则认为想发送私聊信息 if(jcb.isSelected()&&Client.peopleList.getSelectedValue()!=null){ name=(String)Client.peopleList.getSelectedValue(); //line=line.substring(2); //Stringsiliao=YeekuProtocol.PRIVATE_ROUND+ //userName+YeekuProtocol.SPLIT_SIGN+name+ //YeekuProtocol.SPLIT_SIGN+ //line+YeekuProtocol.PRIVATE_ROUND; //System.out.println(siliao+"这是客户端发送的"); //ps.println(siliao); Client.txtA2.setText(null); /*if(line.indexOf(":")>0&&line.startsWith("//")){ line=line.substring(2); ps.println(YeekuProtocol.PRIVATE_ROUND+ line.split(":")[0]+ YeekuProtocol.SPLIT_SIGN+ line.split(":")[1]+ YeekuProtocol.PRIVATE_ROUND);*/ }elseif(line.equals("byebye")){ System.out.println("aaaaaaaaaaaaabbbbbbbbbbbbbbbb"+ps); Stringkey=(String)Server.clients.getKeyByValue(ps); System.out.println("aaaaaaaaaaaaa"+key); ps.println(YeekuProtocol.LOGIN_OUT+key+YeekuProtocol.LOGIN_OUT); }else{ ps.println(YeekuProtocol.MSG_ROUND+line+YeekuProtocol.MSG_ROUND); //((TextComponent)Client.txtA2).setText(""); Client.txtA2.setText(null); break; } } } if(e.getSource()==Client.button3){ jfc.showOpenDialog(newFrame()); //启动新的线程传递文件 RTFSendsend=newRTFSend(jfc.getSelectedFile()); send.start(); } } //关闭Socket、输入流、输出流的方法 privatevoidcloseRs(){ //try{ if(keyIn!=null) { ps.close(); } if(brServer!=null) { ps.close(); } if(ps!=null) { ps.close(); } /*if(socket!=null) { //keyIn.close(); } }catch(IOExceptionex) { ex.printStackTrace(); }*/ } /*publicvoidactionPerformed1(ActionEvente){ //弹出文件选择对话框 if(e.getSource()==Client.button3){ jfc.showOpenDialog(newFrame()); //启动新的线程传递文件 RTFSendsend=newRTFSend(jfc.getSelectedFile()); send.start(); }}*/ publicstaticvoidmain(String[]args){ Clientclient=newClient(); //client.Frame(); client.init(client); }}服务器端:.*;importjava.io.*;importjava.awt.*;importjavax.swing.*;importjava.awt.event.*;publicclassServerextendsJFrame{ privatestaticfinalintSERVER_PORT=30000; publicstaticDefaultListModellistModel;//ListModel对象 privateJListpeopleList; privateJButtonkick; privateServerSocketss; //使用MyMap对象来保存每个客户名字和对应输出流之间的对应关系。 publicstaticYeekuMap<String,PrintStream>clients=newYeekuMap<String,PrintStream>(); publicServer(){ super("服务器"); setLayout(newBorderLayout()); listModel=newDefaultListModel(); peopleList=newJList(listModel); peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置单选 JScrollPaneListScrollPane=newJScrollPane(peopleList); add(ListScrollPane,BorderLayout.CENTER); kick=newJButton("踢人"); kick.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub if(e.getSource()==kick){ StringuserName=(String)peopleList.getSelectedValue();//从列表里得到用户选择的项 PrintStreamps=Server.clients.get(userName); ps.println(Server.clients.getKeyByValue(ps)+"您已经被迫下线,请重新登录");//1.告知本人被迫下线 ps.flush(); ps.close();//2.关闭流 Server.clients.removeByValue(ps); for(PrintStreamclientPs:Server.clients.valueSet()){ clientPs.println("用户"+userName+"已经下线。"); }//3.通知其他人这个用户已经下线 listModel.removeElement(userName);//4.从列表中移除 for(PrintStreamclientPs:Server.clients.valueSet()){ clientPs.println(YeekuProtocol.USER_REMOVE+userName+YeekuProtocol.USER_REMOVE); } } } }); //dataList.getSelectedValue(); add(kick,BorderLayout.SOUTH); setLocation(300,100); setSize(150,450); setResizable(false);//设置不能最大化 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true);//设置可不可见} publicvoidinit(){ try{ //建立监听的ServerSocket ss=newServerSocket(SERVER_PORT); //采用死循环来不断接受来自客户端的请求 while(true){ Socketsocket=ss.accept(); newServerThread(socket).start(); } } //如果抛出异常 catch(IOExceptionex){ System.out.println("服务器启动失败,是否端口"+SERVER_PORT+"已被占用?"); } //使用finally块来关闭资源 finally{ try{ if(ss!=null){ ss.close(); } }catch(IOExceptionex){ ex.printStackTrace(); } System.exit(1); } } publicstaticvoidmain(String[]args){ Serverserver=newServer(); server.init(); }}测试与结果5.1功能模块界面服务器端界面:图3.服务器端界面登陆界面:图4.登陆界面客户端界面:图5.输入用户名图6.登陆客户端登陆后的服务器:图7.用户登陆后的服务器第2个客户端登陆:图8.第2个用户登陆图9.可在客户端显示在线用户踢除用户:图10.服务器端点击踢人图11.客户端显示被迫下线发送聊天:图12.在客户端输入字符点击发送图13.在接收用户客户端显示出发送的字符图14.在发送用户客户端显示发送的字符心得体会经过一个学期的JAVA课程学习了解了JAVA的基础理论知识,通过这次程序设计,进一步巩固、加深了我们所学专业课程的基本理论知识,理论联系实际,进一步培养了综合分析问题,解决问题的能力,进一步加强了JAVA的实际应用能力。通过本次Java语言课程设计,我对面向对象的程序设计有了更深程度的掌握,它将重点放在对象与对象的接口上。在通过对题目进行需求分析,考虑一些编程中可能遇到的问题。其次开始界面设计、类的设计、类功能的连接等等实现。在遇到问题解决问题的过程中不断完善功能。这次Java课程设计不仅考查了对Java语言基本理论知识的学习程度还考核了我们综合运用以及学习新知识的能力。在以后的学习道路上必须多加强自己的实际业务能力,才能适应社会对应用型人才实际工作能力的需求。参考文献 [1]夏宽理.Java语言程序设计1.机械工业出版社,2021年4月.[2]丁宝康.数据库系统原理.经济科学出版社,2021年.[3]王建华,董志敏译,JAVA核心技术卷2:高级特性,北京:机械工业出版社,2021[4]李建峰译,java2图形设计卷二:swing.北京:机械工业出版社,2021[5]姬猛洛,李军译,即时消息传递系统编程源代码解析.北京:电子工业出版社,2021
论大学生写作能力写作能力是对自己所积累的信息进行选择、提取、加工、改造并将之形成为书面文字的能力。积累是写作的基础,积累越厚实,写作就越有基础,文章就能根深叶茂开奇葩。没有积累,胸无点墨,怎么也不会写出作文来的。写作能力是每个大学生必须具备的能力。从目前高校整体情况上看,大学生的写作能力较为欠缺。一、大学生应用文写作能力的定义那么,大学生的写作能力究竟是指什么呢?叶圣陶先生曾经说过,“大学毕业生不一定能写小说诗歌,但是一定要写工作和生活中实用的文章,而且非写得既通顺又扎实不可。”对于大学生的写作能力应包含什么,可能有多种理解,但从叶圣陶先生的谈话中,我认为:大学生写作能力应包括应用写作能力和文学写作能力,而前者是必须的,后者是“不一定”要具备,能具备则更好。众所周知,对于大学生来说,是要写毕业论文的,我认为写作论文的能力可以包含在应用写作能力之中。大学生写作能力的体现,也往往是在撰写毕业论文中集中体现出来的。本科毕业论文无论是对于学生个人还是对于院系和学校来说,都是十分重要的。如何提高本科毕业论文的质量和水平,就成为教育行政部门和高校都很重视的一个重要课题。如何提高大学生的写作能力的问题必须得到社会的广泛关注,并且提出对策去实施解决。二、造成大学生应用文写作困境的原因:(一)大学写作课开设结构不合理。就目前中国多数高校的学科设置来看,除了中文专业会系统开设写作的系列课程外,其他专业的学生都只开设了普及性的《大学语文》课。学生写作能力的提高是一项艰巨复杂的任务,而我们的课程设置仅把这一任务交给了大学语文教师,可大学语文教师既要在有限课时时间内普及相关经典名著知识,又要适度提高学生的鉴赏能力,且要教会学生写作规
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家长食品安全教育课件
- 2026年酒店服务外包合同协议
- 2026年社交媒体推广合同范本
- 房屋保险合同2026年协议条款
- 2026年网络安全评估意向书合同
- 2026年游戏软件著作权许可合同
- 家长会安全教学课件
- 家长会安全专题教育课件
- 2026年工业自动化保养合同
- 2026年专利许可终止合同协议
- 硬笔书法全册教案共20课时
- DB42T 850-2012 湖北省公路工程复杂桥梁质量鉴定规范
- DB 5201∕T 152.2-2025 交通大数据 第2部分:数据资源目录
- 月经不调的中医护理常规
- 2024-2025学年江苏省南通市如东县、通州区、启东市、崇川区高一上学期期末数学试题(解析版)
- 中盐集团招聘试题及答案
- 石家庄市得力化工有限公司5万吨-年煤焦油加工生产装置安全设施设计诊断专篇
- 现代密码学(第4版)-习题参考答案
- 门诊护士长工作总结汇报
- 油气长输管道检查标准清单
- 幼教家长讲座
评论
0/150
提交评论