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

下载本文档

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

文档简介

1、Java网络编程实践(课程设计说明书课程名称:Java网络编程课程设计 题目:基于C/S的班级即时通讯工具 姓名:于明帅朱烨枫学号:201105407201105423教学班号:软件工程1101班指导教师:王小刚兰州交通大学软件科学与工程系二。一二年 十二 月二十七 日Java网络编程实践任务书目的:熟悉JAVA语法,掌握图形化界面、多线程、网络、数据库等综合编程,掌 握用编程语言开发由若干功能组成的小型项目的基本流程,增强动手实践能力,巩 固和加强书本知识的学习,体会JAVA编程的特点。题目1:基于C/S的班级即时通讯工具(2人)要求:C/S模式,基于Socket实现,服务器端用多线程来处理

2、同时多个客户端连接。数据存储:服务器端存储最少一个班级的信息;最好多个班级,主要存储班级若 干学生的基本信息。用数据库存储。下面所有功能只考虑一个班是基本实现,考 虑多个班是拓展实现。界面:GUI界面,友好直观,布局合理,方便的功能入口。功能:1)登陆输入用户名和密码;用户名是学号,有初始密码,例如1111112)登陆验证 根据服务器端存储的班级信息,对输入的用户进行验证,看是否 存在于该班(只考虑一个班的情况)。或是否是某个班的学生(多个班的情 况)。验证通过进入主界面,否则给出错误提示。3)主界面列出该学生好友列表(同班级同学默认全是该生好友,如果是多个班 则可以添加别班好友并经对方批准)

3、。4)即时聊天,选中某个好友,双击打开窗口聊天。如果不在线则服务器等对方 上线后转发(此功能属拓展实现)。5)可以修改自己的登陆密码。6)题目2:基于C/S的班级聊天室(群聊)工具(2人)要求:C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。数据存储:服务器端存储一个班级的信息;主要存储班级若干学生的基本信息。 用数据库存储。界面:GUI界面,友好直观,布局合理,方便的功能入口。功能:a)登陆输入用户名和密码;用户名是学号,有初始密码,例如111111b)登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是 否存在于该班。验证通过进入主界面,否则给出错误提

4、示。c)主界面应划分几个部分,至少有聊天室窗口部分(显示多人的聊天信息), 自身发送聊天信息的窗口部分,聊天室成员列表部分,最好实现在线用户 区别显示(此功能属拓展实现)等。进入主界面就可以参与群聊。d)可以修改自己的登陆密码。题目3:基于C/S的学生信息管理(1人)实现应用,可以通过网络在客户端对存放在服务器端的学生信息表(至少包含 学号、姓名、性别、年龄、籍贯等字段)学生纪录增、删、改、查,并返回结果。 要能通过菜单选择功能。基于Socket,多客户端使用多线程,以能同时从多个客户 端执行功能。必须提供友好直观、布局合理的图形界面选择功能、显示信息和填写修改信息。成员名单:于明帅、朱烨枫分

5、工列表登陆界面于明帅修改密码界面朱烨枫聊天窗口界面于明帅服务器代码朱烨枫连接数据库朱烨枫课程设计报告于明帅一、项目简述和目的聊天室做为即时通讯的一种,即时通讯(Instant Messenger,简称IM )软件 可以说是目前我国上网用户使用率最高的软件,无论是老牌的ICQ,还是国内用户 量第一的腾讯QQ,以及微软的MSN Messenger都是大众关注的焦点,它们能让你 迅速地在网上找到你的朋友或工作伙伴,可以实时交谈和互传信息。而且,现在不 少IM软件还集成了数据交换、语音聊天、网络会议、电子邮件的功能。要求:1 . C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连

6、接。数据存储:服务器端存储最少一个班级的信息;最好多个班级,主要存储班级若 干学生的基本信息。用数据库存储。下面所有功能只考虑一个班是基本实现,考 虑多个班是拓展实现。.界面:GUI界面,友好直观,布局合理,方便的功能入口。.功能:1 )登陆输入用户名和密码;用户名是学号,有初始密码,例如111111 ;2)登陆验证 根据服务器端存储的班级信息,对输入的用户进行验证,看是否 存在于该班(只考虑一个班的情况)。或是否是某个班的学生(多个班的情 况)。验证通过进入主界面,否则给出错误提示。3)主界面列出该学生好友列表(同班级同学默认全是该生好友,如果是多个班 则可以添加别班好友并经对方批准)。4)

