Java聊天工具课程设计报告_第1页
Java聊天工具课程设计报告_第2页
Java聊天工具课程设计报告_第3页
Java聊天工具课程设计报告_第4页
Java聊天工具课程设计报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java网络编程实践()课程设计说明书课程名称:Java网络编程课程设计_题目:__基于C/S的班级即时通讯工具姓名:于明帅朱烨枫__________学号:201105407201105423教学班号:软件工程1101班指导教师:王小刚_______兰州交通大学软件科学与工程系二○一二年十二月二十七日Java网络编程实践任务书目的:熟悉JAVA语法,掌握图形化界面、多线程、网络、数据库等综合编程,掌握用编程语言开发由若干功能组成的小型项目的基本流程,增强动手实践能力,巩固和加强书本知识的学习,体会JAVA编程的特点。题目1:基于C/S的班级即时通讯工具(2人)要求:C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。数据存储:服务器端存储最少一个班级的信息;最好多个班级,主要存储班级若干学生的基本信息。用数据库存储。下面所有功能只考虑一个班是基本实现,考虑多个班是拓展实现。界面:GUI界面,友好直观,布局合理,方便的功能入口。功能:登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班(只考虑一个班的情况)。或是否是某个班的学生(多个班的情况)。验证通过进入主界面,否则给出错误提示。主界面列出该学生好友列表(同班级同学默认全是该生好友,如果是多个班则可以添加别班好友并经对方批准)。即时聊天,选中某个好友,双击打开窗口聊天。如果不在线则服务器等对方上线后转发(此功能属拓展实现)。可以修改自己的登陆密码。题目2:基于C/S的班级聊天室(群聊)工具(2人)要求:C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。数据存储:服务器端存储一个班级的信息;主要存储班级若干学生的基本信息。用数据库存储。界面:GUI界面,友好直观,布局合理,方便的功能入口。功能:登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班。验证通过进入主界面,否则给出错误提示。主界面应划分几个部分,至少有聊天室窗口部分(显示多人的聊天信息),自身发送聊天信息的窗口部分,聊天室成员列表部分,最好实现在线用户区别显示(此功能属拓展实现)等。进入主界面就可以参与群聊。可以修改自己的登陆密码。题目3:基于C/S的学生信息管理(1人)实现应用,可以通过网络在客户端对存放在服务器端的学生信息表(至少包含学号、姓名、性别、年龄、籍贯等字段)学生纪录增、删、改、查,并返回结果。要能通过菜单选择功能。基于Socket,多客户端使用多线程,以能同时从多个客户端执行功能。必须提供友好直观、布局合理的图形界面选择功能、显示信息和填写修改信息。成员名单:于明帅、朱烨枫分工列表登陆界面于明帅修改密码界面朱烨枫聊天窗口界面于明帅服务器代码朱烨枫连接数据库朱烨枫课程设计报告于明帅项目简述和目的聊天室做为即时通讯的一种,即时通讯(InstantMessenger,简称IM)软件可以说是目前我国上网用户使用率最高的软件,无论是老牌的ICQ,还是国内用户量第一的腾讯QQ,以及微软的MSNMessenger都是大众关注的焦点,它们能让你迅速地在网上找到你的朋友或工作伙伴,可以实时交谈和互传信息。而且,现在不少IM软件还集成了数据交换、语音聊天、网络会议、电子邮件的功能。要求:C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。数据存储:服务器端存储最少一个班级的信息;最好多个班级,主要存储班级若干学生的基本信息。用数据库存储。下面所有功能只考虑一个班是基本实现,考虑多个班是拓展实现。界面:GUI界面,友好直观,布局合理,方便的功能入口。功能:登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班(只考虑一个班的情况)。或是否是某个班的学生(多个班的情况)。验证通过进入主界面,否则给出错误提示。主界面列出该学生好友列表(同班级同学默认全是该生好友,如果是多个班则可以添加别班好友并经对方批准)。即时聊天,选中某个好友,双击打开窗口聊天。如果不在线则服务器等对方上线后转发(此功能属拓展实现)。可以修改自己的登陆密码。目的:通过此项目实训——JAVA聊天室的设计,实践、总结、回顾了网络编程思想以及编程方法,并通过编写程序来掌握Java语言编程技巧,将学习到的知识融会贯通,同时提高调试程序的能力,养成良好的编程习惯,并增强对程序设计整体思路的把握,理论与时间相结合。本文的主要工作集中在:该课程基于C/S模式,客户机向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。当用户聊天时,将当前用户名、聊天对象、聊天,内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解,针对JAVA语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。解题基本思路当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。

