a) 客户端登陆流程
i. 输入用户名密码
ii. 建立连接
iii. 发送操作类型(登陆操作:login,注册操作:regist)
iv. 发送用户名密码
v. 读取验证结果
vi. 根据结果判断:如果成功就进入聊天界面,如果失败就断开连接,继续登陆
vii. 前提登陆成功:读取消息和发送消息并行流程
1. 读取消息流程:从服务器读取一条完成的消息,并把消息追加到显示板上
2. 发送消息流程:输入消息内容到聊天板,把消息获取并发送给服务器
b) 客户端注册流程
i. 输入注册信息
ii. 建立连接
iii. 发送操作类型(登陆操作:login,注册操作:regist)
iv. 发送注册信息
v. 读取验证结果
vi. 断开连接
vii. 如果结果是成功的:跳转到登陆界面
如果结果是失败的:依然停留在注册界面
c) 服务端流程处理
i. 启动服务器
ii. 等待客户端连接
iii. 客户端连接成功
iv. 有两个分支:一个分支继续等待客户端连接,一个分支开始读取消息
v. 读取操作类型
vi. 操作类型如果是注册
1. 读取注册信息
2. 校验信息是否存在
3. 如果注册信息存在,反馈客户端注册失败消息(结束)
4. 如果注册信息不存在,录入注册信息
5. 发送注册结果(结束)
vii. 操作类型如果是登陆
1. 读取登陆信息
2. 校验登陆信息
3. 如果登陆失败,发送登陆失败结果(结束)
4. 如果登陆成功,发送登陆成功结果
5. 读取消息
6. 转发消息
7. 循环第5、6个步骤
package com.huaxin.database;
import java.io.Serializable;
//实现Serializable接口,便于使用对象流
public class UserInfo implements Serializable{
private String userName;
private String password;
//构造函数
public UserInfo(String userName, String password) {
this.userName = userName;
this.password = password;
}
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;
}
}
package com.huaxin.database;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.JOptionPane;
public class Database {
public static HashMap map = new HashMap();
//调试代码
// static{
// //构造文件输出流
// FileOutputStream fos;
// try {
// fos = new FileOutputStream("database");
// //构造对象输出流
// ObjectOutputStream oos = new ObjectOutputStream(fos);
// oos.writeObject(map);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
public static void main(String[] args) {
// 调试代码
// Database.readDataBase();
// Database.add("user3", new UserInfo("user3","pwd3"));
// Database.readDataBase();
// Database.add("user1", new UserInfo("user1","pwd"));
// Database.add("user2", new UserInfo("user2","pwd"));
// Database.add("user3", new UserInfo("user3","pwd"));
// Iterator it =map.entrySet().iterator();
// while(it.hasNext()){
// Map.Entry entry=(Map.Entry)it.next();
// String key=(String)entry.getKey();
// UserInfo usin=(UserInfo)entry.getValue();
// System.out.println(usin.getUserName()+":"+usin.getPassword());
// }
}
static {
readDataBase();
UserInfo userSuper =new UserInfo("zhou","zhou");
map.put(userSuper.getUserName(),userSuper);
updateDataBase();
// System.out.println("已经添加初始数据!");
}
//数据库的增删查改函数
//增加用户
public static void add(String name,UserInfo userInfo) {
//保证读入都是最新的数据
readDataBase();
// System.out.println(name);
// System.out.println(map.get(name));
if(map.get(name)!=null){
JOptionPane.showMessageDialog(null, "该用户已存在!");
}else{
map.put(name, userInfo);
// 调试代码
// Iterator it =map.entrySet().iterator();
// while(it.hasNext()){
// Map.Entry entry=(Map.Entry)it.next();
// String key=(String)entry.getKey();
// UserInfo usin=(UserInfo)entry.getValue();
// System.out.println(usin.getUserName()+":"+usin.getPassword());
// }
// System.out.println("已经添加!");
updateDataBase();
}
}
//删除用户
public static void delete(String name) {
//保证读入都是最新的数据
readDataBase();
if(map.get(name)!=null){
map.remove(name);
updateDataBase();
}else{
JOptionPane.showMessageDialog(null, "该用户不存在!");
}
}
//查找用户
public static UserInfo get(String name) {
readDataBase();
if(map.get(name)!=null){
return map.get(name);
}else{
JOptionPane.showMessageDialog(null, "该用户不存在!");
return null;
}
}
//修改用户
public static void update(String name,UserInfo userInfo) {
//保证读入都是最新的数据
readDataBase();
if(map.get(name)!=null){
map.put(name, userInfo);
updateDataBase();
}else{
JOptionPane.showMessageDialog(null, "该用户不存在!");
}
}
//利用文件将用户信息永久的保存起来
public static HashMap readDataBase() {
try {
//构造文件输入流
FileInputStream fis = new FileInputStream("database");
//构造对象输入流
ObjectInputStream ois = new ObjectInputStream(fis);
//将文数据库中信息读入进来
Object obj=ois.readObject();
HashMap hm=(HashMap)obj;
//将读入进来的数据赋给map
map=hm;
// Iterator it =hm.entrySet().iterator();
// while(it.hasNext()){
// Map.Entry entry=(Map.Entry)it.next();
// String key=(String)entry.getKey();
// UserInfo usin=(UserInfo)entry.getValue();
// System.out.println(usin.getUserName()+":"+usin.getPassword());
// }
// System.out.println("yijing duru wenjian 。。。。。。");
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
public static void updateDataBase() {
try {
//构造文件输出流
FileOutputStream fos = new FileOutputStream("database");
//构造对象输出流
ObjectOutputStream oos = new ObjectOutputStream(fos);
//将当前数据写出到文件
// Iterator it =map.entrySet().iterator();
//
// while(it.hasNext()){
// Map.Entry entry=(Map.Entry)it.next();
// String key=(String)entry.getKey();
// UserInfo usin=(UserInfo)entry.getValue();
// System.out.println(usin.getUserName()+":"+usin.getPassword());
// }
oos.writeObject(map);
// System.out.println("已经更新数据库.....");
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}