7、即时聊天,选中某个好友,双击打开窗口聊天。如果不在线则服务器等对方 上线后转发(此功能属拓展实现)。5)可以修改自己的登陆密码。目的: 通过此项目实训JAVA聊天室的设计,实践、总结、回顾了网络编程思想以及编 程方法,并通过编写程序来掌握Java语言编程技巧,将学习到的知识融会贯通,同 时提高调试程序的能力,养成良好的编程习惯,并增强对程序设计整体思路的把握, 理论与时间相结合。本文的主要工作集中在:该课程基于C/S模式,客户机向服务 器发聊天请求,服务器应答并能显示客户机发过来的信息。当用户聊天时,将当前 用户名、聊天对象、聊天,内容、聊天语气和是否私聊进行封装,然后与服务器建 立Socke

8、t连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务 器端。当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信 息对象,然后将其强制转换为Chat对象,接收用户的聊天信息是由多线程技术实现 的,因为客户端必须时时关注更新服务器上是否有最新消息,当每次用户接收到聊 天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界 面上。进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性 的理解,针对JAVA语言中的重点和难点内容进行训练,独立完成有一定工作量的 程序设计任务,同时强调好的程序设计风格。二、解题基本思路当用户聊天时,

9、将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封 装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天 信息对象发送给服务器端。当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象, 然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问,具体实现过程如图3-6所示。接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务 器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太 短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉

10、没有时效性, 所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性 化地显示在聊天信息界面上。三、分析和设计本系统主要通过客户端,服务器端来体现聊天系统的基本功能。(1)服务器端处理用户登录处理用户发送信息,服务器监控聊天内容,服务器过滤非法内容处理用户得到信息处理用户退出保存用户聊天信息。(2)客户端用户登录界面及结果用户发送信息界面及结果用户得到信息界面及结果用户退出界面及结果目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新 浪UC、网易泡泡等,国外有著名的MSN(新版改名为Liv

11、e Messenger)以及跨平台Gaim等。本人取最具代表性的QQ和MSN进行了一些研究,作为我开发聊天系 统的准备。腾讯无疑是国内即时通讯市场的霸主,自从99年进入即时通讯领域并迅速占市 场之后,其在国内用户数量始终高居榜首,即使近几年面对微软MSN的强大攻势, 腾讯QQ的时常占有率依然稳步增长。腾讯的成功与其对QQ的不断创新和完善是 分不开的。参考了许多网络上的资料,以及自己通过观察腾讯QQ运行时的各种细节。可 以确定腾讯QQ是以多服务器提供服务、服务器总控客户端、客户端之间UDP直连 通信的。并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信。其模型如图1-1四、主要程序

