JavaSE版QQ设计文档

一、背景描述

完成网络、线程、IO后,可以开始部署该项目。

二、实现要求

模仿QQ,实现简单的qq功能:注册、登陆、查找好友、聊天功能。服务端还需实现配置文件设置、用户管理、日志显示的功能。

三、实现技术

a)         使用多线程进行多个客户端和服务端的连接。

b)        使用文件方式保存用户信息。

c)         使用对象的方式在服务端和客户端之间传递信息。

d)        熟练使用JTableJListmodelCellRendener等模型。

四、类图

 

a)类图

 b)类图说明

a)          

 

类名称

JQServer

类描述

服务端主程序类。

包描述

server

函数描述

public static void main(String[] args)

加载字体,弹出程序界面。

 

 

 

类名称

Server

类描述

JavaQQ服务端类。

完成的功能:1.系统服务

2.系统配置

3.用户管理

4.在线用户

5.日志管理

6.关于

包描述

server.frm

函数描述

public Server()        JavaQQ服务端类。

public void stateChanged(ChangeEvent e)

选项卡面板修改时触发事件。

 

 

 

类名称

ConfigPane

类描述

系统配置类。

完成的功能:1.端口配置。

2.要屏蔽的JQ

3.生成的JQ号的位数,最小位和最大位

4.是否自动备份日志、自动删除日志的天数

5.数据方式选择1.文件方式2.数据库方式(连接参数、用户名、密码、解码集)

包描述

server.frm.panes

函数描述

public ConfigPane(Properties prop)   系统配置面板构造函数。

private void init()

初始化面板。

public void actionPerformed(ActionEvent e)

保存按钮、回复缺省值按钮等的事件。

private void setDataWay(boolean b)

设置数据保存方式。

public void getProp(Properties prop) throws Exception

获取系统的配置文件

public void setProp() throws IOException

保存配置文件。

内部类

private class MyJLalel extends JLabel   根据需要定制的JLabel

public MyJLalel(String text,int width)

设置内容为text,宽度为width的一些已设置好的JLabel

public MyJLalel(String text)

设置内容为text,高度为20的一些已设置好的JLabel

内部类

private class MyJTextField extends JTextField   根据需要定制的JTextField

public MyJTextField()

缺省170宽的JTextField

public MyJTextField(int width)

设置指定宽度的JTextField

 

 

 

类名称

FillWidth

类描述

仅仅为了填充BorderLayout的宽度

包描述

server.frm.panes

函数描述

public FillWidth(int width,int height)   按照指定宽度和高度的JPanel

 

 

 

类名称

LogPane

类描述

日志显示类。

包描述

server.frm.panes

函数描述

public LogPane()   日志面板构造函数。

public JTextArea getAreaLog()

获取日志。

private void init()

初始化面板。

public void actionPerformed(ActionEvent e)

查看所有日志的事件。当前事件似乎未在Windows平台实现,其他平台未测试。Desktop类似乎未发生作用。

 

 

 

类名称

OnlinePane

类描述

在线用户面板。

包描述

server.frm.panes

函数描述

public OnlinePane()   在线用户面板构造函数。

private void init()

初始化添加组件。

public void actionPerformed(ActionEvent e)

广播消息按钮、刷新按钮、查询按钮的事件。

public void run()

 

public void flushOnlineUser()

刷新当前在线用户。

private void QueryOnlineUser(String query,int type)

根据查询类型查询在线用户

private void addUserToTable(User user)

table中添加用户

内部类

private class QueryWay   查询方式。

内部类

private class MyDefaultTableModel extends DefaultTableModel

自己定制的DefaultTableModel

内部类

private class BroadcastWindow extends JDialog implements WindowFocusListener,ActionListener

广播窗体类。

 

 

 

类名称

ServecieProcessBar

类描述

来回滚动条类。

包描述

server.frm.panes

函数描述

public ServecieProcessBar(int width,int height)

按照指定的宽度和高度构造一个来回的滚动条。

public void actionPerformed(ActionEvent e)

来回滚动事件。

 

public void paint(Graphics g)

滚动条的绘制

 

public void startRoll()

开始滚动滚动条

 

public void stopRoll()

停止滚动滚动条。

 

 

 

类名称

ServicePane

类描述

系统服务面板类。

完成功能:系统的启动与停止

用户的连接日志显示。

包描述

server.frm.panes

函数描述

public ServicePane()

系统服务构造函数。

