java实现服务器、客户端的多线程聊天室

上课学习的利用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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值