




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA程序设计课程设计说明书-即时聊天系统院 系: 国际教育学院 专业班级: 互联网10-02班 指导教师: 金松河 _姓 名: 徐亚军 _学 号: 541012010225 成 绩: 2012年 06 月 07 日JAVA程序设计课程设计目 录1 需求分析11.1 用户调查11.2构造系统的逻辑模型11.3 确定目标系统的功能.21.4数据分析概念模型分析.32 总体设计.22.1软件系统结构的设计22.1.1得到新的业务流程.22.1.2系统功能结构图.23 详细设计33.1具体描述33.2具体实现步骤33.3程序源代码.74 总结194.1设计体会.19 1 需求分析1.1用户调查 经过详细的调研,即时聊天工具现在流行于各种人群中,以青少年为主的学生群。主要分为用户注册、用户登录等。即时聊天系统的流程描述如下: 注册,连接服务器后,新用户需要注册,然后才能登录。 注册后才能登录,信息写进数据库。 登录后,可以进行添加好友,找好友聊天,对好友进行管理等操作。 退出,在结束登录时需要退去即时聊天系统,并回到登录界面。根据以上总结,得到其现行的业务流程如图1-1所示。用户办理注册注册界面注册注册至数据库数据库聊天室聊天聊天信息聊天聊天室登录图1-1即时聊天业务流程图1.2 构造系统的逻辑模型 构造系统的逻辑模型的工具是数据流图和数据字典。数据流图中没有任何具体的物理元素,只是用来描绘信息在系统中的流动和处理情况。数据流图共有四种基本符号:矩形表示数据的源点和终点(或称为外部项),圆或椭圆表示变换数据的处理,向右开口的矩形表示数据存储,箭头表示数据流,即特定数据的流动方向。根据现行学生信息管理的业务流程,首先确定数据流图中的源点和终点都选定为学生,如此就得到了学生档案管理系统的基本系统模型,如图1-2所示。匹配信息登录聊天用户基本信息注册 图1-2 即时聊天系统的基本系统模型1.3 确定目标系统的功能 通过详细的用户调查,在现行的业务处理流程和数据流图的基础上,就可以基本确定目标系统要达到的目标了。需求分析的任务是确定系统必须完成的工作,也就是对目标系统提出完整、标准、清晰、具体的要求。在经过多方了解和调查后,基本清楚了即时聊天系统的功能需求,即时聊天系统必须完成以下功能: 注册功能:对于新用户,系统必须能对新用户进行注册,在用户输入各项信息后,将信息保存进数据库。 登录功能:在新用户注册完成后,系统能在用户输入登录信息后,连接数据库并匹配用户登录信息,使该用户能登录服务器。 添加好友功能:用户能通过添加好友按钮就行好友添加。 即时聊天功能:作为本系统的最主要功能,用户能即时的和好友聊天,并可以搜索聊天记录。1.4 数据分析概念模型分析需求分析阶段主要有两个方面的任务:分析用户的数据要求和分析用户的处理要求。通过以上分析,我们已经基本了解了用户对处理的要求,接下来需要的工作是分析用户对数据的要求。为了把用户的数据清晰明确地表达出来,系统分析员通常建立一个概念性的数学模型。概念性模型是一种面向问题的数学模型,是按用户的观点来对数据和信息建模。最常用的表示概念性数据模型的方法是实体-联系方法(Entity-Relationship Approach)。这种方法用E-R图描述现实世界中的实体,而不涉及这些实体在系统中的实现方法,该方法又称为E-R模型,E-R图中共用三种符号:实体、属性和联系。通常实体用矩形来表示,属性用椭圆或圆角矩形来表示,联系用菱形来表示。联系有分为一对一、一对多和多对多三种类型。2总体设计系统设计一般分为总体设计和详细设计。经过需求分析阶段的工作,已经清楚系统必须完成的工作,下面的工作就应该是决定“如何做”的问题,总体设计的基本目的的就是“概要地说系统应该如何实现?”。通过该阶段的工作将划分出组成系统的物理元素程序、文件、数据库、文档等,另一方面的主要工作是设计软件的结构,即确定系统都由哪些模块组成及模块之间的相互关系。2.1软件系统结构的设计 2.1.1 得到新的业务流程根据系统分析得到的现行业务处理流程,在与用户反复研究协商后,首先得到目标系统即学生学籍管理系统的业务流程,其处理流程如图2-1所示。注册用户登录信息匹配用户登录结束退出登录聊天聊天记录进入聊天室 图2-1 即时聊天系统的业务流程针对新的处理流程,现具体描述如下: 用户注册:对新用户进行信息录入。 登录:连接数据库,匹配输入登录信息和数据库信息,成功则进入聊天室。 计入聊天室,进行聊天以及对好友的一系列操作。2.1.2系统功能结构图根据系统分析阶段得到的数据流图,采用软件设计的概念和原理,我们能测试程序能否正常运行。3.详细设计31 具体描述聊天操作操作删除好友进入聊天室查看聊天记录用户登录/注册添加好友开始图3-2 软件系统主程序的程序流程图3.2 具体实现步骤:注册界面如下图: 图3-3登录界面如图: 聊天室窗口界面:启动服务器:连接服务器:实现私聊: 图3-5(2)若选择修改操作,则进入如下界面: 界面实现代码:注册界面代码:package t_test;import javax.swing.*;import java.awt.*;import java.awt.event.*;import .*;import java.io.*;public class Register extends JFrame implements ActionListenerprivate JComboBox comboBox;private static final long serialVersionUID = 9019746127517522180L;JPanel pnlRegister;JLabel lblUserName,lblGender,lblAge;JLabel lblPassword,lblConfirmPass,lblEmail,logoPosition;JTextField txtUserName,txtAge,txtEmail;JPasswordField pwdUserPassword,pwdConfirmPass;JRadioButton rbtnMale,rbtnFemale;ButtonGroup btngGender; JButton btnOk,btnCancel,btnClear;String strServerIp;final JLabel headLabel = new JLabel(); Dimension scrnsize; Toolkit toolkit=Toolkit.getDefaultToolkit();public Register(String ip) super(注册);strServerIp=ip;pnlRegister=new JPanel();this.getContentPane().add(pnlRegister);lblUserName=new JLabel(用 户 名:);lblGender=new JLabel(性 别:);lblAge=new JLabel(年 龄:);lblPassword=new JLabel(密码:);lblConfirmPass=new JLabel(确认密码:);lblEmail=new JLabel(电子邮件:);txtUserName=new JTextField(30);txtEmail=new JTextField(30);txtAge=new JTextField(10);pwdUserPassword=new JPasswordField(30);pwdConfirmPass=new JPasswordField(30);rbtnMale=new JRadioButton(男,true);rbtnFemale=new JRadioButton(女); btngGender=new ButtonGroup(); btnOk=new JButton(确定); btnOk.setToolTipText(保存注册信息);btnCancel=new JButton(返回);btnCancel.setToolTipText(返回登录窗口);btnClear=new JButton(清空);btnClear.setToolTipText(清空注册信息);pnlRegister.setLayout(null);lblUserName.setBounds(30,80,100,30);txtUserName.setBounds(110,85,120,20);lblPassword.setBounds(30,141,100,30);pwdUserPassword.setBounds(110,146,120,20);lblConfirmPass.setBounds(30,166,100,30);pwdConfirmPass.setBounds(110,171,120,20);lblGender.setBounds(30,191,100,30);rbtnMale.setBounds(110,196,60,20);rbtnFemale.setBounds(190,196,60,20);lblAge.setBounds(30,216,100,30);txtAge.setBounds(110,221,120,20);lblEmail.setBounds(30,241,100,30);txtEmail.setBounds(110,246,120,20); btnOk.setBounds(246,166,80,25); btnCancel.setBounds(246,201,80,25); btnClear.setBounds(246,241,80,25);Font fontstr=new Font(宋体,Font.PLAIN,12);lblUserName.setFont(fontstr); lblGender.setFont(fontstr);lblPassword.setFont(fontstr);lblConfirmPass.setFont(fontstr);lblAge.setFont(fontstr);lblEmail.setFont(fontstr); rbtnMale.setFont(fontstr);rbtnFemale.setFont(fontstr);txtUserName.setFont(fontstr);txtEmail.setFont(fontstr);btnOk.setFont(fontstr);btnCancel.setFont(fontstr);btnClear.setFont(fontstr);rbtnMale.setOpaque(false); rbtnFemale.setOpaque(false);pnlRegister.add(lblUserName);pnlRegister.add(lblPassword);pnlRegister.add(lblConfirmPass);pnlRegister.add(lblEmail);pnlRegister.add(lblAge);pnlRegister.add(txtAge);pnlRegister.add(txtUserName);pnlRegister.add(txtEmail);pnlRegister.add(pwdUserPassword);pnlRegister.add(pwdConfirmPass);pnlRegister.add(btnOk);pnlRegister.add(btnCancel);pnlRegister.add(btnClear);pnlRegister.add(rbtnMale);pnlRegister.add(rbtnFemale);btngGender.add(rbtnMale); btngGender.add(rbtnFemale); this.setSize(360,313);this.setVisible(true);this.setResizable(false);btnOk.addActionListener(this);btnCancel.addActionListener(this);btnClear .addActionListener(this);public void actionPerformed(ActionEvent ae)Object source=new Object(); source=ae.getSource(); if (source.equals(btnOk) register(); if (source.equals(btnCancel) new Login(); this.dispose(); if (source.equals(btnClear) txtUserName.setText(); pwdUserPassword.setText(); pwdConfirmPass.setText(); txtAge.setText(); txtEmail.setText(); public void register() Register_Customer data=new Register_Customer(); data.custName = txtUserName.getText();data.custPassword = pwdUserPassword.getText();data.age = txtAge.getText();data.sex = rbtnMale.isSelected()?男:女;data.email = txtEmail.getText();/chenminif(data.custName.length()=0) JOptionPane.showMessageDialog(null,用户名不能为空); return;if(data.custPassword.length()=0) JOptionPane.showMessageDialog(null,密码不能为空); return;if(!data.custPassword.equals(pwdConfirmPass.getText() JOptionPane.showMessageDialog(null,密码两次输入不一致,请重新输入); return;int age=Integer.parseInt(txtAge.getText();if (age100)JOptionPane.showMessageDialog(null,年龄输入不合法);return;int Found_flag=0; /判断标志for (int i=0;idata.email.length();i+) if(data.email.charAt(i)=) Found_flag+; if(Found_flag!=1) JOptionPane.showMessageDialog(null,电子邮箱格式不正确,请重新输入); return;data_test dt=new data_test();dt.addData(1,data.custName, data.custPassword, data.sex, data.age, data.email);try Socket toServer; toServer = new Socket(strServerIp,1001); ObjectOutputStream streamToServer=new ObjectOutputStream (toServer.getOutputStream(); streamToServer.writeObject(Register_Customer)data); BufferedReader fromServer=new BufferedReader(new InputStreamReader(toServer.getInputStream(); String status=fromServer.readLine(); JOptionPane op=new JOptionPane(); op.showMessageDialog(null,status); if(status.equals(data.custName+注册成功) txtUserName.setText(); pwdUserPassword.setText(); pwdConfirmPass.setText(); txtAge.setText(); txtEmail.setText(); streamToServer.close(); fromServer.close(); catch(InvalidClassException e1) JOptionPane.showMessageDialog(null,类错误!); catch(NotSerializableException e2) JOptionPane.showMessageDialog(null,对象未序列化!); catch(IOException e3) JOptionPane.showMessageDialog(null,不能写入到指定服务器!); public static void main(String args)new Register(); 登录界面代码:package t_test;import javax.swing.*;import java.awt.*;import java.awt.event.*;import .*;import java.sql.ResultSet;import java.sql.Statement;import java.io.*;public class Login extends JFrame implements ActionListener private static final long serialVersionUID = -8965773902056088264L;private JPanel pnlLogin;private JButton btnLogin, btnRegister, btnExit;private JLabel lblServer, lblUserName, lblPassword, lblLogo;private JTextField txtUserName, txtServer;private JPasswordField pwdPassword;private String strServerIp;private Dimension scrnsize;private Toolkit toolkit = Toolkit.getDefaultToolkit();public Login() super(登录);pnlLogin = new JPanel();this.getContentPane().add(pnlLogin);lblServer = new JLabel(服务器:);lblUserName = new JLabel(用户名:);lblPassword = new JLabel(密码:);txtServer = new JTextField(20);try InetAddress address = InetAddress.getLocalHost();String ip=address.getHostAddress();System.out.print(ip);txtServer.setText(ip); catch (UnknownHostException e) e.printStackTrace();txtUserName = new JTextField(20);pwdPassword = new JPasswordField(20);btnLogin = new JButton(登录);btnLogin.setToolTipText(登录到服务器);btnRegister = new JButton(注册);btnRegister.setToolTipText(注册新用户);btnExit = new JButton(退出);btnExit.setToolTipText(退出系统);pnlLogin.setLayout(null);lblServer.setBounds(50, 100, 100, 30);txtServer.setBounds(150, 100, 120, 25);lblUserName.setBounds(50, 130, 100, 30);txtUserName.setBounds(150, 130, 120, 25);lblPassword.setBounds(50, 160, 100, 30);pwdPassword.setBounds(150, 160, 120, 25);btnLogin.setBounds(50, 200, 80, 25);btnRegister.setBounds(130, 200, 80, 25);btnExit.setBounds(210, 200, 80, 25);Font fontstr = new Font(宋体, Font.PLAIN, 12);lblServer.setFont(fontstr);txtServer.setFont(fontstr);lblUserName.setFont(fontstr);txtUserName.setFont(fontstr);lblPassword.setFont(fontstr);pwdPassword.setFont(fontstr);btnLogin.setFont(fontstr);btnRegister.setFont(fontstr);btnExit.setFont(fontstr);pnlLogin.add(lblServer);pnlLogin.add(txtServer);pnlLogin.add(lblUserName);pnlLogin.add(txtUserName);pnlLogin.add(lblPassword);pnlLogin.add(pwdPassword);pnlLogin.add(btnLogin);pnlLogin.add(btnRegister);pnlLogin.add(btnExit);setResizable(false);setSize(340, 260);setVisible(true);btnLogin.addActionListener(this);btnRegister.addActionListener(this);btnExit.addActionListener(this);public void actionPerformed(ActionEvent ae) Object source = ae.getSource();if (source.equals(btnLogin) if (txtUserName.getText().equals()| pwdPassword.getText().equals() JOptionPane op1 = new JOptionPane();op1.showMessageDialog(null, 用户名或密码不能为空); else strServerIp = txtServer.getText();login();if (source.equals(btnRegister) strServerIp = txtServer.getText();this.dispose();new Register(strServerIp);if (source = btnExit) System.exit(0); / actionPerformed()结束public void login() trydata_test dt=new data_test();Statement st=dt.oneConnection.createStatement();String sql=select* from peopleMessege;/st.executeQuery(sql);ResultSet es=st.executeQuery(sql);catch(Exception e)new ChatRoom(getTitle(), strServerIp);public static void main(String args) new Login(); 聊天界面与功能代码:import java.awt.*;import java.awt.event.*;import java.util.EventListener;import java.io.*;import .*;public class ClientFrame extends Frame implements ActionListener/窗体应该有发送按钮、文本框用来输入东西、List列表用来显示信息Button connectbutton=new Button(连接);Button sendbutton=new Button(发送);TextField userid=new TextField(10);TextField myid=new TextField(10);List list =new List();TextField content=new TextField(20);TextField servername=new TextField(20);Label label=new Label(服务器地址:);Label labe2=new Label(聊 天 信 息:);Label labe3=new Label(好 友 账 号:);Label labe4=new Label(本 人 账 号:);Socket socket;public ClientFrame()super(聊天窗体);sendbutton.addActionListener(this);connectbutton.addActionListener(this);Panel p1=new Panel();p1.add(labe4);p1.add(myid);p1.add(label);p1.add(servername);p1.add(connectbutton);Panel p2=new Panel();p2.add(labe3);p2.add(userid);p2.add(labe2);p2.add(content);p2.add(sendbutton);sendbutton.setEnabled(false);Panel p3=new Panel();p3.setLayout(new BorderLayout();p3.add(South,p2);p3.add(list);this.add(South,p1);this.add(p3);this.setSize(600,600);public void actionPerformed(ActionEvent e) if(e.getSource()=connectbutton)/连接服务器按钮作用是连接服务器/连接服务器trysocket=new Socket(servername.getText(),9000);/必须马上发一个消息,表明自己的身份tryOutputStream out=socket.getOutputStream();PrintWriter pw=new PrintWriter(out,true);/强制把流写出来pw.println(* + myid.getText(); /使用特殊符号,表明这是该用户第一次发送消息myid.setEnabled(false);servername.setEnabled(false);sendbutton.setEnabled(true);catch(Exception ex)ex.printStackTrace();connectbutton.setEnabled(false);javax.swing.JOptionPane.showMessageDialog(this,连接成功);/启动接收线程,并把输入流和list列表同时交给线程new ClientReceiveThread(socket.getInputStream(),list).start();catch(Exception ex)javax.swing.JOptionPane.showMessageDialog(this,连接服务器失败);ex.printStackTrace();else/发送信息, 需要添加对方的账号信息tryOutputStream out=socket.getOutputStream();PrintWriter pw=new PrintWriter(out,true);pw.println(userid.getText() +:+ content.getText();list.add(本人 :+content.getText()+t);content.setText();catch(Exception ex)ex.printStackTrace();import java.awt.*;import java.io.*;import .*;public class ClientReceiveThread extends ThreadInputStream in;List list;public ClientReceiveThread(InputStream in,List list)/在下面完成参数传递this.in=in;this.list=list;public void run()tryBufferedReader br=new BufferedReader(new InputStreamReader(in);while(true)String str=br.readLine();/得不到值会阻塞list.add(str);/得到的信息往窗体上的list里写,list会自动更新显示catch(Exception e)import java.awt.*;import java.io.*;import .*;public class ClientReceiveThread extends ThreadInputStream in;List list;public ClientReceiveThread(InputStream in,List list)/在下面完成参数传递this.in=in;this.list=list;public void run()tryBufferedReader br=new BufferedReader(new InputStreamReader(in);while(true)String str=br.readLine();/得不到值会阻塞list.add(str);/得到的信息往窗体上的list里写,list会自动更新显示catch(Exception e)import java.io.*;import .*;import java.util.*;public class QQServerpublic static void main(String args)throws Exception ServerSocket server=new ServerSocket(9000);/用来保存Socket对象的容器 HashMapnameAndSocket=new HashMap(); System.out.println(服务器已经启动);while(true)/不停的循环Socket s=server.accept();/等待用户连接InputStream in=s.getInputStream();/得到输入流 int i=1;String localaccount=;int separator =*;/强制转换 i=in.read();if(i=separator)String str=new BufferedReader(new InputStreamReader(in).readLine();System.out.println(str);localaccount=str.substring(1,str.length();Sy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 认识流程教学设计
- 2025年事业单位工勤技能-湖南-湖南公路养护工三级(高级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北水利机械运行维护工二级(技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北有线广播电视机务员一级(高级技师)历年参考题库含答案解析
- 2025-2030中国线圈拉链行业市场发展趋势与前景展望战略研究报告
- 绿色金融产品创新:2025年市场绿色金融产品创新与绿色金融教育发展报告
- 2025年事业单位工勤技能-湖北-湖北下水道养护工五级(初级工)历年参考题库含答案解析
- 2025-2030中国索道缆车行业竞争策略及需求动态预测报告
- 2025年事业单位工勤技能-浙江-浙江农业技术员四级(中级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河南-河南计算机信息处理员五级初级历年参考题库典型考点含答案解析
- 电信装维人员服务规范
- 2025年水文勘测工(中级)职业技能考试题(附答案)
- 加油站气象灾害防御制度
- 企业事故隐患内部报告奖励制度
- 部编语文八年级培训
- 《思想道德修养与法律基础》整体教学设计
- 2020低压交流配网不停电作业技术导则
- 易制毒、易制爆化学品安全培训
- 《正确测量血压》课件
- 叉车装卸货合同范例
- 麻醉药品应急处理制度及流程
评论
0/150
提交评论