public void initProp()

初始化配置文件。

public void actionPerformed(ActionEvent e)

启动按钮、停止按钮的事件。

public void writeSysLog(String log)

书写系统日志。

private void writeLog(Log log)

书写日志。

public void startServer() throws IOException

启动服务器。

public void stopServer() throws IOException

停止服务器。

public void run()

 

private boolean isHasLoged(int jqnum)

检测jqnum用户是否已经登陆。

private void letClientLogout(int jqnum,String ip)

断开和服务端的连接。

private void removeClientForException(ClientLink client)

客户端异常发生和服务端断开连接时,清空table中断开的客户端~~,这是绝对的需要处理的。

public static boolean broadcast(String msg)

广播系统消息。

内部类

private class ClientLink implements Runnable,Serializable

客户端连接类。处理和客户端的各种消息。

public ClientLink(Socket client)

客户端连接类。

public void run()

1开头的:注册相关消息

10:客户端发送注册信息到服务端

11:服务端回复注册成功到客户端

12:服务端回复注册失败到客户端

2开头的:登陆相关消息

20:客户端发送登陆信息到服务端(判断此用户是否已登录)

21:登陆成功服务端发送好友信息到客户端

22:登录失败服务端发送错误信息到客户端

23:服务端发送账号在别处登陆

24:客户端发送退出到服务端

25:服务端发送好友上线功能

3开头的:发送记录相关消息

30:客户端发送消息到服务端

31:服务端根据消息发送到客户端

4开头的:搜索在线用户加好友相关消息

40:客户端发送获取在线用户数

41:服务端发送在线用户数

42:客户端发送获取当前在线用户

43:服务端发送在线列表用户

44:客户端发送添加好友的qq

45:服务端发送添加好友成功

46:服务端发送添加好友失败

9开头的:系统相关消息

90:服务端发送下线功能到客户端

91:服务端发送广播消息到客户端

private String getClientIP()

获取客户端IP

private void letClientQuit()

使得客户端下线。

private void closeClient()

关闭和客户端的连接

private void dealQuit(JQMessage message)

处理客户端退出消息。

private void dealAddUser(JQMessage message)

处理注册新用户。

private void telfriendOnline(int jqnum,User user)

告诉好友我的状态。

private boolean eachAddFriend(int jqnum)

相互添加好友。

private void dealFindOnlineUser()

传输当前的在线用户FriendUser

private void dealFindOnlineUserNum()

传输当前在线用户数。

private void dealMessage(JQMessage message) throws FileNotFoundException, IOException

处理客户端发送过来的消息。

private void sendRecordToClient(ClientLink client,Record record) throws FileNotFoundException, IOException

发送消息到客户端。

private void dealRegiter(JQMessage message) throws FileNotFoundException, IOException

处理注册用户。

private void DealLogin(JQMessage message)

处理用户登陆。

private void telFriendState(User user) throws FileNotFoundException, IOException, ClassNotFoundException

告诉当前用户的好友自己的状态。

public boolean writeToClient(JQMessage message)

想客户端发送消息。

public Log getLog(User user,String what)

根据User的情况和日志内容获得日志对象。

public Log getLog(FriendUser user,String what)

根据FriendUser的情况和日志内容获得日志对象。

private Log getLoginLog(LoginUser user,String what)

根据LoginUser和日志内容返回日志对象。

private void updateUserState(int jqnum,int state)

更新用户的状态。

内部类

private class ClientWrite extends Thread

客户端的输出线程类。

public ClientWrite(ClientLink clientLink,JQMessage message)

客户端的输出线程类构造函数。

public void run()

 

 

 

 

类名称

UserPane

类描述

用户管理面板类。

包描述

server.frm.panes

函数描述

public UserPane()

用户管理面板构造函数。

private void init()

初始化面板。

public void flushUser()

刷新当前所有用户。

private void QueryUser(String query,int type)

按查询方式、查询类型查找用户。

private void addUserToTable(User user)

table中添加用户

public void actionPerformed(ActionEvent e)

添加新用户、刷新、查询、修改、删除等按钮事件。

内部类

private class QueryWay

查询的方式。

内部类

private class MyDefaultTableModel extends DefaultTableModel

定制的DefaultTableModel

内部类

private class TableMouseAdapter extends MouseAdapter

鼠标移动至出发事件。

 

 

 

类名称

JQClient

类描述

JQ客户端主程序类。

包描述

client

函数描述

