1.将用户数据保存到数据库
写这个聊天室呢,我的想法是先从界面写起,那么,对照qq,微信这些聊天室,第一步肯定是先要注册和登录,所以啊,我们就要将用户数据保存到数据库中,不然的话,当你第二次打开聊天室的时候又需要重新注册,这显然是不好的。
实现:
数据库的实现非常简单,我们只需要建立一个新的数据库再建立一张用户表即可,因为我不能实现qq号那样的主码,所以这里我是用用户名当主码的。
接下来就是在Idea中实现代码来连接到数据库了,这也没有什么难的,但是,
需要注意的是,由于MySQL使用的时间和我们不一样,所以要在url后面加上serverTimezone=UTC。
实现:
package DB;
import java.sql.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
/**
*
* @author GUOFENG --登录连接数据库
*
*/
public class UserDB {
// 驱动程序名
String driver = "com.mysql.cj.jdbc.Driver";
// URL指向要访问的数据库名jdbc
String url = "jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC";
// MySQL配置
String sqluser = "root";
String sqlpassword = "helloworld1.cpp";
String userpwd_;
String username_;
boolean n = false;
public UserDB(String name, String pwd) {
username_ = name;
userpwd_ = pwd;
}
public Boolean selectsql() {
n = false;
try {
// 加载驱动
Class.forName(driver);
// 连接数据库
Connection conn = DriverManager.getConnection(url, sqluser,
sqlpassword);
if (!conn.isClosed())
System.out.println("连接数据库成功!");
// statement用来执行SQL语句
Statement statement = conn.createStatement();
// 要执行的SQL语句
String sql = "select userpwd from hello where username=" + "'" + username_ + "';";
// 结果集
ResultSet rs = statement.executeQuery(sql);
String readpwd = null;
while (rs.next()) {
// 选择password这列数据
readpwd = rs.getString("userpwd");
// 首先使用ISO-8859-1字符集将其解码为字节序列并将结果存储新的字节数组中。
// 然后使用GB2312字符集解码指定的字节数组
readpwd = new String(readpwd.getBytes("ISO-8859-1"), "GB2312");
// 输出结果
System.out.println(readpwd);
if (readpwd.equals(userpwd_)) {
n = true;
}
}
rs.close();
conn.close();
} catch (ClassNotFoundException e) {
System.out.println("加载MySQL驱动失败!");
} catch (SQLException e1) {
System.out.println("1.hellosql:" + e1.getMessage());
} catch (Exception e2) {
System.out.println("2.hellosql:" + e2.getMessage());
}
return n;
}
public boolean addsql() {
int count = 0;
n = false;
try {
// 加载驱动
Class.forName(driver);
// 连接数据库
Connection conn = DriverManager.getConnection(url, sqluser,
sqlpassword);
if (!conn.isClosed())
System.out.println("连接数据库成功!");
String sql = "insert into hello (username, userpwd) values (?,?);";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username_);
ps.setString(2, userpwd_);
count = ps.executeUpdate();
if (this.selectsql() == true)
{
n = true;
System.out.println("***");
}
else {
JOptionPane.showMessageDialog(new JFrame(), "注册失败!", "错误",
JOptionPane.ERROR_MESSAGE);
}
ps.close();
conn.close();
} catch (ClassNotFoundException e) {
System.out.println("加载MySQL驱动失败!");
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return n;
}
在这里我没有对用户名和密码进行加密和解密以及防止sql注入(懒得写了),有兴趣的可以去了解一下。
还有一点就是,需要在项目中添加mysql-connector-java-.jar依赖,从flie-project structure 中的lib中下载就行。否则无法加载数据库驱动。
2.计划好聊天室要实现的功能。
1.群聊
2.私聊
3.传输图片
4.传输语音
那么怎么实现呢?
首先,每个功能肯定是要对应一个函数的,那么,如何让服务器知道你要进行的行为呢,所以啊,我们要在行为发生之前,给服务器传输一个指令,这样服务器就能知道你要干什么了。
//客户端接收服务器指令
public void run() {
String message = "";
while (true) {
try {
if (flag == 0) {
message = reader.readLine();
StringTokenizer stringTokenizer = new StringTokenizer(message, "/@");
// 服务器消息处理
String[] str_msg = new String[10];
int j_ = 0;
while (stringTokenizer.hasMoreTokens()) {
str_msg[j_++] = stringTokenizer.nextToken();
}
String command = str_msg[1];// 信号
//服务器接收客户端指令
while ((content = readFromClient()) != null) {
flag = 0;
int user_list = Server.clients_string.valueSet().size();
System.out.println("Msg_from_Client : " + content);
StringTokenizer stringTokenizer = new StringTokenizer(content, "/@");
String[] str_msg = new String[10];
int j_ = 0;
while (stringTokenizer.hasMoreTokens()) {
str_msg[j_++] <