已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA期末大作业开发文档学院:电子工程学院专业:电子信息科学与技术班级:2013211202姓名:学号:小组成员:一 选题我们三人选择了网络通信程序这一题目,题目要求包括:能够实现双方通过服务器建立通信连接,实现一对一的聊天;能够通过服务器,采用多线程实现多人间的群聊;能够实现文字通信和传输图片;能够保存通信记录到本地。 我们在此基础上还实现了发送振动消息以及发送文件的功能。二 需求分析1.首先我们进行了系统的功能分析,这个通信程序分为客户端和服务器两个部分:服务器端主要负责监听客户端的连接请求,把这个请求通过网络发送给服务器端进行处理,把客户端(请求方)的聊天请求、发送文件请求、发送振动消息请求等转发给目标客户端(接收方):而客户端负责发送请求并处理服务器端返回的响应消息。整体框图构造如下 1.当前在线用户 服 1.ServerMain.java-启动监听器 2.已注册的用户 务 3.当前监听端口 器 监 1.用户注册 听 2.用户登录 模 2.server.controller.java处理客户端的请求 3.断开连接 块 4.聊天 5.振动 6.文件收发网 络 1.当前在线用户通 3.server.ui.java服务器信息显示窗体 2.所有注册用户信 3.时间系 1.clientMain.java-连接服务器、启动登录窗口统 1.登录窗体 用 2.注册窗体整 户 2.client.ui.java显示客户端各个窗体 3.聊天窗体体 模 4.提示对话框构 块 5.窗体振动器架 搭 建 3.client.clientThread.java-客户端后台线程 接收和处理服务器返回的响应 4.client.util.JFrameShaker-实现窗体振动三 概要设计通过之前的需求分析,可以看出项目的包主要包括服务器和客户端两个包,然而主要功能的实现,具体需要分为以下六个模块:1) 服务器监听模块2) 客户端用户登录模块3) 客户端客户注册模块4) 聊天模块5) 发送文件模块6) 发送振动消息模块四 主要功能实现及大体设计过程 1. 服务器监听模块功能实现服务器监听模块实现了在服务器监听窗口中显示当前在线用户列表和已注册用户列表,可以通过单击标签切换选项卡。在窗体的右下角处显示时间,单击关闭按钮将会弹出提示,并实现最小化到托盘。1).关闭提示2).注册列表3).在线列表在实际操作中,我们三人分工合作,我主要负责服务器监听模块,所以该模块具体的实现方法将在该文档最后一个版块给出。2.客户端用户登录模块实现功能用户登录模块实现了当服务器监听程序启动以后,就可以运行客户端登录到服务器,能美观简洁的显示登录窗口,可以在登录窗口中输入账号和密码,系统进行匹配,如果正确则成功登录,将界面转换到聊天窗体,如果不成功将会出现提示窗,如密码与账号有误或多次重复登录,系统都将进行报错。登录后服务器会将上线用户的信息发送给所有用户1).登录窗体2)系统报错3)系统报错4)用户上下线提示2.1该模块主要由clientMain类实现与服务器的连接及启动,属于package client.主要代码public class ClientMain public static void main(String args) connection(); /连接到服务器/设置外观感觉JFrame.setDefaultLookAndFeelDecorated(true);JDialog.setDefaultLookAndFeelDecorated(true);try /UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName();UIManager.setLookAndFeel(new SubstanceOfficeSilver2007LookAndFeel();UIManager.setLookAndFeel(new SubstanceBusinessLookAndFeel(); catch (Exception e) e.printStackTrace();new LoginFrame(); /启动登录窗体/* 连接到服务器 */public static void connection() String ip = DataBuffer.configProp.getProperty(ip);int port = Integer.parseInt(DataBuffer.configProp.getProperty(port);try DataBuffer.clientSeocket = new Socket(ip, port);DataBuffer.oos = new ObjectOutputStream(DataBuffer.clientSeocket.getOutputStream();DataBuffer.ois = new ObjectInputStream(DataBuffer.clientSeocket.getInputStream(); catch (Exception e) JOptionPane.showMessageDialog(new JFrame(), 连接服务器失败,请检查!,服务器未连上, JOptionPane.ERROR_MESSAGE);/否则连接失败System.exit(0);2.2该模块主要由client.ui.LoginFrame实现窗体,主要代码如下public class LoginFrame extends JFrame private static final long serialVersionUID = -3426717670093483287L;private JTextField idTxt;private JPasswordField pwdFld;public LoginFrame()this.init();setVisible(true);public void init()this.setTitle(JQ登录);this.setSize(330, 230);/设置默认窗体在屏幕中央int x = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();int y = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();this.setLocation(x - this.getWidth() / 2, (y-this.getHeight()/ 2);this.setResizable(false);/把Logo放置到JFrame的北边Icon icon = new ImageIcon(images/logo.png);JLabel label = new JLabel(icon);this.add(label, BorderLayout.NORTH);/登录信息面板JPanel mainPanel = new JPanel();Border border = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);mainPanel.setBorder(BorderFactory.createTitledBorder(border, 输入登录信息, TitledBorder.CENTER,TitledBorder.TOP);this.add(mainPanel, BorderLayout.CENTER);mainPanel.setLayout(null);JLabel nameLbl = new JLabel(账号:);nameLbl.setBounds(50, 30, 40, 22);mainPanel.add(nameLbl);idTxt = new JTextField();idTxt.setBounds(95, 30, 150, 22);idTxt.requestFocusInWindow();/用户名获得焦点mainPanel.add(idTxt);JLabel pwdLbl = new JLabel(密码:);pwdLbl.setBounds(50, 60, 40, 22);mainPanel.add(pwdLbl);pwdFld = new JPasswordField();pwdFld.setBounds(95, 60, 150, 22);mainPanel.add(pwdFld);/按钮面板放置在JFrame的南边JPanel btnPanel = new JPanel();this.add(btnPanel, BorderLayout.SOUTH);btnPanel.setLayout(new BorderLayout();btnPanel.setBorder(new EmptyBorder(2, 8, 4, 8); JButton registeBtn = new JButton(注册);btnPanel.add(registeBtn, BorderLayout.WEST);JButton submitBtn = new JButton(登录);btnPanel.add(submitBtn, BorderLayout.EAST);/关闭窗口this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e) Request req = new Request();req.setAction(exit);try ClientUtil.sendTextRequest(req); catch (IOException ex) ex.printStackTrace();finallySystem.exit(0););3.客户端用户注册模块该模块实现的功能是新用户可以立刻注册一个账号,注册的请求将会发送到服务器,服务器作出响应。可实现注册新的账号新的昵称,可选择头像。1)注册成功3.1用户注册的功能是通过client.ui.RegisterFramel类来实现的,具体代码如下:public void init()this.setTitle(注册JQ新账号);/设置标题setBounds(DataBuffer.screenSize.width - 387)/2, (DataBuffer.screenSize.height - 267)/2, 387, 267);getContentPane().setLayout(null);setResizable(false);JLabel label = new JLabel(昵称:); /label显示label.setBounds(24, 36, 59, 17);getContentPane().add(label);nickname = new JTextField(); /昵称nickname.setBounds(90, 34, 110, 22);getContentPane().add(nickname);JLabel label5 = new JLabel(密码:*);label5.setBounds(24, 72, 50, 17);getContentPane().add(label5);JLabel label3 = new JLabel(确认密码:*);label3.setBounds(24, 107, 65, 17);getContentPane().add(label3);pwdFld = new JPasswordField();/密码框pwdFld.setBounds(90, 70, 110, 22);getContentPane().add(pwdFld);pwd2Fld = new JPasswordField();pwd2Fld.setBounds(90, 105, 110, 22);getContentPane().add(pwd2Fld);JLabel label4 = new JLabel(性别:);label4.setBounds(230, 36, 31, 17);getContentPane().add(label4);sex1 = new JRadioButton(男,true);sex1.setBounds (268, 31,44, 25);getContentPane().add(sex1);sex0 = new JRadioButton(女);sex0.setBounds(310, 31, 44, 25);getContentPane().add(sex0);ButtonGroup buttonGroup = new ButtonGroup();/单选按钮组buttonGroup.add(sex0);buttonGroup.add(sex1);JLabel label6 = new JLabel(头像:);label6.setBounds(230, 72, 31, 17);getContentPane().add(label6);head = new JComboBox();/下拉列表图标head.setBounds(278, 70, 65, 45);head.setMaximumRowCount(5);for (int i = 0; i 11; i+) head.addItem(new ImageIcon(images/ + i + .png);/通过循环添加图片,注意图片名字要取成1,2,3,4,5,等head.setSelectedIndex(0);getContentPane().add(head);/按钮ok = new JButton(确认);ok.setBounds(27, 176, 60, 28);getContentPane().add(ok);reset = new JButton(重填);reset.setBounds(123, 176, 60, 28);getContentPane().add(reset);cancel = new JButton(取消);cancel.setBounds(268, 176, 60, 28);getContentPane().add(cancel);/注册事件监听器/取消按钮监听事件处理cancel.addActionListener(new ActionListener() public void actionPerformed(final ActionEvent event) RegisterFrame.this.dispose(););/关闭窗口this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e) RegisterFrame.this.dispose(););/ 重置按钮监听事件处理reset.addActionListener(new ActionListener() public void actionPerformed(final ActionEvent e) nickname.setText();pwdFld.setText();pwd2Fld.setText();nickname.requestFocusInWindow();/用户名获得焦点);/确认按钮监听事件处理ok.addActionListener(new ActionListener() public void actionPerformed(final ActionEvent e) if (pwdFld.getPassword().length=0 | pwd2Fld.getPassword().length=0) JOptionPane.showMessageDialog(RegisterFrame.this, 带 “ * ” 为必填内容!);/判断用户名和密码是否为空 else if (!new String(pwdFld.getPassword().equals(new String(pwd2Fld.getPassword() JOptionPane.showMessageDialog(RegisterFrame.this, 两次输入密码不一致!);pwdFld.setText();pwd2Fld.setText();pwdFld.requestFocusInWindow();/判断两次密码是否一致 else User user = new User(new String(pwdFld.getPassword(), nickname.getText(), sex0.isSelected() ? m : f, head.getSelectedIndex();try RegisterFrame.this.registe(user); catch (IOException e1) e1.printStackTrace(); catch (ClassNotFoundException ex) ex.printStackTrace(););/注册方法private void registe(User user) throws IOException, ClassNotFoundExceptionRequest request = new Request();request.setAction(userRegiste);request.setAttribute(user, user);/获取响应Response response = ClientUtil.sendTextRequest(request);ResponseStatus status = response.getStatus();switch(status)case OK:User user2 = (User)response.getData(user);JOptionPane.showMessageDialog(RegisterFrame.this, 恭喜您,您的Q号:+ user2.getId() + ,请牢记!,注册成功,JOptionPane.INFORMATION_MESSAGE);this.setVisible(false);break;default:JOptionPane.showMessageDialog(RegisterFrame.this, 注册失败,请稍后再试!,服务器内部错误!,JOptionPane.ERROR_MESSAGE);4.聊天模块功能的实现聊天模块实现的功能如下,当有两个或以上用户登录,就可以聊天了,首先对聊天窗体进行了布局,右边分为当前在线用户列表,该表是随着服务器的响应实时更新的,右下是当前用户信息,左半部分是聊天区域及编辑区域,中间是功能选项,有发送文件和发送振动的功能,左上是聊天状态显示区域,可显示当前是私聊还是群聊。私聊功能的实现是通过在在线好友列表中选中私聊对象后勾选私聊复选框实现。1) 群聊状态2) 私聊状态4.1聊天模块功能的实现主要通过client.ui.chatFrame类来实现,由于代码比较多,所以再分为几个小类,由client.model.entity.OnlineuserListModel来实现聊天窗体中在线用户列表的数据模型,用client.model.entity.MyCellRender类来实现聊天窗体中在线用户列表的单元格渲染。具体代码如下:public void init()this.setTitle(JQ聊天室);this.setSize(550, 500);this.setResizable(false);/设置默认窗体在屏幕中央int x = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();int y = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();this.setLocation(x - this.getWidth() / 2, (y-this.getHeight()/ 2);/左边主面板JPanel mainPanel = new JPanel();mainPanel.setLayout(new BorderLayout();/右边用户面板JPanel userPanel = new JPanel();userPanel.setLayout(new BorderLayout();/ 创建一个分隔窗格JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,mainPanel, userPanel);splitPane.setDividerLocation(380);splitPane.setDividerSize(10);splitPane.setOneTouchExpandable(true);this.add(splitPane, BorderLayout.CENTER);/左上边信息显示面板JPanel infoPanel = new JPanel();infoPanel.setLayout(new BorderLayout();/右下连发送消息面板JPanel sendPanel = new JPanel();sendPanel.setLayout(new BorderLayout();/ 创建一个分隔窗格JSplitPane splitPane2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,infoPanel, sendPanel);splitPane2.setDividerLocation(300);splitPane2.setDividerSize(1);mainPanel.add(splitPane2, BorderLayout.CENTER);otherInfoLbl = new JLabel(当前状态:群聊中.);infoPanel.add(otherInfoLbl, BorderLayout.NORTH);msgListArea = new JTextArea();msgListArea.setLineWrap(true);infoPanel.add(new JScrollPane(msgListArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);JPanel tempPanel = new JPanel();tempPanel.setLayout(new BorderLayout();sendPanel.add(tempPanel, BorderLayout.NORTH);/ 聊天按钮面板JPanel btnPanel = new JPanel();btnPanel.setLayout(new FlowLayout(FlowLayout.LEFT);tempPanel.add(btnPanel, BorderLayout.CENTER);/字体按钮JButton fontBtn = new JButton(new ImageIcon(images/font.png);fontBtn.setMargin(new Insets(0,0,0,0);fontBtn.setToolTipText(设置字体和格式);btnPanel.add(fontBtn);/表情按钮JButton faceBtn = new JButton(new ImageIcon(images/sendFace.png);faceBtn.setMargin(new Insets(0,0,0,0);faceBtn.setToolTipText(选择表情);btnPanel.add(faceBtn);/发送文件按钮JButton shakeBtn = new JButton(new ImageIcon(images/shake.png);shakeBtn.setMargin(new Insets(0,0,0,0);shakeBtn.setToolTipText(向对方发送窗口振动);btnPanel.add(shakeBtn);/发送文件按钮JButton sendFileBtn = new JButton(new ImageIcon(images/sendPic.png);sendFileBtn.setMargin(new Insets(0,0,0,0);sendFileBtn.setToolTipText(向对方发送文件);btnPanel.add(sendFileBtn);/私聊按钮rybqBtn = new JCheckBox(私聊);tempPanel.add(rybqBtn, BorderLayout.EAST);/要发送的信息的区域sendArea = new JTextArea();sendArea.setLineWrap(true);sendPanel.add(new JScrollPane(sendArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);/ 聊天按钮面板JPanel btn2Panel = new JPanel();btn2Panel.setLayout(new FlowLayout(FlowLayout.RIGHT);this.add(btn2Panel, BorderLayout.SOUTH);JButton closeBtn = new JButton(关闭);closeBtn.setToolTipText(退出整个程序);btn2Panel.add(closeBtn);JButton submitBtn = new JButton(发送);submitBtn.setToolTipText(按Enter键发送消息);btn2Panel.add(submitBtn);sendPanel.add(btn2Panel, BorderLayout.SOUTH);/在线用户列表面板JPanel onlineListPane = new JPanel();onlineListPane.setLayout(new BorderLayout();onlineCountLbl = new JLabel(在线用户列表(1);onlineListPane.add(onlineCountLbl, BorderLayout.NORTH);/当前用户面板JPanel currentUserPane = new JPanel();currentUserPane.setLayout(new BorderLayout();currentUserPane.add(new JLabel(当前用户), BorderLayout.NORTH);/ 右边用户列表创建一个分隔窗格JSplitPane splitPane3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,onlineListPane, currentUserPane);splitPane3.setDividerLocation(340);splitPane3.setDividerSize(1);userPanel.add(splitPane3, BorderLayout.CENTER);/获取在线用户并缓存DataBuffer.onlineUserListModel = new OnlineUserListModel(DataBuffer.onlineUsers);/在线用户列表 onlineList = new JList(DataBuffer.onlineUserListModel);onlineList.setCellRenderer(new MyCellRenderer();/设置为单选模式onlineList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);onlineListPane.add(new JScrollPane(onlineList,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);/当前用户信息LabelcurrentUserLbl = new JLabel();currentUserPane.add(currentUserLbl);/注册事件监听器/关闭窗口this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e) logout(););/关闭按钮的事件closeBtn.addActionListener(new ActionListener() public void actionPerformed(ActionEvent event) logout();/选择某个用户私聊rybqBtn.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) if(rybqBtn.isSelected()User selectedUser = (User)onlineList.getSelectedValue();if(null = selectedUser)otherInfoLbl.setText(当前状态:私聊(选中在线用户列表中某个用户进行私聊).);else if(DataBuffer.currentUser.getId() = selectedUser.getId()otherInfoLbl.setText(当前状态:想自言自语?.系统不允许);elseotherInfoLbl.setText(当前状态:与 + selectedUser.getNickname()+( + selectedUser.getId() + ) 私聊中.);elseotherInfoLbl.setText(当前状态:群聊.););/选择某个用户onlineList.addMouseListener(new MouseAdapter() public void mouseClicked(MouseEvent e) User selectedUser = (User)onlineList.getSelectedValue();if(rybqBtn.isSelected()if(DataBuffer.currentUser.getId() = selectedUser.getId()otherInfoLbl.setText(当前状态:想自言自语?.系统不允许);elseotherInfoLbl.setText(当前状态:与 + selectedUser.getNickname()+( + selectedUser.getId() + ) 私聊中.););/发送文本消息sendArea.addKeyListener(new KeyAdapter() public void keyPressed(KeyEvent e) if(e.getKeyCode() = Event.ENTER) sendTxtMsg(););submitBtn.addActionListener(new ActionListener() public void actionPerformed(ActionEvent event) sendTxtMsg(););4.2Client.ClientThread是客户端后台线程类,专门用来接收和处理服务器返回的响应。具体代码如下public class ClientThread extends Thread private JFrame currentFrame; /当前窗体public ClientThread(JFrame frame)currentFrame = frame;public void run() try while (DataBuffer.clientSeocket.isConnected() Response response = (Response) DataBuffer.ois.readObject();ResponseType type = response.getType();System.out.println(获取了响应内容: + type);if (type = ResponseType.LOGIN) User newUser = (User)response.getData(loginUser);DataBuffer.onlineUserListModel.addElement(newUser);ChatFrame.onlineCountLbl.setText(在线用户列表(+ DataBuffer.onlineUserListModel.getSize() +);ClientUtil.appendTxt2MsgListArea(【系统消息】用户+newUser.getNickname() + 上线了!n); else if(type = ResponseType.LOGOUT)User newUser = (User)response.getData(logoutUser);DataBuffer.onlineUserListModel.removeElement(newUser);ChatFrame.onlineCountLbl.setText(在线用户列表(+ DataBuffer.onlineUserListModel.getSize() +);Clie
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年湖南常德鼎城区部分机关事业单位区内选调49人笔试备考试题及答案解析
- 2026四川绵阳市五八机器人科技有限责任公司外部招聘工作人员34人(2026年第一批次)考试参考题库及答案解析
- 2026湖南郴州北湖机场有限公司面向社会残疾人员招聘1人笔试备考试题及答案解析
- 2026重庆九龙坡区杨家坪小学招聘1人笔试备考题库及答案解析
- 2026上半年贵州事业单位联考实验中学招聘3人考试参考题库及答案解析
- 2026年急救技能实操演练培训
- 2026新疆维吾尔自治区天山东部国有林管理局沙湾分局招聘森林管护人员6人笔试备考题库及答案解析
- 2026年国画技法传承创新培训
- 2026年安庆市某电力外包工作人员招聘2名笔试参考题库及答案解析
- 2025年单县教师事业编考试真题及答案
- 2026中国电信四川公用信息产业有限责任公司社会成熟人才招聘备考题库及参考答案详解1套
- 2025年广东省生态环境厅下属事业单位考试真题附答案
- 2023春国开农业经济基础单元自测1-16试题及答案
- 2023年高铁信号车间副主任述职报告
- GB/T 879.4-2000弹性圆柱销卷制标准型
- GB/T 1957-2006光滑极限量规技术条件
- GB 28480-2012饰品有害元素限量的规定
- 刘一秒演说智慧经典(内部笔记)
- 管道TOFD检测记录及续表
- 马克思主义哲学精讲课件
- 期末考试总安排
评论
0/150
提交评论