上课学习的利用swing界面的简单聊天室;包括登录、注册、聊天群发以及下线等功能
运行效果如图:
服务器开启:
登录:
注册:
聊天:
项目所需资料:sounds文件下是上下线的提示音。images内是背景图片,lib内是连接mysql的工具
配置文件jdbc.properties:
url=jdbc:mysql://localhost/shopping?useUnicode=true&characterEncoding=utf-8
username=root
password=123456
(shopping是我的数据库名称)
一、工具包(util)
1.ImageUtil用于设置屏幕背景
package goktech.util;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class ImageUtil extends JPanel{
private String imgPath;
public ImageUtil(String imgPath) {
this.imgPath = imgPath;
}
@Override
protected void paintComponent(Graphics g) {
ImageIcon icon=new ImageIcon(imgPath);
g.drawImage(icon.getImage(), 0, 0, getWidth(), getHeight(), null);
}
}
2、JDBCUtil:用于连接数据库
package goktech.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtil {
//工具类的特点:方法都是静态的
static String url=null;
static String username=null;
static String password=null;
//读取配置文件
static {
try {
Properties pro=new Properties();
FileInputStream in=new FileInputStream("file/jdbc.properties");
//InputStream in=JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
pro.load(in);
url=pro.getProperty("url");
username=pro.getProperty("username");
password=pro.getProperty("password");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取连接的方法
public static Connection getConn() {
Connection conn=null;
try {
//1.注册驱动java.sql.DriverManager.registerDriver(new Driver())
//DriverManager.registerDriver(new Driver());
//Class.forName("com.mysql.jdbc.Driver");
//2.创建链接
conn=DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//释放资源的方法
public static void close(Connection conn,Statement sta,ResultSet rs) {
closeConn(conn);
closeSta(sta);
closeRs(rs);
}
//释放资源
public static void close(Connection conn,Statement sta) {
closeConn(conn);
closeSta(sta);
}
//关闭连接的方法
private static void closeConn(Connection conn) {
try {
if (conn!=null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭通道的方法
private static void closeSta(Statement sta) {
try {
if (sta!=null) {
sta.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭结果集的方法
private static void closeRs(ResultSet rs) {
try {
if (rs!=null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、WhisperUtil
package goktech.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
public class WhisperUtil {
// Properties加载配置文件信息
public static void loadPro(Properties pro, File file) {
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
pro.load(new FileInputStream(file));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@SuppressWarnings("unused")
public static String getTimer() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
}
}
二、实体类(bean)
1.User:用户实体类
//封装用户类
public class User {
private int id;
private String userName;
private String passWord;
public User() {
super();
}
public User(String userName, String passWord) {
super();
this.userName = userName;
this.passWord = passWord;
}
public User(int id, String userName, String passWord) {
super();
this.id = id;
this.userName = userName;
this.passWord = passWord;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", passWord=" + passWord + "]";
}
}
2、ChatBean:封装聊天信息
package goktech.bean;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
//聊天信息的封装类
public class ChatBean implements Serializable{
private static final long serialVersionUID=1L;
private int type; //聊天类型 1.上线更新 -1下线更新
private HashSet<String> clients; //存放先选中的用户
private HashMap<String,Client> onlines; //存放在线用户
private String name; //姓名
private String info; //信息
private String timer; //时间
public ChatBean() {
super();
}
public ChatBean(int type, HashSet<String> clients, HashMap<String, Client> onlines, String name, String info,
String timer) {
super();
this.type = type;
this.clients = clients;
this.onlines = onlines;
this.name = name;
this.info = info;
this.timer = timer;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public HashSet<String> getClients() {
return clients;
}
public void setClients(HashSet<String> clients) {
this.clients = clients;
}
public HashMap<String, Client> getOnlines() {
return onlines;
}
public void setOnlines(HashMap<String, Client> onlines) {
this.onlines = onlines;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getTimer() {
return timer;
}
public void setTimer(String timer) {
this.timer = timer;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
3、Client:客户端实体类
package goktech.bean;
import java.net.Socket;
//封装的客户端实体类
public class Client {
private String name; //客户端名称
private Socket socket; //客户端的socket
public Client() {
super();
}
public Client(String name, Socket socket) {
super();
this.name = name;
this.socket = socket;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
三、dao包
package goktech.dao;
import goktech.bean.User;
public interface UserDao {
//根据用户名查询用户的方法
boolean selectByName(String username);
//插入数据的方法(注册)
int insertUser(User user);
//登录的方法
User login(String userName,String passWord);
}
四、dao.impl:dao包类的具体实现
package goktech.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import goktech.bean.User;
import goktech.dao.UserDao;
import goktech.util.JDBCUtil;
public class UserDaoImpl implements UserDao{
@Override
public boolean selectByName(String username) {
Connection conn=null;
PreparedStatement pre=null;
ResultSet rs=null;
try {
//1.创建连接
conn=JDBCUtil