




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java2实用教程课程设计报告 08软件工程2班 081403223 Java2实用教程课程设计报告课题名称:用JAVA设计的聊天软件系别: 计算机科学系 班级: 08软件工程2班 学号: 081403223 姓名: 目录一、 课程设计的目标二、 开发及运行环境三、 设计方法1. 程序功能1) 服务器功能2) 客户端功能2. 程序实现3. 类的实现4. 程序结果 1)服务器端的运行结果 2)客户端的运行结果四、 设计心得五、 参考文献 一、 课程设计的目标此次课程设计的目标是用JAVA语言实现一个功能比较完善的聊天软件,功能包含(用户注册、登录、修改昵称、更新心情、查找并添加好友、基本的文字聊天、传送文件、发送图片、窗口抖动、保存聊天记录等等 ),在设计该软件的过程中,综合运用了本学期所学的所有JAVA语言的基本知识,特别是线程、数据库、Swing、异常处理等知识。通过这次课程设计,使我们对JAVA语言以及面向对象编程有了更深的体会,我们的程序设计能力也有了很大地提高。二、 开发及运行环境硬件:PC机操作系统:Windows XP 数据库:MySQL开发工具:EclipseJDK 要求 jdk 7.0 三、 设计方法1. 程序功能(1) 服务器功能(2) 客户端功能层次功能图:程序流程:(1)登录模块流程图(2) 注册模块流程图(3)发送文件模块流程图 2. 程序实现客户端:设计的类功能FriendData保存每个好友的数据类FriendList保存好友列表类FriendMap保存好友图类PersonalData保存自己的数据类UserManager管理数据库处理相关函数的类ChatMainMap管理主界面的图类ChatWinMap管理聊天窗口的图类ClientConnServerThread客户端连接到服务器的线程类ClientThreadMap管理客户端的线程类FileClient接收文件的客户端类FileServer发送文件的服务器类LoginCheck客户端登录检验类ConnMySQL建立连接数据库类ChatLogin登录界面类ChatMain_center主界面中间部分面板类ChatMain主界面类ChatWindow_right聊天窗口右侧面板类ChatWindow聊天窗口类ConfirmRequestMessage确认消息框MessageBox自定义普通消息框Online_message上线消息框ReceiverFileTransMessage接收文件确认消息框ReceiverMessage消息管理器类ReceiverRequestMessage好友请求显示框Register注册面板TransportFile发送文件的文件选择器FileTranMes发送文件携带信息类Message发送信息类MessageType信息类型User用户ColorTools自定义颜色工具FontTools自定义字体工具ImagePanel图片面板ChatServer服务器处理类ServerConnClientThread服务器接收线程类ThreadMap管理客户端连接到服务器的线程类ServerWindow服务器窗口类服务器端:设计的类功能ChatServer服务器处理类ServerConnClientThread服务器接收线程类ThreadMap管理客户端连接到服务器的线程类ServerWindow服务器窗口类Message发送信息类MessageType信息类型User用户3. 类的实现各主要类的方法、函数的核心代码:(附:源代码)(1) 数据库处理源代码:/* * 在数据库中查询用户的资料,保存在本地的PersonalData中 * return */public void checkPersonalData(String id)PersonalData pd = PersonalData.getInstance();Connection conn = null;ResultSet rs = null;PreparedStatement pstmt = null;String sql = select * from user where userid=?;try conn = ConnMySQL.getConnection();pstmt = conn.prepareStatement(sql);pstmt.setString(1, id);rs = pstmt.executeQuery();if (rs.next() pd.setUserId(rs.getString(userId);pd.setUserName(rs.getString(username);pd.setPicNo(rs.getString(picNo);catch(SQLException e) e.printStackTrace();finally ConnMySQL.close(rs);ConnMySQL.close(pstmt);ConnMySQL.close(conn);(2) 其他数据处理关键语句:/* * 在数据库中查询用户的资料,保存在本地的PersonalData中 * return */String sql = select * from user where userid=?;/* * 在数据库中查询最新的心情 * return */String sql = select moodcontent from moodlist where moodid = (select max(moodid)from moodlist where pid=?);/* * 查找用户的所有好友,保存在本地程序中 * param id * return */String sql = select * from user where userId in (select friendid from relationlist where pid=?);/* * 修改用户的昵称 * return */String sql = update user set username=? where userId=?;/* * 修改用户的密码 * return */String sql = update user set password=? where userId=?;/* * 获取自动编号ID * param gen_name * return */String sql = select gen_number from generator where gen_name =?;/* * 更新Id维护列表,此方法给此类别的函数调用 * param gen_name * param current_id * param conn */String sql = update generator set gen_number =? where gen_name = ?;/* * 添加心情 * param userId * param mood * return */String sql = insert into moodlist values(?,?,?,?);String sql = select * from moodlist order by moodId desc limit 20;/* * 加好友 * param args */String sql = insert into relationlist values(?,?,?);String sql = insert into user values(?,?,?,?);(3) 客户端接收线程的run()函数:public void run() while(run1)try ObjectInputStream ois = new ObjectInputStream(sk.getInputStream();Message mes = (Message)ois.readObject();String messageType = mes.getMessageType();String sender = mes.getSender();String receiver = mes.getReceiver();if(messageType.equals(MessageType.CONTENT) | messageType.equals(MessageType.EXPRESSION) /System.out.println(receiver);ChatWindow cw = ChatWinMap.getChatWindow(sender);/System.out.println(来自用户+cw);if(null = cw)if(null != FriendMap.getFriendData(mes.getSender() ReceiverMessage rm = new ReceiverMessage(mes);Thread th = new Thread(rm);th.start(); else cw.showMessage(mes); else if(messageType.equals(MessageType.ON_LINE) System.out.println(更新在线好友);String all_online_ip = mes.getAll_online_id().split(,);ChatMainMap.getChatMain(mes.getReceiver().getJp_center().changeOnlineState(all_online_ip);Online_message on_mes = new Online_message(mes.getSender();Thread th = new Thread(on_mes);th.start(); else if(messageType.equals(MessageType.SHAKE_WIN) ChatWindow cw = ChatWinMap.getChatWindow(sender);Thread th = new Thread(cw);th.start();cw.showMessage(mes); else if(messageType.equals(MessageType.REQUEST)/把该好友的资料丛数据库中取出并保存在客户端程序中ReceiverRequestMessage rsm = new ReceiverRequestMessage(mes);Thread th = new Thread(rsm);th.start(); else if(messageType.equals(MessageType.REQUEST_CONFIRM) /把双边的关系加入数据库UserManager.getInstance().addFriend(mes.getSender(), mes.getReceiver();System.out.println(保存好友:+mes.getSender();System.out.println(mes.getReceiver();UserManager.getInstance().addFriend(mes.getReceiver(),mes.getSender();/把该好友资料从数据库中取得并保存在客户端程序中String fds = UserManager.getInstance().checkUser(mes.getSender();FriendData fd = new FriendData();fd.setFriendId(fds0);fd.setFriendName(fds1);fd.setFriendPic(fds2);FriendList.getFriendList().add(fd);FriendMap.addFriendData(fds0, fd);/更新好友列表String all_ip = mes.getAll_online_id();ChatMainMap.getChatMain(PersonalData.getUserId().updataCenter(all_ip);ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start(); else if(messageType.equals(MessageType.REQUEST_REFUSE)ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start(); else if(messageType.equals(MessageType.NOT_ONLINE) MessageBox msb = new MessageBox(对方不在线);Thread th = new Thread(msb);th.start(); else if(messageType.equals(MessageType.OFF_LINE) System.out.println(有人下线了);/更新好友列表if(sender.equals(PersonalData.getUserId() break;String all_ip = mes.getAll_online_id();System.out.println(当前在线好友:+mes.getAll_online_id();ChatMainMap.getChatMain(PersonalData.getUserId().updataCenter(all_ip); else if(messageType.equals(MessageType.FILE_TRAN) ReceiverFileTransMessage rftm = new ReceiverFileTransMessage(mes);Thread th = new Thread(rftm);th.start(); else if(messageType.equals(MessageType.FILE_TRAN_CONFIRM) ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start(); else if(messageType.equals(MessageType.FILE_TRAN_REFUSE) ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start();catch (Exception e) e.printStackTrace();(4) 接收文件的客户端run()函数public void run() Socket server;try server = new Socket(msg.getFileTranMes().getServerIp(), Integer.parseInt(msg.getFileTranMes().getServerPort();/创建网络接受流接受服务器文件数据InputStream netIn = server.getInputStream();InputStream in = new DataInputStream(new BufferedInputStream(netIn);/创建缓冲区缓冲网络数据/System.out.println(传输文件的长度:+in.available();byte buf = new byte2048;int num = in.read(buf);while (num != (-1) /是否读完所有数据raf.write(buf, 0, num);/将数据写往文件raf.skipBytes(num);/顺序写文件字节num = in.read(buf);/继续从网络中读取文件width = width+1;width_1 = width/size * 180;jl2.setBounds(10,40,(int)(width_1),20);jl2.setText( +(int)(width/size*100)+%);jl2.setText(传送完成);in.close();raf.close(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();(5) 发送文件的服务器run()函数public void run() /创建网络服务器接受客户请求ServerSocket ss;Socket client = null;try ss = new ServerSocket(5678);client = ss.accept(); catch (IOException e) / TODO Auto-generated catch block/e.printStackTrace();/创建网络输出流并提供数据包装器OutputStream netOut;try netOut = client.getOutputStream();OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut);/创建文件读取缓冲区byte buf = new byte2048;int num = fos.read(buf);while (num != (-1) /是否读完文件doc.write(buf, 0, num);/把文件数据写出网络缓冲区doc.flush();/刷新缓冲区把数据写往客户端num = fos.read(buf);/继续从文件中读取数据width = width+1;width_1 = width/size * 180;jl2.setBounds(10,40,(int)(width_1),20);jl2.setText( +(int)(width/size*100)+%);jl2.setText(传送完成);fos.close();doc.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();(6) 客户端登录验证的函数public boolean CheckUser (Message msg) boolean check = false;try sk = new Socket(ip,port);System.out.println(获取socket); catch (UnknownHostException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();try ObjectOutputStream oos = new ObjectOutputStream(sk.getOutputStream();oos.writeObject(msg);ObjectInputStream ois=new ObjectInputStream(sk.getInputStream();Message mss=(Message)ois.readObject();if(mss.getMessageType().equals(MessageType.ON_LINE)ClientConnServerThread ccst = new ClientConnServerThread(sk);System.out.println(赋给ClietThreadMap的id: + mss.getUser().getUserId();ClientThreadMap.setClientThreadHm(mss.getUser().getUserId(), ccst);ccst.start();User u = mss.getUser();/在这里查询数据库中用户的信息,并保存在客户端程序中UserManager.getInstance().checkPersonalData(u.getUserId();PersonalData.setMood(UserManager.getInstance().checkMood(u.getUserId();UserManager.getInstance().checkAllFriend(u.getUserId();ChatMain cm = new ChatMain(u,mss);ChatMainMap.addChatMain(u.getUserId(), cm);check = true; else if(mss.getMessageType().equals(MessageType.ON_LINE_FAIL) /JOptionPane.showMessageDialog(null, 用户名或密码错误);MessageBox msgb = new MessageBox(用户名或密码错误!);Thread th = new Thread(msgb);th.start();ois.close();oos.close();sk.close(); catch (Exception e) e.printStackTrace();return check;(7) 连接数据库的函数public static Connection getConnection() Connection conn = null;try Class.forName(com.mysql.jdbc.Driver);conn = DriverManager.getConnection(jdbc:mysql:/localhost/chatdata?user=user1&password=m123); catch (Exception ex) ex.printStackTrace();return conn;(8) 发送消息的响应事件:if(e.getSource() = jb_send) if(cardNo = 0) Date time = new Date();SimpleDateFormat sdf = new SimpleDateFormat(hh:mm:ss);String sendtime = sdf.format(time);Document doc = jta.getDocument();try doc.insertString(jta.getDocument().getLength(),PersonalData.getUserName()+(+this.userId+) +sendtime+n, null);doc.insertString(jta.getDocument().getLength(), +jta_send.getText()+n, null); catch (BadLocationException e2) / TODO Auto-generated catch blocke2.printStackTrace();String sendMes = jta_send.getText();jta_send.setText();Message mes = new Message();mes.setSender(this.userId);mes.setReceiver(this.receiveId);/System.out.println(发送前receiverId的值:+receiveId);mes.setContent(sendMes);mes.setSendtime(sendtime);mes.setPic_no(PersonalData.getPicNo();mes.setMessageType(MessageType.CONTENT);try ObjectOutputStream oos = new ObjectOutputStream(ClientThreadMap.getClientThreadHm(this.userId).getSocket().getOutputStream();oos.writeObject(mes); catch (Exception e1) e1.printStackTrace(); else Date time = new Date();SimpleDateFormat sdf = new SimpleDateFormat(MM-DD hh:mm:ss);String sendtime = sdf.format(time);Document doc = jta.getDocument();try doc.insertString(jta.getDocument().getLength(),PersonalData.getUserName()+(+this.userId+) +sendtime+n, null);doc.insertString(jta.getDocument().getLength(), , null);jta.setCaretPosition(doc.getLength();jta.insertIcon(new ImageIcon(images/+faceNo+.gif); doc.insertString(jta.getDocument().getLength(), n, null); catch (BadLocationException e1) / TODO Auto-generated catch blocke1.printStackTrace();System.out.println(send picture:+faceNo);String sendMes = faceNo;Message mes = new Message();mes.setSender(this.userId);mes.setReceiver(this.receiveId);mes.setContent(sendMes);mes.setSendtime(sendtime);mes.setMessageType(MessageType.EXPRESSION);try /System.out.println(=准备发送消息=);ObjectOutputStream oos = new ObjectOutputStream(ClientThreadMap.getClientThreadHm(this.userId).getSocket().getOutputStream();/System.out.println(oos+:+mes.getMessageType();oos.writeObject(mes); catch (Exception e1) e1.printStackTrace();(9) 显示消息的函数:public void showMessage(Message ms) try Document doc = chat_window.jta.getDocument();doc.insertString(chat_window.jta.getDocument().getLength(),FriendMap.getFriendData(this.receiveId).getFriendName()+(+ms.getSender()+) +ms.getSendtime()+n, null);if(ms.getMessageType().equals(MessageType.CONTENT)doc.insertString(chat_window.jta.getDocument().getLength(), +ms.getContent()+n, null); else if(ms.getMessageType().equals(MessageType.EXPRESSION)/插入图片doc.insertString(chat_window.jta.getDocument().getLength(), , null);chat_window.jta.setCaretPosition(doc.getLength();chat_window.jta.insertIcon(new ImageIcon(images/+ms.getContent()+.gif); doc.insertString(chat_window.jta.getDocument().getLength(), n, null); else if(ms.getMessageType().equals(MessageType.SHAKE_WIN)doc.insertString(chat_window.jta.getDocument().getLength(), +ms.getContent()+n, null); catch (BadLocationException e) e.printStackTrace();(10) 服务器端等待和验证客户端信息函数public void run() while (true) try System.out.println(服务器正在等待客户端的连接);Socket sk = ssk.accept();ObjectInputStream ois=new ObjectInputStream(sk.getInputStream();Message ms = (Message)ois.readObject();User u = ms.getUser();String password = UserManager.getInstance().checkPersonalData(u.getUserId(); if(null != password)if(u.getPassword().equals(password) System.out.println(验证密码);ServerConnClientThread sct = new ServerConnClientThread(sk);sct.start();ThreadMap.addThread(u.getUserId(), sct);/*验证成功后,把所有在线用户返回给所有的用户*/Iterator it = ThreadMap.hm.entrySet().iterator();String all_id = ;while(it.hasNext() Entry entry = (Entry) it.next(); all_id+=entry.getKey();if(it.hasNext()all_id+=,;/System.out.println(all_id); ms.setAll_online_id(all_id);Iterator it2 = ThreadMap.hm.entrySet().iterator();while(it2.hasNext() Entry entry = (Entry) it2.next();ServerConnClientThread st = (ServerConnClientThread) entry.getValue();ObjectOutputStream oos = new ObjectOutputStream(st.sk.getOutputStream();ms.setReceiver(entry.getKey()+);oos.writeObject(ms); else /密码错误Message mss = new Message();mss.setMessageType(MessageType.ON_LINE_FAIL);mss.setContent(用户密码错误!);ObjectOutputStream oos=new ObjectOutputStream(sk.getOutputStream();oos.writeObject(mss);sk.close(); else /用户不存在Message mss = new Message();mss.setMessageType(MessageType.ON_LINE_FAIL);mss.setContent(该用户不存在);ObjectOutputStream oos=new ObjectOutputStream(sk.getOutputStream();oos.writeObject(mss);sk.close(); catch (Exception e) e.printStackTrace();(11) 服务器转发消息函数public void run() boolean run = true;Message m = null;while(true)try ObjectInputStream ois = new ObjectInputStream(sk.getInputStream();m=(Message)ois.readObject();System.out.println(开始接收数据);String messageType = m.getMessageType();String sender = m.getSender();String receiver = m.getReceiver();if(m.getMessageType().equals(MessageType.OFF_LINE) /重新获取在线IDIterator it = ThreadMap.hm.entrySet().iterator();String all_id = ;while(it.hasNext() Entry entry = (Entry
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业质量性能预测-洞察及研究
- 矿业生物修复技术-洞察及研究
- 碳汇功能动态变化-洞察及研究
- 搪瓷增材制造工艺-洞察及研究
- 地方文化命名研究-洞察及研究
- 跨区域绿色物流调度-洞察及研究
- 【《某复合土工膜防渗堆石坝工程调洪演算计算案例》2000字】
- 【《某水库堆石混凝土重力坝的坝体细部构造设计案例》3300字】
- 二零二五年度国际贸易培训合同样本
- 2025版房地产开发项目中介费合同示范文本
- 2025年佛山转业士官考试题库
- 2025年专业士官考试题库
- 院前急救技能大赛
- 2025年事业单位工勤技能-安徽-安徽水土保持工五级(初级工)历年参考题库含答案解析(5卷套题【单选100题】)
- 2024年武汉广播电视台专项招聘真题
- 高血压尿毒症护理查房
- 2025届山东省青岛五十八中高一物理第二学期期末考试试题含解析
- 智能建筑中机器人的应用与装配式施工技术
- 妇产科子宫脱垂护理查房
- 医院培训课件:《基于医院感染防控的安全注射》
- 专题:根据首字母填空 六年级英语下册期末复习考点培优专项鲁教版(五四学制)(含答案解析)
评论
0/150
提交评论