当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问,具体实现过程如图3-6所示。

接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。

当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。分析和设计本系统主要通过客户端,服务器端来体现聊天系统的基本功能。(1)服务器端1.处理用户登录2.处理用户发送信息,服务器监控聊天内容,服务器过滤非法内容3.处理用户得到信息4.处理用户退出 5.保存用户聊天信息。(2)客户端 1.用户登录界面及结果 2.用户发送信息界面及结果 3.用户得到信息界面及结果 4.用户退出界面及结果目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC、网易泡泡等,国外有著名的MSN(新版改名为LiveMessenger)以及跨平台Gaim等。本人取最具代表性的QQ和MSN进行了一些研究,作为我开发聊天系统的准备。腾讯无疑是国内即时通讯市场的霸主,自从99年进入即时通讯领域并迅速占市场之后,其在国内用户数量始终高居榜首,即使近几年面对微软MSN的强大攻势,腾讯QQ的时常占有率依然稳步增长。腾讯的成功与其对QQ的不断创新和完善是分不开的。参考了许多网络上的资料,以及自己通过观察腾讯QQ运行时的各种细节。可以确定腾讯QQ是以多服务器提供服务、服务器总控客户端、客户端之间UDP直连通信的。并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信。其模型如图1-1主要程序源代码客户端主要代码:importjava.awt.*;importjava.awt.List;importjava.awt.event.*;importjava.io.*;import.*;importjava.text.SimpleDateFormat;importjava.util.Date;importjavax.swing.*;publicclassChatlogoextendsJFrame{ JFramea1=newJFrame("QQ2012");//创建登录窗口 JLabellab1=newJLabel("账号"); JLabellab2=newJLabel("密码"); JButtonbt1=newJButton("登录"); JButtonbt2=newJButton("修改密码"); JTextFieldtext1=newJTextField(26); JPasswordFieldpasf1=newJPasswordField(26); //设置文本框长度 JFramea2=newJFrame("修改密码");//创建修改密码窗口 JLabellab3=newJLabel("账号"); JLabellab4=newJLabel("新密码"); JLabellab5=newJLabel("确认密码"); JButtonbt3=newJButton("确定"); JButtonbt4=newJButton("取消"); JTextFieldtext2=newJTextField(22); JPasswordFieldpasf2=newJPasswordField(23); JPasswordFieldpasf3=newJPasswordField(23); JPanelpanel1=newJPanel(newFlowLayout(FlowLayout.LEFT,15,10)); JPanelpanel2=newJPanel(newFlowLayout(FlowLayout.LEFT,70,30)); JPanelpanel3=newJPanel(newFlowLayout(FlowLayout.CENTER,10,10)); //设置按钮及文本框位置 JFramea3=newJFrame();//创建聊天窗口 JPanelpanel4=newJPanel(); JPanelpanel5=newJPanel(); JTextAreaarea1=newJTextArea(12,10); JTextAreaarea2=newJTextArea(12,8); JScrollPanescroll1=newJScrollPane(area1); JScrollPanescroll2=newJScrollPane(area2); //创建文本区 JButtonbt5=newJButton("发送"); JButtonbt6=newJButton("关闭窗口"); Listlist=newList(15,false); Checkboxcb=newCheckbox("私聊"); Choicechoice=newChoice();//添加下拉列表框 BufferedReaderbufferedreader; PrintStreamprintStream; Socketsocket; booleanbool=true; ObjectInputStreamois; ObjectOutputStreamoos; JPanelimagePanel1; ImageIconbackground1; //添加背景图片 publicChatlogo(){ //choice.add("群聊"); //choice.add("私聊"); a1.add(lab1); a1.add(text1); a1.add(lab2); a1.add(pasf1); a1.add(bt1); a1.add(bt2); background1=newImageIcon("d:\\tt.jpg");//背景图片来源 JLabellabel=newJLabel(background1);//利用标签添加背景图片 label.setBounds(0,0,background1.getIconWidth(), background1.getIconHeight()); imagePanel1=(JPanel)a1.getContentPane(); imagePanel1.setOpaque(false); imagePanel1.setLayout(newFlowLayout());//设置背景图片位置 a1.getLayeredPane().setLayout(null); a1.getLayeredPane().add(label,newInteger(Integer.MIN_VALUE)); a1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); a1.setSize(background1.getIconWidth(),background1.getIconHeight()); a1.setResizable(false); a1.setVisible(true); panel1.add(panel2); panel3.add(lab3); panel3.add(text2); panel3.add(lab4); panel3.add(pasf2); panel3.add(lab5); panel3.add(pasf3); panel3.add(bt3); panel3.add(bt4); a2.add(panel3); a2.setSize(300,300);//设置修改密码窗口大小 a1.setVisible(true); a3.setSize(500,400);//设置聊天窗口大小 a3.add(panel4,BorderLayout.CENTER); a3.add(panel5,BorderLayout.SOUTH); a3.add(list,BorderLayout.EAST); //设置各按钮的布局 panel5.add(bt5); panel5.add(bt6); panel5.add(cb); panel5.add(choice); panel4.setLayout(newGridLayout(2,1)); panel4.add(scroll1); panel4.add(scroll2); bt1.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventae1){//监听动作事件 booleantemp=false; try{ bufferedreader=newBufferedReader(newFileReader("d:\\pwd.txt")); StringsName=""; while((sName=bufferedreader.readLine())!=null){ String[]sarr=sName.split(""); if((text1.getText().equals(sarr[0]))&&(pasf1.getText().equals(sarr[1]))){ temp=true; break; }else{ temp=false; } } if(temp==false){ JOptionPane.showMessageDialog(a1,"对不起,密码错误或用户不存在!"); }else{ oos.writeObject("账号:"+text1.getText()); a1.setVisible(false); a3.setTitle(text1.getText()); a3.setVisible(true); } //调用文本中的信息,进行账号登陆 bufferedreader.close(); }catch(FileNotFoundExceptione1){//抛出异常事件 //TODOAuto-generatedcatchblock e1.printStackTrace(); }catch(IOExceptione1){//TODOAuto-generatedcatchblock e1.printStackTrace(); } } }); bt2.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ a1.setVisible(false); a2.setVisible(true); } }); bt3.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventae2){ try{ PrintWriterprintwrite=newPrintWriter(newFileWriter("d:\\pwd.txt",true)); Strings1=text2.getText(); Strings2=pasf2.getText(); Strings4=pasf3.getText(); Strings3=s1+""+s2; bufferedreader=newBufferedReader(newFileReader("d:\\pwd.txt")); Stringss=bufferedreader.readLine(); inta=0; while(ss!=null){ String[]sss=ss.split(""); a=compare(sss[0],s1); if(s2.equals(s4)) { if(a==1){ JOptionPane.showMessageDialog(a2,"该账号已被使用"); break; } ss=bufferedreader.readLine(); if(a==0){ printwrite.println(s3); JOptionPane.showMessageDialog(a2,"密码修改成功"); a2.setVisible(false); a1.setVisible(true); break; } } else{ JOptionPane.showMessageDialog(a2,"两次密码输入不一致"); break; } } printwrite.close(); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } }); //实现修改密码操作,并将用户信息保存到文档里 bt4.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventae3){ //TODOAuto-generatedmethodstub a1.setVisible(true); a2.setVisible(false); } }); choice.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEvente) { } }); bt5.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventae4){ try{ if(cb.getState()){ oos.writeObject("私聊:"+text1.getText()+"对:"+list.getSelectedItem()+":说-:"+area2.getText()); }else{ oos.writeObject("群聊:"+text1.getText()+"说:"+area2.getText()); } area2.setText(""); }catch(IOExceptione){ e.printStackTrace(); } } });//设置聊天操作,实现获取时间 bt6.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventae5){ try{ oos.writeObject("该用户下线:"+text1.getText()); System.exit(1); }catch(IOExceptione1){ e1.printStackTrace(); } } }); try{ socket=newSocket("localhost",9999);//设置服务器Ip oos=newObjectOutputStream(socket.getOutputStream()); ClientThreadct=newClientThread(); ct.start(); }catch(UnknownHostExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } classClientThreadextendsThread{ publicvoidrun(){ try{ while(bool){ ois=newObjectInputStream(socket.getInputStream()); Strings=(String)ois.readObject(); String[]sarr=s.split(":"); area1.selectAll(); if(sarr[0].equals("列表")){ list.removeAll();list.add("在线用户列表"); for(inti=1;i<sarr.length;i++){ list.add(sarr[i]); } }elseif(sarr[0].equals("私聊")){ SimpleDateFormatc=newSimpleDateFormat("yyyy/MM/ddHH:mm:ss"); area1.append(sarr[1]+""+sarr[2]+""+c.format(newDate())+":"+"\n"+""+sarr[3]+"\n"); }elseif(sarr[0].equals("群聊")){ SimpleDateFormatc=newSimpleDateFormat("yyyy/MM/ddHH:mm:ss"); area1.append(sarr[1]+""+c.format(newDate())+":"+"\n"+""+sarr[2]+"\n"); } } //实现聊天功能 }catch(IOExceptione){ e.printStackTrace(); }catch(ClassNotFoundExceptione){ e.printStackTrace(); } } } publicintcompare(Strings1,Strings2){ intflag=0; if(s1.equals(s2)==true){ flag=1; } returnflag; } publicstaticvoidmain(String[]args){ Chatlogoc=newChatlogo(); } }服务器主要代码:importjava.io.*;import.*;importjava.util.*;publicclassServer{ ServerSocketssc; Socketsocket; booleanbool=true; ArrayListarray=newArrayList(); Mapmap=newHashMap(); publicServer(){ try{ ssc=newServerSocket(9999); while(bool){ socket=ssc.accept(); Strings=""+socket.getInetAddress()+":"+socket.getPort(); socket=ssc.accept(); array.add(socket); MyThreadmt=newMyThread(); mt.start(); } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }} classMyThreadextendsThread{ ObjectInputStreamois; ObjectOutputStreamoos; publicvoidrun(){ Strings=""; String[]sarr; try{ ois=newObjectInputStream(socket.getInputStream()); while((s=(String)ois.readObject())!=null){ sarr=s.split(":"); if(sarr[0].equals("账号")){ map.put(sarr[1],socket); Iteratoriter=map.keySet().iterator(); Stringss=""; while(iter.hasNext()){ if(ss==null){ ss=iter.next()+":"; }else{ ss+=iter.next()+":"; } } for(inti=0;i<array.size();i++){ try{ oos=newObjectOutputStream(((Socket)array.get(i)).getOutputStream()); oos.writeObject("列表"+":"+ss); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }elseif(sarr[0].equals("该用户下线")){ Socketsoc=(Socket)map.get(sarr[1]); map.remove(sarr[1]); array.remove(soc); Iteratoriter=map.keySet().iterator(); Stringss=""; while(iter.hasNext()){ if(ss==null){ ss=iter.next()+":"; }else{ ss+=iter.next()+":"; } } for(inti=0;i<array.size();i++){ try{ oos=newObjectOutputStream(((Socket)array.get(i)).getOutputStream()); oos.writeObject("列表:"+ss); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }elseif(sarr[0].equals("私聊")){ Socketsocke=(Socket)map.get(sarr[2]); oos=newObjectOutputStream(socke.getOutputStr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论