GitHub: chat_room 项目代码连接
准备工作:
1.数据源 : Druid 拽~ 阿里数据源 优点:1.降低资源消耗 2.提高响应速率 3.方便管理
1.加载数据源
2.获取连接 Connection
3.执行SQL
4.关闭资源
通过继承.有重复的封装在BasedDao
查询类SQL
select : executeQuery
PreparedStatement
ResultSet
更新类SQL
insert/update/delete
PreparedStatement
//页面 Swing
//页面
JPanel - 盘子 存放各类组件的基础容器
JLabel - 标签 图片也是标签
JTextField - 输入框
JButton - 按钮
JOptionPanel - 提示框(静态方法)
JScrollPane 滚动条
farm.size(400,400); 要删除 pork
//建立连接
使用套接字建立连接
ServerSocket 服务端
-accept(): 返回客户端的Socket
Socket 客户端
工具类抽取
加载资源文件使用 XXX.properties 文件 所以提取为工具类,读取资源文件
传递消息 使用 json字符串
- {"key":"value",...}
第三方工具 转换 json序列化概念 str -> Object :json的反序列化 Object -> str :json的序列化
这和以前的序列化功不一样 以前的 序列化是把 对象变为流的形式 Object...()方法之类的
//你想转换 首先得拥有一个 Google的Gson类
```
/*
* 封装所有公共操作 包括 json 格式
* getResourceAsStream(fileName); 方法会读取当前工程下的资源文件
*
* ctrl 加 shift 加 T 创建测试类
* */
public class CommUtil {
private static final Gson GSON = new GsonBuilder().create();
//通过properties的文件名 来获取properties资源文件
public static Properties loadProperties(String fileName){
Properties properties = new Properties();
InputStream inputStream = CommUtil.class.getClassLoader().
getResourceAsStream(fileName);
try {
properties.load(inputStream);
} catch (IOException e) {
System.err.println("资源文件加载失败");
e.printStackTrace();
return null;
}
return properties;
}
//首先要用Gson
//序列化
public static String object2String(Object object){
return GSON.toJson(object);
}
public static Object string2Object(String string, Class objClz){
return GSON.fromJson(string,objClz);
}
}
```
Message 类
//规定字段
type:1
content:userName
to:(私聊,群聊)
1.注册功能
//MD5加密
//注册用户: 在服务端实现,需要网络
//注册成功返回登陆界面, 连接断掉 --> 简化 现在放在客户端
注册成功提示注册成功,隐藏注册页面,返回登陆页面,
不成功,不隐藏当前页面.
2.登陆功能
服务端
1.保存新用户的上线信息 //最后左
2.将当前的所有用户 发送给新用户的好友列表
3.服务器给新用户的所有好友 发送上线提醒
客户端
1.与服务器建立连接, 将自己的用户名与Socket保存到服务端缓存
2.读取服务端的所有在线好友信息
3.既然要接收 , 那么新建一个后台线程不断读取服务端发送来的信息
////点击登录
1.发送验证码 验证用户名 密码
-不成功 提示 继续当前页面
-成功 和服务器连接
? 但服务器怎么知道是你 -你的qq号
//现在还是存在一个问题 我可以重复登录 / 那么想要解决这个问题 或许可以从 服务器端的Map集合入手
-比如说名字已经在服务器端的Map集合里面了!!!! 那我就可以不去服务端查找 直接告诉你 你还想一号登两次?
用户私聊
客户端:
私聊的发起者,主动发送发
1.点击要私聊的用户标签,弹出私聊界面
2.在弹出的页面,按照指定的协议向服务器发送私聊信息
-type : 2
-content : sender-msg
-to:目标客户端的用户名
//.不可能每次点击都new一下私聊界面 所以存在缓存
信息的接收方:
1.判断是私聊或者群聊 , 判断有没有界面 没有就new一个否则取出 弹出私聊界面 ..
2.按照指定协议读取内容,发送信息
服务端:
1.收到客户端发来的私聊信息,取出目标端的Socket, 做信息转发
//群聊
客户顿
群聊发起者
1.点击群名称标签,弹出群聊界面
2.将群聊内容发送到服务端
//type :4
//content : senderName - msg
//to : groupName
群聊接受者
服务端
1.收到群聊信息.解出群名
2.根据群名称,找到该群的所有用户 然后根据clients 找到该用户socket 然后发送信息
总结:
缺点
1.界面样式太单一化 ---
2.功能较少 --- 比如文件传输等
3.注册是在客户端 --因为模仿qq的话, 注册是在服务端, html,jsp ..邮箱/电话号码验证页面等
4.聊天记录,群聊记录等没有做持久化 退出即清空聊天记录等
收获
1.良好的命名规范 == 自己对自己的友好性
2.写代码前先想好大致思路 ,以及你需要什么 --- 比如抽取工具类 代码未动, 注释先行
3.掌握几个Swing编程的 类用法
4.必须对自己友好, 多借鉴已有的工具及技术栈
//关于文件传输
有一个控件 有JFrameChoose 选择文件夹 返回一个file对象 然后成为文件代码