java 简单的聊天工具 (带界面的)
2017-07-11 10:39
411 查看
首先建立一个工程 导入数据库驱动
工程图
解释一下 entity包是 bin目录 Message包下 和 User包下 是对象相关的操作
Message package com.FakeQQ.entity; import java.util.Date; public class Message { //需要序列化发送,所以要继承Serializable接口 private int id; private String content; private int sender; private int receiver; private Date sendTime; private Date receiveTime; private int state; private int ip; public int getIp() { return ip; } public void setIp(int ip) { this.ip = ip; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getSender() { return sender; } public void setSender(int sender) { this.sender = sender; } public int getReceiver() { return receiver; } public void setReceiver(int receiver) { this.receiver = receiver; } public Date getSendTime() { return sendTime; } public void setSendTime(Date sendTime) { this.sendTime = sendTime; } public Date getReceiveTime() { return receiveTime; } public void setReceiveTime(Date receiveTime) { this.receiveTime = receiveTime; } public int getState() { return state; } public void setState(int state) { this.state = state; } }
User package com.FakeQQ.entity; import java.util.Date; public class User { //这叫实体bin private int qqNumber; private String qqName; private String qqPassword; private Date registTime; //注册时间 private String sex; private String introduce; //个人简介 private String ip; public int getQqNumber() { return qqNumber; } public void setQqNumber(int qqNumber) { this.qqNumber = qqNumber; } public String getQqName() { return qqName; } public void setQqName(String qqName) { this.qqName = qqName; } public String getQqPassword() { return qqPassword; } public void setQqPassword(String qqPassword) { this.qqPassword = qqPassword; } public Date getRegistTime() { return registTime; } public void setRegistTime(Date registTime) { this.registTime = registTime; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getIntroduce() { return introduce; } public void setIntroduce(String introduce) { this.introduce = introduce; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } }
MessageDaoImpl.java package com.FakeQQ.Message.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import com.FakeQQ.entity.Message; import com.FakeQQ.util.ConnectionUtil; public class MessageDaoImpl { public int SaveMessage(Message message) { Connection con=null; PreparedStatement pstm=null; int key=0; try{ con=ConnectionUtil.getCon(); pstm=con.prepareStatement( "insert into message(content,sender,receiver," + "sendTime,state)values(?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS); pstm.setString(1, message.getContent());// pstm.setInt(2, message.getSender()); pstm.setInt(3, message.getReceiver()); pstm.setString(4, message.getSendTime().toLocaleString()); pstm.setInt(5, message.getState()); pstm.executeUpdate(); ResultSet rs=pstm.getGeneratedKeys(); if(rs.next()) key = rs.getInt(1); return key; } catch (Exception e) { e.printStackTrace(); return 0; // TODO: handle exception }finally{ ConnectionUtil.closeCon(null, pstm, con); } } } ClientThread.java package com.FakeQQ.Message.service; import java.io.OutputStream; import java.net.Socket; import com.FakeQQ.entity.Message; import com.FakeQQ.util.SeralizableUtil; public class ClientThread implements Runnable { Message message; String ip; public ClientThread(Message message,String ip) { this.message=message; this.ip=ip; } @Override public void run() { try { Socket socket = new Socket(ip,8888); OutputStream os = socket.getOutputStream(); byte cache[]= SeralizableUtil.SerializableMessage(message); os.write(cache); os.flush(); os.close(); System.out.println(cache.length); //socket.close(); } catch (Exception e) { // TODO: handle exception } } } MessageServiceImpl.java package com.FakeQQ.Message.service; import com.FakeQQ.Message.dao.MessageDaoImpl; import com.FakeQQ.entity.Message; public class MessageServiceImpl { public int sendMessage(Message msg){ MessageDaoImpl messageDaoImpl=new MessageDaoImpl(); return messageDaoImpl.SaveMessage(msg); } } ServerThread.java package com.FakeQQ.Message.service; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Iterator; import com.FakeQQ.Message.view.MessageFrame; import com.FakeQQ.entity.Message; import com.FakeQQ.user.view.MainFrame; import com.FakeQQ.util.SeralizableUtil; import com.FakeQQ.util.SerializableUtilRe; public class ServerThread implements Runnable { MainFrame mainFrame; public ServerThread(MainFrame mainFrame) { this.mainFrame=mainFrame; } @Override public void run() { try { ServerSocket server = new ServerSocket(8888); while(true){ Socket socket = server.accept(); InputStream is = socket.getInputStream(); System.out.println("ServerThread已开启"); //System.out.println(is); //if(true) { System.out.println(is.available()); byte[] bytes = new byte[is.available()]; is.read(bytes); //System.out.println(bytes.length); Message message = SerializableUtilRe.SerializableMessageRe(bytes); System.out.println(message==null); System.out.println(message.getContent()); is.close(); System.out.println(message.getSender()); System.out.println(message.getContent()); // TODO 接受消息并放置到文本框中 Iterator<Integer> i = mainFrame.MessageFrames.keySet().iterator(); boolean isExit = false; while(i.hasNext()) { int key = Integer.parseInt(i.next().toString()); if(message.getSender()== key) { MessageFrame messageFrame = mainFrame.MessageFrames.get(key); String content = messageFrame.txtList.getText(); messageFrame.txtList.setText(content + messageFrame.another.getQqName()+ ":" + message.getContent() ); isExit=true; break; } //} if(!isExit) { MessageFrame messageFrame = new MessageFrame(mainFrame.myself,message.getSender() + "JK "); mainFrame.MessageFrames.put(message.getSender(),messageFrame); } } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } BtnListener.java package com.FakeQQ.Message.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import com.FakeQQ.Message.service.ClientThread; import com.FakeQQ.Message.service.MessageServiceImpl; import com.FakeQQ.entity.Message; public class BtnListener implements ActionListener { private MessageFrame messageFrame; public BtnListener(MessageFrame messageFrame) { this.messageFrame = messageFrame; } @Override public void actionPerformed(ActionEvent e) { // 获得文本框值 String msg = messageFrame.txtMsg.getText(); //实例化Message对象 并存入数据库 Message message = new Message(); message.setContent(msg); message.setSender(messageFrame.myself.getQqNumber()); message.setReceiver(messageFrame.another.getQqNumber()); message.setSendTime(new Date()); message.setState(1); MessageServiceImpl messageServiceImpl = new MessageServiceImpl(); int key = messageServiceImpl.sendMessage(message); message.setId(key); //启动线程 发送给对方 new Thread(new ClientThread(message,messageFrame.another.getIp())).start(); messageFrame.txtMsg.setText(""); // 将消息放到本窗口多行文本框 String content=messageFrame.txtList.getText(); int size = messageFrame.txtList.getWidth()/4; int spaceSize = size-messageFrame.myself.getQqName().length()-1; if(spaceSize>0) { for(int i=0;i<spaceSize;i++) { content += " "; } } content += messageFrame.myself.getQqName()+":"+msg+"\n"; messageFrame.txtList.setText(content); } } MessageFrame.java package com.FakeQQ.Message.view; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.TextArea; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.border.Border; import com.FakeQQ.entity.User; import com.FakeQQ.user.service.UserServiceImpl; public class MessageFrame extends JFrame{ public User myself; public User another; public JTextArea txtList=null; public JTextField txtMsg=null; public JButton btn=null; public MessageFrame(User myself, String other){ this.myself=myself; String temp[]=other.split(" "); UserServiceImpl userServiceImpl=new UserServiceImpl(); another=userServiceImpl.listByQqNum(Integer.parseInt(temp[0])); JPanel panel=new JPanel(); this.getContentPane().add(panel); panel.setLayout(new BorderLayout()); txtList=new JTextArea(5, 20); panel.add(txtList, BorderLayout.CENTER); JPanel txtPanel=new JPanel(); txtMsg=new JTextField(10); btn=new JButton("发送"); btn.addActionListener(new BtnListener(this)); txtPanel.add(txtMsg); txtPanel.add(btn); panel.add(txtPanel, BorderLayout.SOUTH); this.setTitle(temp[1]); this.setSize(400,300); this.setVisible(true); } }
“`
UserDaoImpl.java
package com.FakeQQ.user.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.FakeQQ.entity.User;
import com.FakeQQ.util.ConnectionUtil;
public class UserDaoImpl {
public User getUser(int qqNum){ User u = new User(); try{ //获取数据库连接 Connection con=ConnectionUtil.getCon(); //创建statement PreparedStatement pstm=con.prepareStatement( "select * from user u where u.qqNumber=?"); //设置参数,针对?占位符 pstm.setInt(1, qqNum); //执行sql语句 ResultSet rs=pstm.executeQuery(); if(rs.next()) { System.out.println(rs.getInt(1)); u.setQqNumber(rs.getInt(1)); System.out.println(rs.getString(2)); u.setQqName(rs.getString(2)); u.setQqPassword(rs.getString(3)); u.setRegistTime(rs.getDate(4)); u.setSex(rs.getString(5)); u.setIntroduce(rs.getString(6)); u.setIp(rs.getString(7)); } //关闭连接 ConnectionUtil.closeCon(rs, pstm, con); return u; }catch(Exception e){ e.printStackTrace(); return null; } } //用户注册 public boolean saveUser(User u) { try { //1,加载驱动类 Class.forName("com.mysql.jdbc.Driver"); //2.获取数据库连接 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myqq_db","root",""); //3.数据库实际操作 PreparedStatement pstm = con.prepareStatement( "insert into user(qqName,qqPassword, registTime,sex,introduce,ip)" + " values(?,?,?,?,?,?)" ); pstm.setString(1, u.getQqName()); pstm.setString(2, u.getQqPassword()); pstm.setString(3, u.getRegistTime().toLocaleString()); pstm.setString(4, u.getSex()); pstm.setString(5, u.getIntroduce()); pstm.setString(6,u.getIp()); int count = pstm.executeUpdate(); // 插入之后做更新数据 pstm.close(); con.close(); if (count >0) return true; else return false; } catch (Exception e) { e.printStackTrace(); } return false; } // 找到某一账户,返回这个账户的所有资料 public User findByNameAndPassword(int qqNumber,String password) { User u = new User(); try { //1,加载驱动类 Class.forName("com.mysql.jdbc.Driver"); //2.获取数据库连接 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myqq_db","root",""); //3.数据库具体操作 PreparedStatement pstm = con.prepareStatement( "select * from user u where u.qqNumber = ? and u.qqPassword = ? " ); pstm.setInt(1,qqNumber); pstm.setString(2, password); ResultSet rs = pstm.executeQuery(); //查找之后返回集合 if(rs.next()) { u.setQqNumber(rs.getInt(1)); u.setQqName(rs.getString(2)); u.setQqPassword(rs.getString(3)); u.setRegistTime(rs.getDate(4)); u.setSex(rs.getString(5)); u.setIntroduce(rs.getString(6)); u.setIp(rs.getString(7)); } pstm.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } return u; } // 通过qq号查找所有好友(默认数据库所有用户都是好友) public List <User> findAllFriends(int qqNumber) { ResultSet rs=null; PreparedStatement pstm = null; Connection con = null; List <User> list = new ArrayList <User>(); try { con = ConnectionUtil.getCon(); pstm = con.prepareStatement( "select * from user u where u.qqNumber<>?" ); pstm.setInt(1, qqNumber); rs = pstm.executeQuery(); while(rs.next()) { User u = new User(); u.setQqNumber(rs.getInt(1)); u.setQqName(rs.getString(2)); u.setQqPassword(rs.getString(3)); u.setRegistTime(rs.getDate(4)); u.setSex(rs.getString(5)); u.setIntroduce(rs.getString(6)); u.setIp(rs.getString(7)); list.add(u); } return list; } catch (Exception e) { e.printStackTrace(); return null; }finally { ConnectionUtil.closeCon(rs,pstm,con); } } // 对特定的QQ号做密码重置 public boolean updatePassword(int qqNumber,String qqPassword) { ResultSet rs=null; PreparedStatement pstm = null; Connection con = null; try { con = ConnectionUtil.getCon(); pstm = con.prepareStatement( "update user set qqPassword=? where qqNumber=?" ); pstm.setString(1,qqPassword); pstm.setInt(2, qqNumber); int count = pstm.executeUpdate(); if(count>0) { return true; } } catch (Exception e) { return false; }finally { ConnectionUtil.closeCon(rs,pstm,con); } return false; } // 登录成功后修改IP地址 public void updateIp(int qqNum,String qqIp) { ResultSet rs=null; PreparedStatement pstm = null; Connection con = null; try { con = ConnectionUtil.getCon(); pstm = con.prepareStatement( "update user set ip=? where qqNumber=?" ); pstm.setString(1,qqIp); pstm.setInt(2, qqNum); int count = pstm.executeUpdate(); } catch (Exception e) { }finally { ConnectionUtil.closeCon(rs,pstm,con); } }
}
UserServiceImpl.java
package com.FakeQQ.user.service;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.List;
import com.FakeQQ.entity.User;
import com.FakeQQ.user.dao.UserDaoImpl;
public class UserServiceImpl {
// 用户注册
public boolean regist(User u) {
u.setRegistTime(new Date());
UserDaoImpl userDaoImpl = new UserDaoImpl();
return userDaoImpl.saveUser(u);
}
// 查找 好友 public List<User> listFriends(int qqNumber) { UserDaoImpl userDaoImpl = new UserDaoImpl(); return userDaoImpl.findAllFriends(qqNumber); } // 用户登录 // 通过qq号码和密码查找 某一用户 public User login(int qqNum, String password){ UserDaoImpl userDaoImpl=new UserDaoImpl(); User u = userDaoImpl.findByNameAndPassword(qqNum, password); if(u!=null) { // 获得 本地 IP try { String ip = InetAddress.getLocalHost().toString(); // 修改 数据库 IP userDaoImpl.updateIp(qqNum, ip); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return u; } public User listByQqNum(int qqNum){ UserDaoImpl userDaoImpl=new UserDaoImpl(); return userDaoImpl.getUser(qqNum); }
}
BtnLoginListener.java
// QQ登录监听函数
package com.FakeQQ.user.view;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import com.FakeQQ.entity.User;
import com.FakeQQ.user.service.UserServiceImpl;
public class BtnLoginListener implements ActionListener{
LoginFrame loginFrame; public BtnLoginListener(LoginFrame loginFrame) { this.loginFrame = loginFrame; } public void actionPerformed(ActionEvent e){ String values = e.getActionCommand(); if(values.equals("确定")) { String qqNum = loginFrame.txtqqNum.getText(); String password = new String (loginFrame.txtPassword.getPassword()); UserServiceImpl userServiceImpl = new UserServiceImpl(); User user = new User(); user = userServiceImpl.login(Integer.parseInt(qqNum),password); if(user!=null) { //System.out.println("登录成功!"); // new JTree loginFrame.dispose(); loginFrame=null; MainFrame mainFrame = new MainFrame(user); } }else if(values.equals("取消")) { System.exit(0); } }
}
BtnResigerListener.java
package com.FakeQQ.user.view;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import com.FakeQQ.entity.User;
import com.FakeQQ.user.service.UserServiceImpl;
public class BtnResigerListener implements ActionListener {
private ResigerFrame resigerframe = null;
public BtnResigerListener(ResigerFrame resigerframe) { this.resigerframe = resigerframe; } public void actionPerformed(ActionEvent e) { User user = new User(); String qqName = resigerframe.txtqqName.getText(); String sex = resigerframe.txtSex.getText(); String qqNum = resigerframe.txtqqNum.getText(); String password = new String (resigerframe.txtPassword.getPassword()); String introduce = resigerframe.txtIntroduce.getText(); user.setQqName(qqName); user.setSex(sex);
// user.setQqNumber(Integer.parseInt(qqNum));
user.setQqPassword(password);
user.setIntroduce(introduce);
UserServiceImpl userServiceImpl = new UserServiceImpl();
boolean flag = userServiceImpl.regist(user);
if(flag==true) {
// System.out.println(“注册成功!”);
} }
}
LoginFrame.java
“`package com.FakeQQ.user.view;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class LoginFrame extends JFrame {
JLabel lblqqNum;
JLabel lblqqPassword;
JTextField txtqqNum;
JPasswordField txtPassword;
JButton btnLogin;
JButton btnCancle;
JButton btnResiger;
// 构造方法 public LoginFrame() { lblqqNum = new JLabel("QQ号"); lblqqPassword = new JLabel("密码:"); txtqqNum = new JTextField(); txtPassword = new JPasswordField(""); btnLogin = new JButton("确定"); btnCancle = new JButton("取消"); btnResiger = new JButton("QQ注册"); this.getContentPane().setLayout(null); //布局为自己 this.getContentPane().add(lblqqNum); lblqqNum.setBounds(20,20,80,20); this.getContentPane().add(lblqqPassword); lblqqPassword.setBounds(20,50,80,20); this.getContentPane().add(txtqqNum); txtqqNum.setBounds(70,20,140,20); this.getContentPane().add(txtPassword); txtPassword.setBounds(70,50,140,20); this.getContentPane().add(btnLogin); btnLogin.setBounds(60,80,80,20); this.getContentPane().add(btnCancle); btnCancle.setBounds(160,80,80,20); this.getContentPane().add(btnResiger); btnResiger.setBounds(100,130,90,20); BtnLoginListener btnLoginListener = new BtnLoginListener(this); btnLogin.addActionListener(btnLoginListener); //事件源和事件者关联起来 btnCancle.addActionListener(btnLoginListener); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口的时候退出应用程序 //设置窗口居中显示 //定义一个工具包 Toolkit kit = Toolkit.getDefaultToolkit();//获得屏幕大小尺寸 Dimension screenSize = kit.getScreenSize(); int screenWidth = screenSize.width;//获得屏幕宽度 int screenHeight = screenSize.height;//获得屏幕高度; int i = this.getWidth();//获得当前窗体的宽度 int j = this.getHeight();//获得当前窗体的高度 this.setLocation((screenWidth-i)/2, (screenHeight-j)/2); this.setTitle("QQ登录"); this.setSize(300,200); this.setVisible(true); // 可见 }
}
MainFrame.java
package com.FakeQQ.user.view;
import java.util.HashMap;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;
import com.FakeQQ.Message.service.ServerThread;
import com.FakeQQ.Message.view.MessageFrame;
import com.FakeQQ.entity.User;
import com.FakeQQ.user.dao.UserDaoImpl;
import com.FakeQQ.user.service.UserServiceImpl;
public class MainFrame extends JFrame{
public User myself;
public List friends;
public HashMap
相关文章推荐
- java 简单的聊天工具 (带界面的)
- 用Java Swing编写简单的测试小工具界面(源码) 分类: Java 2015-07-30 10:49 23人阅读 评论(0) 收藏
- java制作带界面的聊天工具
- 用Java Swing编写简单的测试小工具界面(源码)
- java 简单的局域网聊天(带界面)Client
- 用Java Swing编写简单的测试小工具界面(源码)
- java 简单的局域网聊天(带界面)Server
- +++GTK界面下的简单聊天工具(linux socket)
- java自己写的简单聊天工具SimpleQQ感悟
- 基于java-applet的简单流程图绘制小工具的制作
- java图像界面开发简单实例-JCheckBox、JLabel的应用
- java图像界面开发简单实例-ImageIO、JFileChooser、JMenu、JPanel的应用
- Java Socket简单聊天和文件传输工具(更新中)
- java图像界面开发简单实例-JRadioButton、JCheckBox、JLabel的应用
- java图像界面开发简单实例-JOptionPane应用
- JAVA简单聊天程序
- Java Socket简单聊天和文件传送工具(更新中)
- java图像界面开发简单实例-Graphics2D、Rectangle2D、Ellipse2D、Line2D的简单应用
- 基于java-applet的简单流程图绘制小工具的制作
- 我喜欢简单:ant - java 构建工具