第五章 详细设计
第五章 详细设计
5.1 服务器端的设计与实现
C/S模式下的系统开发,很显然服务器端程序的设计是非常重要的。下面就服务器端的相关程序模块进行设计,并一定程度上实现了相关功能。使用SeverSocket s=newServerSocket(端口)语句在端口创建套接口;使用new ServerThread(socket)语句创建新的线程。服务器类调用ServerThread类,而每个ServerThread实体就是一个独立的线程,刚好对应于客户端的连接请求响应线程。每一个客户登陆,如果验证成功,将会显示在服务器端。为了更好的显示后台服务器端,设计了相应的服务器端图形界面,如图6。
图6 服务器端界面
当服务器打开时会同时监听登陆线程(LoginListener)类、监听消息线程(MesListener)类这三个线程。
登陆线程(LoginListener)类主要是负责服务器的用户登陆显示、发送给登陆用户好友列表、发送给登陆用户其在线好友,通知上线信息等。
在服务器的登录表注册登录,并更新登陆显示的主要代码为:
win.getDao().addLoginUser(lm);
win.setTmodel(win.getDao().getLoginModel()); win.getTab().setModel(win.getTmodel());
发送给登陆用户好友列表的主要代码为:
15
安康学院本科生毕业论文(设计)
ArrayList
friList=win.getDao().getFriendsList(lm.getQqnum());
SendModel.sendFriList(lm, friList); MesModel if(mm!=null){
SendModel.sendMes(mm,
win.getDao().deleteMes(lm.getQqnum());
}
lm.getQqip(),
发送给登陆用户留言
mm=win.getDao().getmesModelByID(lm.getQqnum());
FinalFile.CLI_MES_PORT);
5.2 用户注册模块
当用户使用Client界面,点击注册账号,用户要把个人资料填写完,此时有一个注册类线程开启,同时验证用户填写的个人资料是否合法。如果合法,将注册的信息插入到用户表用户中,同时还会将申请的账号返回给用户,用户可以通过这个账号和自己注册的密码进行登录。如果不合法,系统拒绝申请,返回到登陆界面。注册模块图如图7。
图7 用户注册模块图
注册好友的方法如下所示。
注册不成功界面 返回给用户一个编号 注册不规范 用户注册验证 注册规范 用户注册 public void LoginId( String qqname,String qqpass,String qqdesc,int qqsex,String qqbirthday){
String sql=\into qquser values(sq_user.nextval, '\
16
第五章 详细设计
_date( '\dbutil.executeDML(sql); } 5.3 登陆模块 5.3.1登录模型图
当用户使用账号和密码进行登录,这时候有一个登录线程将用户发过来的用户信息和后台数据库里的用户信息进行比对。如果用户的账号和密码与之完全匹配,则用户成功登录,并且返回给用户登录账号的好友列表、好友资料、好友状态。如果不匹配,服务器则告知登陆的用户登录失败。用户登录活动图8。
图8 登陆模型图
显示好友界面 返回到登陆失败界登陆成功 登陆失败 登录用户 验证登陆 5.3.2登录验证
利用JFrame类写一个登陆界面类(ClientFrame),在登陆界面类给所有的按钮添加监听事件类(LoginFrameHandler)。点击登陆进入验证登陆环节,将登陆界面获取的登陆账号、密码、状态全部用一个登陆用户类(LoginModel)分装起来,然后写一个方法,根据获取的账号和密码,从数据库中查找,如果能找到,那么说明有这个用户,用户进入登陆成功,显示好友界面这一环节;如果根据账号和密码,从数据库中找不到该用户,那么说明密码和账号有问题,这时提示输入密码和账号有问题,请关闭当前提示,请重新登陆。
17
安康学院本科生毕业论文(设计)
实现验证登陆功能方法的代码如下。 public boolean isEnter(LoginModel lm){
String
sql=\
qqnum
from
qquser
qqnum=\qqpass='\
dbutil.setSet(dbutil.executeQuary(sql)); try {
if(dbutil.getSet().next()){
return true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block e.printStackTrace(); } finally{
dbutil.closeAll();
}
return false;
}
发送登陆信息的代码方法如下。
public static void sendLogin(LoginModel lm) {
try {
socket=newSocket(FinalFile.SER_IP, FinalFile.SER_LOGIN_PORT); objout
=
ObjectOutputStream(socket.getOutputStream());
objout.writeObject(lm);
} catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block e.printStackTrace(); } finally {
closeAll();
18
where and
new
第五章 详细设计
}
}
如果上面的验证登陆成功后,那么就进入登陆成功这一环节,此时用JFrame类写一个客户端好友界面(ClientFrame),在这个好友界面里添加好友模型(FriendPanel),获取头像、姓名、签名。并在好友界面里添加监听好友模型线程类(FriListListener)、好友状态改变线程类(ChangeFriTypeListener)、以及消息线程(MesListener)。好友模型线程是为了获取好友的信息;好友状态改变线程是为了监听好友的装太多改变;消息线程是为了获取好友的消息。
好友模型线程(FriListListener)类主要是显示好友列表到界面、并刷新好友列表界面等功能。实现这一功能的主要代码如下所示。
ArrayList
win.getFrisPanel().setFrisView(friList); win.getFrisPanel().repaint(); win.getContentPane().repaint(); win.validate();
好友状态改变线程类(ChangeFriTypeListener)类,主要是将该边状态的好友重新显示在好友列表客户端,并对改变了的好友不断的刷新,这部分功能代码如下。
LogUnLogModel cm=(LogUnLogModel)objin.readObject(); ArrayList
fpList=win.getFrisPanel().getFriPanList();
for (FriendPanel friendPanel : fpList) { um())
{
friendPanel.getFriModel().setLogtype(cm.getLogType()); friendPanel.getPicLab().setIcon(friendPanel.getImage());
break; } }
if(friendPanel.getFriModel().getQqnum()==cm.getChangeQqn
19

