畅聊室

项目介绍:实现一个简单的聊天功能,利用Socket编程,多线程实现客户端的收发信息。
项目源码链接 https://github.com/wxt-13630223528/chatroom
项目测试用例 地址 https://blog.csdn.net/sister_wang0712/article/details/100055625
下面简单介绍分包

1. util

将公共方法如加载配置文件,以及后面用到的json字符串的封装到util包中

接下来开始写业务,从上到下

2. Client 客户端操作

2.1 dao包 数据层,表的增删查改
  • BaseDao : 加载数据源,提供连接,关闭,所有和dao相关的类都需要,典型的父类和子类的关系,
  • AccountDao用户操作 注册、登陆(两个业务,相当于两个事务,隔离的,所以connection分别写)
2.2 entity (实体层,描述表信息)
  • user
2.3 service 登录注册页面
  • ConnecteToServer (建立与服务器的链接)

输入流获取服务器发来的信息,输出流给服务器发信息。

  • Userlogin

  • UserReg

  • FriendsList
    好友上线提醒,存储所有在线好友,刷新群组列表,及私聊界面的弹出

  • privateChatGUI 私聊界面

  • createGroupGUI 创建群聊

1. 将在线好友以checkBox的形式展示到界面中

2. 点击提交按钮提交信息到服务端
  1) 判断哪些好友选中加入群聊
      选中的放在Set中,并且要添加自己
  2) 获取群名输入框输入的群名称
  3) 将群名+选中好友信息发送到服务器(序列化发送)
    type:3
    content:groupName
    to:[user1, user2,user3...]   
    
   4)将当前创建群的界面隐藏,刷新好友列表界面的群列表
  • GroupChatGUI
type :4
content:myname - msg
to:groupname-[friendlist]

3. VO(通信协议)

  • messageVO.class ((在服务器和客户端传递信息的一个载体))
举例:
type  1(注册)/2(私聊)/3(群聊)  ----告诉服务器要干的事情
content:1(userName)/2.3信息   -----具体发送内容
to:(如私聊,给谁发)(群聊不需要空着)-----给谁发
这个类服务器和客户端都会用到,多层传递,我们写在VO包

4. server (服务端)

  • MultiThreadServer (服务端)
本地建立的基站,在处理客户端连接的时候,需要把它新建新的线程去处理,否则accept()会一直阻塞,

写一个内部类建线程,处理每个客户端
每当有新用户登陆,新用户先会注册到服务端,服务端将新用户上线信息发给所有的已在线用户


  • sendUserLogin 向所有在线用户发送新用户上线信息
遍历clients 将所有Socket取出来,调用输出流发一遍

用户登录上以后,跳转其他,这个链接一直在,所以我们在客户端下Service下建立连接
type:2

content:myName - msg

to:friendName

服务端收到信息,将转发给to 的用户
缓存当前服务器所有在线客户端信息
缓存所有在线群
注册群:
选择该群的所有成员
 在服务端进行接受run()

根据用户发来消息,判断type如果是1 ,表示新用户需要注册到服务器,

注册后需要加载用户列表,所有在线人信息由服务器发回给客户端,相当于http中的一个响应

将新上线的用户信息发回给当前已在线的所有用户(就相当是一个群聊)

将新用户注册到服务器缓存

服务端发回当前所有在线信息、

客户端把自己的内容发出以后,就需要读取服务端发回的所有在线用户信息,

5. Json 知识点

Gson 谷歌库
private static final Gson GSON = new GsonBuilder().create(); //创建者模式
json str

{“1” : “value”,“2” : “ value” }

object -> json(任意对象变成json字符串) json序列化

json - > object 反序列化 (将任意对象序列化为json字符串, 用到反射,类的反射对象)
序列化深拷贝(对user类进行序列化,如果user类中包含其他类,)

你可能感兴趣的:(项目)