系统结构
系统总体功能结构
由客户端程序界面可知,本网络通信系统包含以下主要功能:
- 用户注册;用户登录;
- 上线通知;退出下线通知;
- 查找好友;查看好友资料;
- 直接添加好友;添加好友;添加好友应答;
- 删除好友;更新好友列表;
- 发送消息;接收好友消息;发送文件,接收文件,接收陌生人信息;
根据系统的要求,出功能模块图如下
服务器模块设计
主服务器类设计
- 在设计服务器时需要考虑如下因素:
- 服务器的运行速度
- 服务器的响应速度,包括新建连接和发送数据的响应速度
- I/O吞吐量
- 其他:流量控制,安全性
- 针对TCP/IP协议的数据结构,设计服务器的程序结构需要考虑如下因素:
- 多线程
- 单线程
主服务器类实现了服务器端的多线程,即使用ServerSocket=new ServerSocket(8080)语句在8080端口创建套接口;使用new ServerThread(socket)语句创建新的线程。主服务器类调用ServerThread类,而每个ServerThread实体就是一个单独的线程,即对应于客户端连接请求响应的线程。服务器端有一个进程在指定的端口等待客户的连接信息,一旦连接成功,就可以按设计的数据交换方法和格式进行数据传输。客户端只在需要的时候向服务器发出连接请求。
多线程ServerThread类的设计
- ServerThread函数执行过程可描述如下:
- 执行ServerThread(Socket s)线程构造函数
- 执行socket=s 取得传递函数
- 使用BufferedReader(new InputStreamReader(socket.getInputStream()))创建数据流
- 使用PrintWriter(new BufferedWriter(new OutputStreamWrite(socket.getOutputStream())))创建输出流
- 使用start()函数启动线程
- 最后使用run()线程监听函数。
设计说明: run()函数用于监听已经建立连接的线程。
多线程ServerThread类的设计
- ServerThread函数执行过程可描述如下:
- 执行ServerThread(Socket s)线程构造函数
- 执行socket=s 取得传递函数
- 使用BufferedReader(new InputStreamReader(socket.getInputStream()))创建数据流
- 使用PrintWriter(new BufferedWriter(new OutputStreamWrite(socket.getOutputStream())))创建输出流
- 使用start()函数启动线程
- 最后使用run()线程监听函数。
设计说明: run()函数用于监听已经建立连接的线程。
登录验证模块设计
登录线程设计
- 用户登录流程表述如下:
- 客户端在登录窗口输入登录号码和登录密码,点击“登录”按钮。
- 客户端发送“login”请求,表示需要登录,连接服务器。
- 服务器run()函数监听到该信息后,连接数据库,准备从数据库中选择昵称和密码。
- 服务器接收到客户端发送过来的号码和密码信息后,设定数据库查寻条件,并执行数据库查寻,比较输入的用户名和密码和数据库中信息是否相符,如果相符则表示登录成功,并弹出登录后的主窗口。否则,则出现信息出错提示框。提示框如图所示:
好友管理模块
4.5.1 查找好友模块
当客户端向服务器发送查找好友的请求后,服务器立即响应并调用Class.forname 方法加载数据库驱动类sun.jdbc.odbc.JdbcOdbcDriver , 然后调DriverManager.getConnection完成数据库的连接,得到好友查询的结果。查询结果包括:好友的昵称,头像信息,性别,籍贯,E-Mail,个人资料等。客户端接收到查询结果后,利用响应的函数将其显示出来。
4.5.2 查看好友资料模块
用户在得到好友列表后,可根据需要读取好友的详细资料。查看好友资料功能是在查找好友功能的基础是建立的。当客户点击“查看资料”菜单子项时,客户主程序监听到用户的操作要求,同时调用void lookinfo_mousePressed(MouseEvent e)事件处理程序,把已经用Vector矢量保存好的好友号码,昵称,性别, IP地址,状态,头像和个人资料信息返回给客户。
4.5.3 直接添加好友模块
客户端发送“addnewfriend”请求,连接服务器,服务器根据客户端发来的用户号码和用户想要添加的好友的号码进行数据库操作,直接将该号码添加到用户的好友表中,而不需要经过被添加的用户的同意。
4.5.4 添加好友模块
- 添加好友的步骤如下:
- 客户端用户点击“加为好友”按钮,向服务器端发送“addfriend”请求。
- 服务器响应客户端用户的请求后,首先连接数据库,并根据接收的用户号码在fiend表中查询用户所有的好友号码,如果接收的用户想要添加的好友号码已经是好友的列表,则向客户端发送“same”应答,在客户端将弹出“该用户已经是你的好友的提示框 ”
- 如果该用户想要添加的好友未在用户好友表中,则根据接收的用户号码和好友号码向好友表添加记录,服务器使用r6保存查询结果,若r6为1,则表明添加成功,服务器将向客户端发出“ok addfriend”消息,否则,添加好友失败,服务器将给客户端发出“false addfriend”的消息
退出下线模块
用户在线时,数据库表的IP地址字段为此时用户计算机的IP地址;状态字段status
为1,若用户退出下线,服务器完成修改IP字段和状态字段。服务器首先利用Class.forName方法加载数据库驱动类sun.jdbd.odbc.JdbcOdbcDriver; 然后用DriverManager.getConnection连接数据库。最后根据用户号码,将其状态字段设为0,IP地址字段设为空。
客户通过Socket与服务器建立连接。服务器与客户都通过构造BufferedReader、PrintWriter来建立输入/输出流。双方通过该输入/输出流来互相传递消息。一旦收到客户端的连接请求,服务器利用accept()函数返回一个新建的Socket对象,随后客户端向服务器发送消息,诸如用户注册,登录请求、查找好友请求等。服务器收到请求后,针对不同的消息处理请求。
- 当服务器收到用户注册请求后,开始接收客户传递的消息,诸如客户的号码,昵称,密码,性别,头像,个人资料等等信息。接收完毕后,服务器通过JdbcOdbc与后台数据库连接,向数据库添加记录。
- 若新用户注册成功,则向客户返回号码,并在数据库中注册用户的IP地址,设定status值告知用户在线(Status为1)。客户收到服务器返回的信息后,打开主窗口,同时创建UDP以便在用户之间建立联系。
- 注册事件处理是客户端注册的主要部分。Java事件包括键盘事件,鼠标事件和按钮等事件。而所用到的是鼠标事件实际就是点鼠标按钮时,系统会调用监听器,包括mousePressed,mouseReleased,mouseClicked。监听流程如图所示:
未完待续