public static void main(String[] args)

JQ客户端主程序类。

加载字体到UIManager,启动登陆窗口。

 

 

 

类名称

ChatPane

类描述

聊天窗体类。

包描述

client.frm

函数描述

public ChatPane(ObjectOutputStream oos,FriendUser friendUser,FriendUser selfUser,boolean show)

窗体的构造函数。

private void init()

初始化面板。

public void actionPerformed(ActionEvent e)

关闭、发送、设置、按Enter、按Ctrl+Enter、表情按钮等事件。

public void updateFriendPhoto(Icon icon)

更新好友的图标。

public void showRecord(String nickName,Record record,Color color)

显示用户昵称和聊天记录信息到聊天面板上。

private void insertString(String msg,Color color)

将信息插入到聊天面板上。

private void removeSendKey()

添加发送事件。

内部类

private class WriteThread extends Thread

发送线程类。

内部类

private class SendKeyListenter extends KeyAdapter

发送按钮设置事件类。

内部类

private class FaceWindow extends JWindow implements ActionListener,Runnable,WindowFocusListener,MouseListener

表情显示JWindow类。

public FaceWindow(Frame owner)

构造函数。

public void run()

将表情显示到JLabel上。

public void actionPerformed(ActionEvent e)

ActionListener事件。

public void windowLostFocus(WindowEvent e)

该窗体失去焦点时事件。

public void windowGainedFocus(WindowEvent e)

得到焦点。

public void mouseClicked(MouseEvent e)

鼠标点击事件。

public void mouseEntered(MouseEvent e)

鼠标进入事件。

public void mouseExited(MouseEvent e)

鼠标移出时事件。

public void mousePressed(MouseEvent e)

 

public void mouseReleased(MouseEvent e)

 

 

 

 

类名称

FillWidth

类描述

仅仅为了填充BorderLayout的宽度

包描述

client.frm

函数描述

public FillWidth(int width,int height)

指定宽度和高度

public FillWidth(int width,int height,Color color)

指定宽度、高度和颜色

 

 

 

类名称

LoginPane

类描述

登录面板类。

包描述

client.frm

函数描述

public LoginPane()

登陆窗体。

private void init()

初始化登陆窗体的面板。

public void actionPerformed(ActionEvent e)

设置按钮、登陆按钮、注册按钮的事件。

 

 

 

类名称

MainPane

类描述

主程序类、JQ的主框架类。

包描述

client.frm

函数描述

public MainPane(String serverIp,Integer serverPort,Integer jqnum,String password,Integer state)

登陆后显示的主面板的构造函数。

private void initLoginPane()

初始化用户按下登陆按钮后,主面板显示登陆进度条窗体。

private void initMain(Vector<FriendUser> v)

初始化用户登陆成功后,显示主窗体。

public void actionPerformed(ActionEvent e)

取消按钮、聊天按钮、删除好友、好友按钮、查找按钮事件。

private FriendUser getFriendUserFromList(int jqnum)

根据好友号码获得listFriendUser中的好友。

private void quit()

退出事件。

private void chatWithFriend()

打开好友聊天窗口。

private void closeClient()

关闭到服务端的连接。

内部类

private class MyWindowAdapter extends WindowAdapter

窗体关闭时触发事件。

内部类

private class CompanyLogoListCellRenderer extends DefaultListCellRenderer

自己定制的好友类表的ListCellRenderer

内部类

private class ListMouseAdapter extends MouseAdapter

鼠标事件,完成鼠标进入好友List中,选中好友,双击与好友进行聊天等。

内部类

private class LoginThread extends Thread

登陆线程。处理服务端的信息以及发送消息到服务端。

public LoginThread()

登陆线程构造函数。

public void run()

 

private void dealBroadcast(JQMessage message)

处理广播。

private void newMSG(int type)

有消息来时出发声音。

private void dealFriendUserLogin(JQMessage message)

处理好友上线时消息。

private void dealShowOnlineUser(Object obj)

根据服务端发送的消息,将在线用户显示到查找面板上。

private void dealOnlineNum(Object obj)

显示在线用户数到查找面板上。

private void dealRecord(Object obj,int type)

处理服务端发送的从好友发过来的消息。

private void causeLetClientQuit(JQMessage message)

因为某些原因服务端使得客户端退出。

内部类

private class WriteThread extends Thread

书写消息线程。

内部类

private class FindWindow extends JDialog implements ActionListener