12、源代码客户端主要代码:import java.awt.*;import java.awt.List;import java.awt.event.*;import java.io.*;import .*;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.*;public class Chatlogo extends JFrame (JFrame a1 = new JFrame(QQ2012”);/ 创建登录窗口 TOC o 1-5 h z JLabel lab1 = new JLabel(账号”)

13、;JLabel lab2 = new JLabel(密码”);JButton bt1 = new JButton(登录”);JButton bt2 = new JButton(修改密码);JTextField text1 = new JTextField(26);JPasswordField pasf1 = new JPasswordField(26);设置文本框长度JFrame a2 = new JFrame(修改密码,创建修改密码窗口JLabel lab3 = new JLabel(账号);JLabel lab4 = new JLabel(新密码);JLabel lab5 = new JL

14、abel(确认密码);JButton bt3 = new JButton(确定);JButton bt4 = new JButton(取消);JTextField text2 = new JTextField(22);JPasswordField pasf2 = new JPasswordField(23);JPasswordField pasf3 = new JPasswordField(23);JPanel panel1 = new JPanel(new FlowLayout(FlowLayout.LEFT,15,10);JPanel panel2 = new JPanel(new Flo

15、wLayout(FlowLayout.LEFT,70,30);JPanel panel3 = new JPanel(new FlowLayout(FlowLayout.CENTER,10,10);设置按钮及文本框位置JFrame a3 = new JFrame();/ 创建聊天窗口JPanel panel4 = new JPanel();JPanel panel5 = new JPanel();JTextArea area1 = new JTextArea(12, 10);JTextArea area2 = new JTextArea(12, 8);JScrollPane scroll1 =

16、new JScrollPane(area1);JScrollPane scroll2 = new JScrollPane(area2);创建文本区JButton bt5 = new JButton(发送”);JButton bt6 = new JButton(关闭窗口);List list = new List(15, false);Checkbox cb = new Checkbox(私聊);Choice choice=new Choice();/ 添加下拉列表框BufferedReader bufferedreader;PrintStream printStream;Socket sock

17、et ;boolean bool = true;ObjectInputStream ois;ObjectOutputStream oos;JPanel imagePanel1;ImageIcon background1;添加背景图片public Chatlogo()(/choice.add(群聊);/choice.add(私聊);a1.add(lab1);a1.add(text1);a1.add(lab2);a1.add(pasf1);a1.add(bt1);a1.add(bt2);background1 = new ImageIcon(d:tt.jpg); 背景图片来源JLabel labe

18、l = new JLabel(background1);/ 利用标签添加背景图片 label.setBounds(0,0, background1.getIconWidth(), background1.getIconHeight();imagePanel1 = (JPanel) a1.getContentPane();imagePanel1.setOpaque(false);imagePanel1.setLayout(new FlowLayout();/ 设置背景图片位置 a1.getLayeredPane().setLayout(null);a1.getLayeredPane().add(

19、label, new Integer(Integer.MIN_VALUE); a1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);a1.setSize(background1.getIconWidth(), background1.getIconHeight(); al.setResizable(false);al.setVisible(true);panel1.add(panel2);panel3.add(lab3);panel3.add(text2);panel3.add(lab4);panel3.add(pasf2);panel3.add(

20、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);p

21、anel5.add(cb);panel5.add(choice);panel4.setLayout(new GridLayout(2, 1);panel4.add(scroll1);panel4.add(scroll2);bt1.addActionListener(new ActionListener()(public void actionPerformed(ActionEvent ae1) (/ 监听动作事件boolean temp = false; try bufferedreader = new BufferedReader(new FileReader(d:pwd.txt); Str

22、ing sName =;while(sName = bufferedreader.readLine() != null)String sarr = sName.split();&if(text1.getText().equals(sarr0)(pasf1.getText().equals(sarr1)(temp = true;break;else(temp = false;if(temp = false)(JOptionPane.showMessageDialog(a1,对不起,密 码错误或用户不存在!”);else(oos.writeObject(账号:+text1.getText();a1

23、.setVisible(false);a3.setTitle(text1.getText();a3.setVisible(true);调用文本中的信息,进行账号登陆bufferedreader.close(); catch (FileNotFoundException e1) (/ 抛出异常事件/ TODO Auto-generated catch blocke1.printStackTrace(); catch (IOException e1) (/ TODO Auto-generated catch block e1.printStackTrace(););bt2.addActionLis

24、tener(new ActionListener()(public void actionPerformed(ActionEvent e) ( a1.setVisible(false);a2.setVisible(true); ); bt3.addActionListener(new ActionListener()(public void actionPerformed(ActionEvent ae2) ( try PrintWriter printwrite= new PrintWriter(new FileWriter(d:pwd.txt”,true);String s1= text2.

25、getText();String s2 = pasf2.getText();String s4 = pasf3.getText();String s3 = s1 + + s2;bufferedreader = new BufferedReader(new FileReader(d:pwd.txt); String ss = bufferedreader.readLine(); int a = 0;while(ss != null)String sss = ss.split();a = compare(sss0,s1);if(s2.equals(s4) if(a = 1)JOptionPane.

26、showMessageDialog(a2,该账 号已被使用”);break;ss = bufferedreader.readLine();if(a = 0)printwrite.println(s3);JOptionPane.showMessageDialog(a2,密码修改成功”); a2.setVisible(false);al.setVisible(true); break;else(JOptionPane.showMessageDialog(a2,”两次密码 输入不一致);break;printwrite.close(); catch (FileNotFoundException e)

27、 ( e.printStackTrace(); catch (IOException e) ( e.printStackTrace(););实现修改密码操作,并将用户信息保存到文档里bt4.addActionListener(new ActionListener()(public void actionPerformed(ActionEvent ae3) ( / TODO Auto-generated method stub a1.setVisible(true);a2.setVisible(false););choice.addItemListener(new ItemListener()(

28、public void itemStateChanged(ItemEvent e) );bt5.addActionListener(new ActionListener()(public void actionPerformed(ActionEvent ae4) (try if(cb.getState()(oos.writeObject( 私 聊 :+text1.getText()+ 对:+list.getSelectedItem() + :说-:+ area2.getText();elseoos.writeObject(群聊:+text1.getText()+”说:+ area2.getTe

29、xt();area2.setText(); catch (IOException e) e.printStackTrace(););/设置聊天操作,实现获取时间bt6.addActionListener(new ActionListener()public void actionPerformed(ActionEvent ae5) try oos.writeObject(该用户下线:+text1.getText();System.exit(1); catch (IOException e1) e1.printStackTrace(););try socket = new Socket(loca

30、lhost”, 9999);/设置服务器 Ip oos = new ObjectOutputStream(socket.getOutputStream();ClientThread ct = new ClientThread(); ct.start(); catch (UnknownHostException e) ( e.printStackTrace(); catch (IOException e) ( e.printStackTrace();class ClientThread extends Thread(public void run()( try while(bool)( ois

31、= new ObjectInputStream(socket.getInputStream(); String s = (String)ois.readObject();String sarr = s.split(:); area1.selectAll();if(sarr0.equals(列表) list.removeAll(); list.add(在线用户列表”); for(int i = 1; i sarr.length; i+) list.add(sarri); else if(sarr0.equals(私聊) SimpleDateFormatc=newSimpleDateFormat(

32、yyyy/MM/dd HH:mm:ss); area1.append(sarr1+ +sarr2+ +c.format(newDate()+: +n+ +sarr3+n);else if(sarr0.equals(群聊)(SimpleDateFormatc=newSimpleDateFormat(yyyy/MM/dd HH:mm:ss); area1.append(sarr1+ +c.format(new Date()+: +n+ +sarr +n); 实现聊天功能 catch (IOException e) ( e.printStackTrace(); catch (ClassNotFoun

33、dException e) ( e.printStackTrace();public int compare(String s1,String s2)( int flag = 0; if(s1.equals(s2) = true)( flag = 1; return flag;public static void main(String args) ( Chatlogo c = new Chatlogo();服务器主要代码:import java.io.*;import .*;import java.util.*; public class Server(ServerSocket ssc;So

34、cket socket ;boolean bool = true;ArrayList array = new ArrayList();Map map = new HashMap();public Server()(try ssc = new ServerSocket(9999);while(bool)socket = ssc.accept();String s = + socket.getInetAddress()+:+socket.getPort();socket = ssc.accept();array.add(socket);MyThread mt = new MyThread();mt

35、.start(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();class MyThread extends ThreadObjectInputStream ois;ObjectOutputStream oos;public void run()String s =;String sarr;try ois = new ObjectInputStream(socket.getInputStream();while(s = (String)ois.readObject() != null)sa

36、rr = s.split(:);if(sarr0.equals(账号)map.put(sarr1, socket);Iterator iter = map.keySet().iterator();String ss =”;while(iter.hasNext()(if(ss = null)(ss = iter.next() + :;else(ss += iter.next() + :;for(int i = 0; i array.size(); i+)(try oos = new ObjectOutputStream(Socket) array.get(i).getOutputStream()

37、;oos.writeObject(列表+: + ss); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();else if(sarr0.equals(该用户下线)Socket soc = (Socket)map.get(sarr1);map.remove(sarr1);array.remove(soc);Iterator iter = map.keySet().iterator();while(iter.hasNext()(if(ss = null)(ss = iter.next() + :;e

38、lse(ss += iter.next() + :;for(int i = 0; i array.size(); i+)(try oos = new ObjectOutputStream(Socket) array.get(i).getOutputStream();oos.writeObject(列表:+ ss); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace();else if(sarr0.equals(私聊)Socket socke = (Socket)map.get(sarr2);oos=newObjectOutputStream(socke.getOutputStream();oos.writeObject(s);else if(sarr0.equals(群聊)for(int i =

温馨提示

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

评论

0/150

提交评论