当前位置:文档之家› Java实训报告

Java实训报告

实验报告实验课程:Java实验报告项目名称:QQ聊天程序学生姓名:学号:专业班级:2018年 4 月 27 日目录一、实验内容 (1)二、问题描述 (1)三、项目功能 (1)四、项目分析 (1)五、项目设计 (2)六、系统实现 (3)七、总结 (15)一、实验内容根据本课程设计的实践及其前后的准备与总结,复习、领会、巩固和运用课堂上所学的Java语言知识和MySQL数据库,设计一个QQ聊天程序。

二、问题描述1.解决程序窗口的显示和界面设计问题2.解决提取数据库信息的问题3.解决程序按钮功能的实现问题4.解决好友的添加的问题5.解决与好友聊天的问题三、项目功能主要项目功能:1.数据库的设计2.数据库的增删改查从鼠标和键盘监听a.键盘输入账号,密码和聊天内容b.鼠标移动到登陆按钮,点击触发用户登陆c.鼠标移动到取消按钮,点击触发取消登陆d.鼠标移动到好友栏,点击触发聊天界面3.多线程设计a.main函数内while(true)循环重复调用b.main 函数内通过创建构造器来显示登录界面四、项目分析结合问题描述以及项目功能的介绍,分析如下:1.主界面,程序运行界面的设计如下五、 项目设计主窗体项目设计如下流程图所示:流程图六、系统实现1. package com.zt.view;import java.awt.Color;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.DataInputStream;import java.io.DataOutputStream;import .InetAddress;import .Socket;import .UnknownHostException;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTabbedPane;import javax.swing.JTextField;public class ClientLoginView extends JFrame implements ActionListener{ //大布局JPanel jp1; //北部JPanel jp2; //中间JPanel jp3; //南部//选项卡JTabbedPane jtb;JPanel jtb_jp1,jtb_jp2,jtb_jp3;JLabel jtb_jp1_lb1,jtb_jp1_lb2,jtb_jp1_lb3,jtb_jp1_lb4;JTextField jtb_jp1_jt;JPasswordField jtb_jp1_jpf;JButton jtb_jp1_jb;JCheckBox jtb_jp1_jc1,jtb_jp1_jc2;JButton jp3_jb1,jp3_jb2,jp3_jb3;public ClientLoginView(){//中间jtb=new JTabbedPane();jtb_jp1=new JPanel(new GridLayout(3,3));jtb_jp1_lb1=new JLabel("QQ号码",JLabel.CENTER);jtb_jp1_lb2=new JLabel("QQ密码",JLabel.CENTER);jtb_jp1_lb3=new JLabel("忘记密码");jtb_jp1_lb3.setForeground(Color.blue);jtb_jp1_lb4=new JLabel("申请密码保护");jtb_jp1_lb4.setForeground(Color.blue);jtb_jp1_jt=new JTextField();jtb_jp1_jpf=new JPasswordField();jtb_jp1_jb=new JButton(new ImageIcon("image/clear.gif"));jtb_jp1_jc1=new JCheckBox("隐身登陆");jtb_jp1_jc2=new JCheckBox("记住密码");jtb_jp1.add(jtb_jp1_lb1);jtb_jp1.add(jtb_jp1_jt);jtb_jp1.add(jtb_jp1_jb);jtb_jp1.add(jtb_jp1_lb2);jtb_jp1.add(jtb_jp1_jpf);jtb_jp1.add(jtb_jp1_lb3);jtb_jp1.add(jtb_jp1_jc1);jtb_jp1.add(jtb_jp1_jc2);jtb_jp1.add(jtb_jp1_lb4);jtb.add("QQ号码",jtb_jp1);jtb.add("手机号码",jtb_jp2);jtb.add("QQ邮箱",jtb_jp3);this.add(jtb,"Center");//北部的图片JLabel jtou =new JLabel(new ImageIcon("image/tou.gif"));jp1 = new JPanel();jp1.add(jtou);this.add(jp1,"North");//南部按钮jp3=new JPanel();jp3_jb1=new JButton(new ImageIcon("image/denglu.gif"));jp3_jb1.addActionListener(this);jp3_jb2=new JButton(new ImageIcon("image/quxiao.gif"));jp3_jb2.addActionListener(this);jp3_jb3=new JButton(new ImageIcon("image/xiangdao.gif"));jp3.add(jp3_jb1);jp3.add(jp3_jb2);jp3.add(jp3_jb3);this.add(jp3,"South");//设置窗口大小this.setSize(350,250);//设置窗口标题this.setTitle("QQ聊天程序");//设置窗口大小不变this.setVisible(false);//单击关闭按钮,程序退出后台线程this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//获取屏幕分辨率,界面居中对齐Toolkit kit=Toolkit.getDefaultToolkit();int Screenwidth=kit.getScreenSize().width;int Screenheight=kit.getScreenSize().height;this.setLocation((Screenwidth-350)/2,(Screenheight-250)/2);//把窗口设置成可见this.setVisible(true);}public static void main(String[] args){new ClientLoginView();}@Overridepublic void actionPerformed(ActionEvent e) {//获取操作对象Object obj=e.getSource();if(obj==jp3_jb1){//单击登入按钮String name =jtb_jp1_jt.getText().trim();String pass= jtb_jp1_jpf.getText().trim();login(name,pass);}else{if(obj==jp3_jb2){//单击取消按钮}}}public void login (String name,String pass){if(name.equals("")||pass.equals("")){JOptionPane.showMessageDialog(this, "账号或密码输入错误,请重新输入!");}else{try {String ip = InetAddress.getLocalHost().getHostAddress();Socket sc=new Socket(ip,8888);DataOutputStream dout=new DataOutputStream(sc.getOutputStream());dout.writeUTF(name+","+pass);//获取服务器端的反馈结果DataInputStream din =new DataInputStream(sc.getInputStream());String result=din.readUTF();if("error".equals(result)){JOptionPane.showMessageDialog(this, "账号或密码输入有误,请重新输入!");}else{this.setVisible(false);ClientFirendView fs =new ClientFirendView();fs.setVisible(true);}} catch (Exception e) {e.printStackTrace();} } } }2.package com.zt.view;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.Toolkit;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import erDao;import erDaoimpl;public class ClientFirendView extends JFrame{JButton jb1,jb2,jb3;JScrollPane jsp;JPanel jp,jp1,jp2;JLabel[] friends;public ClientFirendView(){jb1=new JButton("我的好友");jb2=new JButton("陌生人");jb3=new JButton("黑名单");jp=new JPanel(new BorderLayout()); //最大的面板jp1=new JPanel(new GridLayout(20,1,10,10)); //好友默认可放20个UserDao userDao=new UserDaoimpl();friends=new JLabel[20];for(int i=0;i<friends.length;i++){int num=i%12+1;friends[i]=new JLabel("好友"+(i+1),newImageIcon("image/"+num+".png"),JLabel.LEFT);jp1.add(friends[i]);}jsp=new JScrollPane(jp1); //中间我们的好友面板jp2=new JPanel(new GridLayout(2,1)); //陌生人,黑名单面板jp2.add(jb2);jp2.add(jb3);jp.add(jb1,"North");jp.add(jsp,"Center");jp.add(jb2,"South");this.add(jp);//设置窗口大小this.setSize(200,600);//设置窗口标题this.setTitle("好友界面");//设置窗口大小不变this.setVisible(false);//单击关闭按钮,程序退出后台线程this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//获取屏幕分辨率,界面居中对齐Toolkit kit=Toolkit.getDefaultToolkit();int Screenwidth=kit.getScreenSize().width;int Screenheight=kit.getScreenSize().height;this.setLocation((Screenwidth-200)/2,(Screenheight-600)/2);//把窗口设置成可见this.setVisible(true);}public static void main(String[] args){new ClientFirendView();}}3. package com.zt.view;import java.awt.Toolkit;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class MessageView extends JFrame{JScrollPane jsp; //聊天内容区域JPanel jp2; //发送消息JTextArea jta; //文本域JTextField jtf;JButton jb;public MessageView(){jta=new JTextArea(9,20);jsp=new JScrollPane(jta);jp2=new JPanel();jtf=new JTextField(20);jb=new JButton("发送消息");jp2.add(jtf);jp2.add(jb);this.add(jsp,"North");this.add(jp2,"South");//设置窗口大小this.setSize(350,250);//设置窗口标题this.setTitle("QQ聊天界面");//设置窗口大小不变this.setVisible(false);//单击关闭按钮,程序退出后台线程this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//获取屏幕分辨率,界面居中对齐Toolkit kit=Toolkit.getDefaultToolkit();int Screenwidth=kit.getScreenSize().width;int Screenheight=kit.getScreenSize().height;this.setLocation((Screenwidth-350)/2,(Screenheight-250)/2);//把窗口设置成可见this.setVisible(true);}public static void main(String[] args){new MessageView();}}4.package com.zt.dao;import java.util.List;import er;public interface UserDao {public User login(String name,String pass);public List<User> findUserFirends(String name);}5. package com.zt.db;import java.sql.*;public class DButils {private static final String url="jdbc:mysql://localhost:3306/qqdb";private static final String user="root";private static final String password="root";public static Connection getConnection(){Connection conn=null;try {//加载驱动类Class.forName("com.mysql.jdbc.Driver");//建立连接conn= DriverManager.getConnection(url, user, password);} catch (Exception e) {// TODO 自动生成的 catch 块e.printStackTrace();}return conn;}public static ResultSet getQueryResult(String sql){ResultSet rs=null;try {Connection conn =DButils.getConnection();Statement stmt=conn.createStatement();rs=stmt.executeQuery(sql);} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return rs;}public static ResultSet getQueryResult(String sql,Object[] objs){ ResultSet rs=null;try {Connection conn =DButils.getConnection();PreparedStatement pstmt= conn.prepareStatement(sql);for(int i=0;i<objs.length;i++){pstmt.setObject(i+1,objs[i]);}rs=pstmt.executeQuery();} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return rs;}public static Boolean executeSql(String sql,Object[] params){ boolean result = false;try {Connection conn =DButils.getConnection();PreparedStatement pstmt= conn.prepareStatement(sql);for(int i=0;i<params.length;i++){pstmt.setObject(i+1,params[i]);}int n=pstmt.executeUpdate();if(n>0){result=true;}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return result;}}6.package com.zt.db;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import erDao;import com.zt.db.DButils;import er;public class UserDaoimpl implements UserDao{public User login(String name, String pass){User user=null;try{String sql="select * from t_user where name=? and pass=?" ;Object[] params={name,pass};ResultSet rs=DButils.getQueryResult(sql, params);if(rs.next()){user=new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setNickname(rs.getString("nickName"));user.setPhoto(rs.getString("photo"));user.setSex(rs.getString("sex"));}}catch(Exception e){e.printStackTrace();}return user;}public List<User> findUserFriends(String name) {List<User> userList=new ArrayList<User>();String sql="select * from t_user where name in (select friendName from t_userfriends where userName=? )";Object[] params={name};try{ResultSet rs=DButils.getQueryResult(sql, params);while(rs.next()){User user=new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setNickname(rs.getString("nickName"));user.setPhoto(rs.getString("photo"));user.setSex(rs.getString("sex"));userList.add(user);}}catch(Exception e){e.printStackTrace();}System.out.println("-----------------------"+userList.size());return userList;}@Overridepublic List<User> findUserFirends(String name) {return null;}}7.package com.zt.po;public class User {private int id;private String name;private String pass;private String nickName;private String sex;private String photo;private String status;public void setId(int int1) {}public void setName(String string) {}public void setNickname(String string) {}public void setPhoto(String string) {}public void setSex(String string) {}}8. package com.zt.service;import .*;public class Test {public static void main(String[] args){try {String ip = InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {e.printStackTrace();}}}9.package com.zt.service;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;import erDao;import erDaoimpl;import er;/** 用户注册登路的socket的服务器端*/public class UserLoginService {private ServerSocket userServerSocket;public static void main(String[] args){try {ServerSocket userServerSocket=new ServerSocket(8888);Socket client=userServerSocket.accept();while(true){DataInputStream din=new DataInputStream(client.getInputStream());String info =din.readUTF();String infos[]=info.split(",");UserDao userDao=new UserDaoimpl();User user=userDao.login(infos[0], infos[1]);DataOutputStream dout = new DataOutputStream(client.getOutputStream());if(user==null){dout.writeUTF("error");}else{dout.writeUTF("success");}}} catch (IOException e) {e.printStackTrace();}}}七、总结通过这次大作业,我更加清晰的认识到学海无涯,还有很多东西等待我去发掘。

相关主题