查找好友窗口。

private void dealFindUser(int type)

查找好友类型

public void actionPerformed(ActionEvent e)

查找按钮事件。

private void addOnlineUser(FriendUser user)

添加在线用户到面板上。

内部类

private class MyDefaultTableModel extends DefaultTableModel

定制的DefaultTableModel

内部类

private class Broadcastwindow extends JDialog implements WindowFocusListener

系统消息窗口。

 

 

 

类名称

RegisterPane

类描述

新用户注册类。

包描述

client.frm

函数描述

public RegisterPane()

注册窗体缺省构造函数。

private void init()

初始化面板。

public void actionPerformed(ActionEvent e)

取消按钮、更改头像按钮、注册按钮、设置按钮事件。

内部类

private class RegNewUser extends Thread

注册新用户线程

内部类

private class RegSuccess extends JDialog implements ActionListener

注册成功窗口

内部类

private class ChooseProtrait extends JDialog implements ActionListener

选择头像窗口

private void initJLabel(JLabel pane)

初始化一些面板,仅仅为简便方法。

private JPanel getPane(int begin,int end)

根据开始和结束获得面板。

public void actionPerformed(ActionEvent e)

按钮事件。

 

 

 

类名称

DAO

类描述

dao类,操作数据类。

包描述

dao

函数描述

Vector<T> findAll()throws Exception

查找所有数据。

boolean add(T obj)throws Exception

添加该对象。

boolean delete(T obj)throws Exception

删除该对象。

boolean update(T obj)throws Exception

更新该对象

T findById(U id)throws Exception

id查找该对象。

 

 

 

类名称

LogDAOByFile

类描述

日志处理类,以文件的方式处理Log

包描述

dao

函数描述

public boolean add(Log log) throws IOException

添加一条新日志。

public void deleteBeforeSomeDays(int n)

删除多少天前的日志。

public boolean delete(Log log) throws Exception

删除日志。无论如何都返回false,未作处理。

public Vector<Log> findAll() throws Exception

所有日志。无论如何都返回空,未作处理。

public Log findById(Integer id) throws Exception

id查找日志。无论如何都返回空,未作处理。

public boolean update(Log log) throws Exception

更新日志。无论如何都返回false,未作处理。

 

 

 

类名称

RecordDAOByFile

类描述

记录操作类,以文件的方式处理Record

包描述

dao

函数描述

public boolean add(Record record) throws FileNotFoundException, IOException

添加一条新记录。

public boolean addRecordForAdmin(Record record) throws FileNotFoundException, IOException

管理员添加一条新记录。

public boolean delete(Record record) throws Exception

删除一条记录。

public Vector<Record> findAll() throws Exception

查找所有记录。无论如何都返回空。未作处理。

public Vector<Record> findLeaveRecord(int jqnum) throws FileNotFoundException, IOException

查找好友发送的留言记录。

public boolean deleteRecordForAdmin(int jqnum)

删除管理员的记录。

public Record findById(Integer id) throws Exception

id查找记录。无论如何都返回空。未作处理。

public boolean update(Record record) throws Exception

更新记录。无论如何都返回false,未作处理。

 

 

 

类名称

UserDAOByFile

类描述

用户操作类,以文件的方式处理User

包描述

dao

函数描述

public boolean add(User user) throws FileNotFoundException, IOException

添加新用户。

public void addSysUser(Integer jqnum)

添加系统管理员

public boolean delete(User user)

删除用户

public Vector<User> findAll()

查找所有用户。

public User findById(Integer id)

id查找用户。

public Vector<User> findUserByName(String NickName)

按昵称查找用户。

public Vector<User> findOnlineUserByName(String NickName)

按昵称查找当前在线的用户。

public boolean update(User user) throws FileNotFoundException, IOException

更新用户。

public Vector<User> findOnlineAll() throws FileNotFoundException, IOException, ClassNotFoundException

查找当前所有在线用户。

public Vector<User> findOnline() throws FileNotFoundException, IOException, ClassNotFoundException

返回当前在线,且状态为在线、离开、繁忙的用户。

 

 

 

类名称

Face

类描述

表情类。

包描述

data

函数描述

public Face()

缺省构造第一个表情。

public Face(int num)

num构造表情。

 

 


 

 

类名称

FriendUser

类描述

好友类。用户登陆后,发送好友的信息到客户端。

包描述

data

函数描述

getter/setter方法

public boolean equals(Object obj)

覆盖

public String toString()

覆盖

 

 

 

类名称

JQMessage

类描述

客户端和服务端的消息类。

包描述

data

函数描述

getter/setter方法

public JQMessage(Integer type,Object obj)

根据类型、数据构造消息。

 

 

 

类名称

Log

类描述

日志类。

包描述

data

函数描述

getter/setter方法

public String toString()

覆盖

 

 

 

类名称

LoginUser

类描述

登陆用户类。

包描述

data

函数描述

getter/setter方法

 

 

 

类名称

Portrait

类描述

头像类。

包描述

data

函数描述

getter/setter方法

public Portrait(int num)

根据序号构造头像

 

public Portrait(int num,Integer state)

根据序号、用户状态构造头像

 

public Portrait(int num,Integer state,boolean isBig)

根据序号、用户状态、是否大头像构造头像

 

 

 

类名称

Record

类描述

聊天记录类。

包描述

data

函数描述

getter/setter方法

public String toString()

覆盖

 

 

 

类名称

RegUser

类描述

注册用户类。

包描述

data

函数描述

getter/setter方法

 

 

 

类名称

User

类描述

JavaQQ用户类。

包描述

data

函数描述

getter/setter方法

 

 

 

类名称

UserSex

类描述

性别类。

包描述

data

函数描述

getter/setter方法

public static String getSex(int type)

根据性别类型,得到性别。

public String toString()

覆盖

 

 

 

类名称

UserState

类描述

用户状态类。

包描述

data

函数描述

getter/setter方法

public static String getStateName(int state)

根据用户状态返回状态信息。

public String toString()

覆盖

 

 

 

类名称

DateDeal

类描述

日期处理类。

包描述

tools

函数描述

public static String getCurrentDate()

将当前日期返回"yyyy-MM-dd"的字符串表现形式。

public static String getCurrentTime()

将当前日期返回"yyyyMMdd HH:mm:ss"的字符串表现形式。

 

public static String getDate(Date date)

Date的日期返回"yyyy-MM-dd HH:mm:ss"的字符串表现形式。

 

public static String getDate2(Date date)

根据当前日期返回不同形式的字符串形式。如果与当前时间所在年月日相同,则返回"HH:mm:ss"形式,否则返回"yyyy-MM-dd HH:mm:ss"

 

 

 

类名称

FileDeal

类描述

文件信息处理类

包描述

tools

函数描述

public static boolean isKindOFType(File file,String suffixName)

根据文件的后缀名判断文件是否属于某种类型的

public static BufferedImage getICON(String fileName)

加载BufferedImage对象。

 

 

 

类名称

GetParameter

类描述

获取参数。

包描述

tools

函数描述

public static Properties getProp() throws Exception

获得属性文件。

public static boolean saveProp(String[] keys,String[] values) throws IOException

保存属性文件。

public static boolean setDefault() throws IOException

回复缺省值

public static Properties getDefault() throws IOException

取得缺省值的配置文件。

 

 

 

类名称

JQCreater

类描述

JQ号生成器类。

包描述

tools

函数描述

private RandomAccessFile getFile() throws FileNotFoundException,IOException

返回保存JQ号码的文件。

public Integer createJQ() throws FileNotFoundException, IOException

产生JQ号码

private boolean isAllowed(Integer num)

JQ号码是否为屏蔽的JQ号码。

private boolean isAllowReged(Integer num) throws FileNotFoundException, IOException

返回允许注册否

public Integer createID() throws FileNotFoundException, IOException

产生User用户ID

public void saveIDJQ(int id,int num) throws IOException

保存用户的idJQ号码

 

 

 

类名称

RandomUtil

类描述

数学类-随机数生成类

包描述

tools

函数描述

public static int randomInt(int a,int b)

生成a-b的随机数

public static int randomInt(int a)

返回0-a的随机数。

 

 

 

类名称

SetFont

类描述

设置字体类。

包描述

tools

函数描述

public static void setFont(Font font)

使用UIManager设置某些组件的缺省字体。

 

 

c)效果图

五、技术技巧提问

a)         使用属性文件?

b)        使用接口的方式,提供文件保存方式和数据库保存方式

c)         服务端和客户端断开连接时网络关闭的处理

d)        JTableJList的熟练使用、根据需要定制

e)         了解覆盖equalstoString方法。

六、附加说明

发布了41 篇原创文章 · 获赞 8 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ericxu1116/article/details/84389297