【题目】物流企业信息管理系统的构建研究
【第一章】物流企业信息化建设探究绪论
【第二章】物流信管系统可行性研究
【第三章】物流企业信息管理需求分析
【第四章】信息管理系统总体设计
【第五章】物流公司信息系统的实现
【第六章】物流企业信息系统测试
【结论/参考文献】物流公司信息管理软件研发结论与参考文献
第 5 章 系统实现
因为系统包括基于 web 和基于 C/S 两种结构,在本文阐述过程中将逐一介绍。首先介绍基于 Web 的软件系统实现。
5.1、基于 Web 的软件系统实现
5.1.1、用户登陆功能实现
系统定义了 YHUser 类、YHWareUser 类、YHAdmin 类、YHDepAdmin 类用于支持与用户相关的操作。YHUser 是 YHWareUser 类、YHAdmin、YHDepAdmi 的父类。YHUser是用来定义和获取用户基本信息的类,本系统的普通用户角色中的用户可以直接使用YHUser 类描述。YHWareUser 继承于 YHUser 类,用来定义和获取普通用户角色中的仓储用户基本信息的类。YHAdmin 继承于 YHUser 类,用来定义和获取系统管理员基本信息的类。YHDepAdmin 继承于 YHUser 类,用来定义和获取部门信息管理员基本信息的类。
因为系统在初始化时已经建立了用户,所以省略了用户注册功能,用户初次使用本系统,直接使用由企业邮件通知的用户名和密码即可登陆本系统。用户首次成功登陆后,即可修改用户密码,用户名不允许修改。
在用户登陆界面 YHlogin.jsp 上定义一个文本框和一个密码框,用于用户输入用户名和密码,点击“登陆”按钮触发 action,由 struts 配置文件中定义的映射关系调用yhLoginCheck()方法。如果登陆成功,则将登陆用户名存放在 session 中,通过 GoUserUI()方法在 baseinfor 表中查找用户角色,根据用户角色跳转到相关界面。当用户角色等于 4时时,表示这是一个普通用户;等于 3 时,表示这是一个具有仓储管理权限的普通用户;等于 2 时,表示该用户是部门信息管理员;等于 1 时,表示该用户是系统管理员。
用户登陆流程图如图 5.1 所示,系统登陆界面如图 5.2 所示,系统管理员界面如图5.3 所示。
图 5.1 用户登陆流程图
图 5.2 用户登陆界面(index.jsp)
图 5.3 系统管理员界面(admin/index.jsp)
普通用户、部门信息管理员和系统管理员的界面基本一致,除了导航栏与系统管理员相比缺少相应的功能。
5.1.2、企业基础信息模块实现
现阶段的企业基础信息模块完成了企业员工的信息录入和查询工作。只要是系统的注册用户(全体员工)都可以通过导航栏中的“员工信息”调用它。用户可以补充和修改自己的信息,能够浏览别人的信息。
员工信息界面(info/index.jsp)如图 5.4 所示。
图 5.4 员工信息界面
点击自己的名字,进入到信息编辑页面 inforedit.jsp,在该界面上可以补充和修改个人信息;如果点击了别人的名字,则可以显示出该员工的基本信息。
5.1.3、仓储管理模块实现
用户登陆后,具有仓储管理使用权限的用户才能够通过操作界面选择仓储管理,在仓储管理页面中,可以看到入库信息、出库信息、还库信息和库存信息。仓储管理中所有的数据修改后,都通过 wareDao 类与数据库进行操作。
在库存列表界面(warehouse/warelistall.jsp)中选择要入库的产品名称,点击与该产品名对应的入库链接,进入 inStorage.jsp 界面,调用 wareList()方法,进入 wareList.jsp界面,显示出与该产品相关的数据,确认入库数据后点击“入库”按钮,调用wareDao.insert()方法,将入库信息插入 storage_instocks 表中。
入库管理功能的流程如图 5.5 所示。
图 5.5 入库流程图
为了便于用户操作,系统在库存列表界面中显示产品库存数据的同时,设置了入库和出库两个链接,分别对于产品的入库和出库操作。与入库处理相同,在进行出库处理时,首先在库存列表界面(warehouse/warelistall.jsp)中选择要出库的产品名称,点击与该产品名对应的出库链接,进入 outStorage.jsp 界面,调用 wareList()方法,进入wareList.jsp 界面,显示出与该产品相关的数据,确认出库数据后点击“出库”按钮,调用wareDao.insert()方法,将出库信息插入storage_outstocks表中,并调用weareDao.delete()方法,将出库数据从 storage_instocks 表中删除。出库管理功能的流程如图 5.6 所示。
图 5.6 出库流程图
仓储管理涉及的所有方法都定义在 WareMan 类中。库存列表的界面显示如图 5.7 所示。
图 5.7 库存列表界面5.1.4、企业公告管理实现
所有的用户都可以浏览公告信息,但是只有部门信息管理员有权发布、修改和删除信息。所有的公告都是按照提交部门分类的,公告发布后系统通过 getDateTime()方法自动记录公告发布时间。最后由 informDao.save()方法将数据保存到公告信息表 inform 中。
使用 informDao.find()查找公告信息,它的参数是一个字符串变量,可以是部门名或 all,如果是 all 则查找全部公告,在 find()方法中调用了 sort()按照时间降序序列对公告排序,再通过 informView.show()方法在 inform.jsp 页面上显示。
企业公告显示界面如图 5.8 所示。
图 5.8 公告显示界面
5.2、企业聊天软件的实现
根据企业业务需要,系统提供一个工具软件——YH-Hello 聊天软件,该工具只限企业员工使用,员工可以不受任何限制在所有员工范围内添加好友。企业员工默认已经注册了用户,用户帐号是工作证号,用户昵称为“部门名-员工名”,密码为工作证号。用户首次登陆后可以修改昵称和密码,但昵称必须保留原格式,且部门部分不允许改变,员工名可以自行修改。
YH-Hello 聊天软件是一个典型的 Java 程序,分为客户端和服务器端,服务器端分为应用服务器和数据服务器。在现有部署环境中,该聊天工具的服务器和本系统提供的基于 B/S 架构的软件系统部署在同样的应用服务器和数据服务器中。应用服务器提供YH-Hello 的服务界面,包括服务启动关闭等功能,并提供监听端口,随时响应客户端的请求。数据服务器使用 mysql 数据库存储用户、密码、昵称、聊天信息等数据。客户端提供登陆界面、好友列表界面和聊天界面供用户执行操作,并使用线程与服务器进行通信。
在物流企业信息系统界面上提供调用 YH-Hello 聊天软件的按钮(如果用户使用默认安装路径),用户也可以从系统外直接调用该软件。因为 YH-Hello 用于工作,所以在设计时简化了通用聊天类软件的部分功能,如只考虑好友列表,而不考虑陌生人和黑名单的情形,在该软件中,好友的定义是与该用户工作相关的企业员工。
5.2.1、程序包结构设计
服务器端由四个包构成:
com.yhhello.server.view 是服务器端呈现包,包括 YH-Hello 服务器端的服务管理界面。
com.yhhello.server.model 是服务器端模型包,包括服务器端所有的业务逻辑。
com.yhhello.server.db 是服务器端数据库操作包,用于数据库的操作交互。
com.yhhello.common 是服务器端公共包,在客户端也有同样的包存在,用于保持服务器和客户端的一致。
服务器端包结构如图 5.9 所示。
图 5.9 YH-Hello 服务器端包图
客户端也由四个包构成:
com.yhhello.client.view 是客户端呈现包,包括 YH-Hello 的登陆界面、好友列表界面和聊天界面。
com.yhhello.client.model 是客户端模型包,包括客户端所有的业务逻辑。
com.yhhello.client.thread 是客户端线程包,用于处理通信线程以及管理线程类、好友列表类和聊天界面类。
com.yhhello.common 是客户端公共包,在服务器端也有同样的包存在,用于保持服务器和客户端的一致。
客户端包结构如图 5.10 所示。
图 5.10 YH-Hello 客户端包图
5.2.2、客户端设计与实现
5.2.2.1、客户端界面
1、 客户端登录界面:YhCliLogin.java界面布局分析:界面可以分为上、中、下三部分,上面是公司的图片 Logo,可以定义一个 JLabel 对象 Jltop,图片 Logo 使用 ImageIcon 绘制;下面是一个 JPanel 的流布局,定义 JPanel 对象 Jpfoot,在 Jpfoot 上提供两个按钮,分别定义 JButton 对象 Jb1、Jb2,触发“登陆”、“取消”事件,为了界面美观,两个按钮都是使用 ImageIcon 绘制;中间是登陆界面的主体部分,可以使用用户名(用户昵称)和工作证号两种方式登陆聊天,所以在登陆界面的主体部分由选项卡 JTabbedPane 对象 Jt_switch1 来对两个不同的Jpanel 对象(一个用于用户名登陆 Jpm1,一个用于工作证号登陆 Jpm2)进行切换。打开登陆界面默认显示的是用户名登陆。在 Jpm1 和 Jpm2 上都使用网格来布局,网格定义为 3 行 3 列,即 GridLayout(3,3),在其上定义了 6 个控件来实现界面功能,其中包括3 个 JLabel 对象,分别定义为文本“用户名”(Jpm2 则为“工作证号”)、“密码”和“忘记密码”;1 个 JTextField 对象,定义用户名输入框(Jpm2 则为工作证号输入框);1 个JpasswordField 对象,定义密码输入框;1 个 JCheckBox 对象,定义为“记住密码”。为了使用户在点击“登陆”后,触发客户端与服务器的连接,在登陆按钮 Jb1 上添加 addActionListener()方法用于响应用户点击操作,定义 actionPerformed()方法,在点击登陆按钮后创建一个 YhCliUser 对象和一个 User 对象,User 对象中分别使用 getText()和getPassword()获得登陆时使用的用户名和密码。然后使用 checkCliUser(User ur)方法判断结果是否为真,为真则表示可以跳转到好友列表界面并使用 dispose()方法关闭登陆界面。如果为假,则使用 JOptionPane.ShowMessageDialog()方法弹出一个对话框表示“用户名与密码不一致,请重新登陆!”
如果用户成功登陆,则跳转到该用户的好友列表界面,所以在点击 Jb1 的同时,还要发送一个要求返回在线好友信息的 YhMessage 包。设计步骤如下:
1. 判断是否点击了 Jb1 按钮,如果是则发送一个要求返回所有在线好友的信息包,为了能保存返回的好友信息,首先创建一个 YhFriList 对象 friList,该对象的参数是发出请求客户端的用户名,使用 getUser()方法获得,getUser()在 com.yhhello.common 包中 User 类中定义;传递客户端用户名的目的是告诉服务器要找谁的好友列表;2. 使用 YhManFriList 类中的 addFriList()方法把好友信息添加到 friList;3. 创建一个 YhMessage 对象,定义它的发送者是本客户端,信息类型是请求在线好友类型“Mess_get_onLinFri”;4. 使用对象流的方法发送 YhMessage。
YH-Hello 客户端登陆界面如图 5.11 所示。
图 5.11 YH-Hello 登陆界面
2、 好友列表:用户登陆成功后,调用好友列表界面:YhFriList.java界面布局分析:界面整个是一个 Jpanel BorderLayout 布局,上面是一个 JLabel,定义文本“好友列表”,下面部分是一个 JScrollpane 控件,在其上放置了 Jpanel GridLayout布局,初始化一个 JLabel 数组用来显示用户名和头像。因为想要鼠标移动到用户时出现高亮效果,则对每一个 JLable 做一个 addMouseListener 监听,并在 mouseEntered()方法中,定义一个 JLabel 对象 JLa,使之初始化为 arg0.getSource(),并设置其前景色。使用同样的方法在 mouseExited()中恢复原有的前景色,即可产生鼠标移动时的高亮效果。另外,当鼠标双击某一用户时,弹出聊天界面,则在 mouseClicked()方法中首先通过arg0.getSource().getText()得到用户名,并赋值给 string 变量 uname;然后创建一个YhChat(string)对象(该对象在 YhChat.java 中定义),将 uname 传入。
当一个用户成功登陆后,向服务器发送一个 Mess_get_onLinFri 类型的 YhMessage,向服务器请求他的所有好友信息;服务器接到请求后,向客户端发送一个Mess_retu_onLinFri 类型的 YhMessage,返回该客户端所有的好友信息。系统默认初始情况下 YhFriList 定义只有该用户自己在线,别人都不在线,在获得服务器的响应后,需要更新客户端的好友列表。定义 updateFriend(YhMessage m)方法来执行更新操作。设计思路是:定义一个字符串数组 onLinFri[]来保存由 m 中获得的好友名。
当点击好友列表中的某个用户时,会从 YhFriList.java 跳转到 YhChat.java,即聊天界面。为了获取当前用户,则在 mouseClicked()方法中创建一个 YhChat(friusid, uName)对象,string 类型的 firusid 中储存的是已经在 mouseClicked()方法中获得的好友用户名。另外要在好友列表的标题栏中显示当前用户的用户名,则在构造函数中添加一个参数 stringuName。在创建了聊天界面后,按照程序设计逻辑,要把它加入到聊天界面管理类YhManChat 中,使用 YhManChat.addChat()方法添加。
好友列表界面如图 5.12 所示。
图 5.12 好友列表界面
3、 聊天界面 YhChat.java
界面布局分析:包括一个 JTextArea 对象用于显示聊天内容,一个 Jpannel 对象,在Jpannel 对象上有一个 JTextField 对象用于输入聊天信息和一个 JButton 对象的“发送”按钮。
因为在聊天界面的标题上要显示正在与谁聊天的信息,为了能够获取当前聊天对象,在构造函数 YhChat(String friusid, String uName)中定义两个参数。friusid 表示与谁聊天,uName 表示我是谁。
监听发送按钮 Jb,如果用户点击了发送按钮,则做如下处理:
1、 创建一个 YhMessage 对象 m1,在 YhMessage 类中有私有成员变量 sender 用于表示发送信息的人,getter 表示接收信息的人,content 用于表示信息内容。使用m1.setSender() 、 m1.setGetter() 和 m1.setContent() 分 别 获 取 它 们 的 值 。 其 中m1.setSender()获取的是 uName 的值;m1.setGetter()获取的是 friusid 的值;m1.setContent()获取的是 JTextField 对象 jtf1 中输入的字符串,使用 jtf1.getText()方法即可以获得。
2、 将获得的信息 m1 发送给服务器。创建一个 objectOutputStream 对象,并使用writeObject(m1)方法将 m1 发送给服务器。
另外,为了在聊天界面的 JTextArea 对象 Jta 中不停的读取 YhMessage 对象数据,定义 run()方法并循环执行它。在 run()方法中可以获得 YhMessage 对象 m1 中发信人、收信人和信息内容,通过一个 String 类型的变量 dialogue,对其赋值为 m1.getSender()+" 对"+m1.getGetter()+" 说:"+m1.getContent()+"\r\n",然后使用Jta.append(dialogue)将dialogue添加到 Jta 中,则可以通过聊天界面逐一显示每一条聊天信息。格式如下:
“业务部-Lesley 对 业务部-小猫 说:你好!”
聊天界面如图 5.13 所示。
图 5.13 聊天界面
5.2.2.2、客户端业务逻辑
客 户 端 的 业 务 逻 辑 层 包 括 两 个 包 , com.yhhello.client.model 和com.yhhello.client.thread。之所以分为两个包,主要考虑线程和管理在客户端的业务逻辑中是比较复杂和重要的部分,所以将与它们相关的业务逻辑单独定义了一个包。另外在调用关系上,两个包虽然都在业务逻辑层,但有层次上的区别。
YhCliConSer.java 位于 com.yhhello.client.model 包,是客户端后台程序,用于与服务器端交互。YhCliConSer 类定义了客户端发送信息给服务器的方法。YH-Hello 客户端发送给服务器的信息内容可以分为两类:一类是用户登陆信息;另一类是聊天信息,即当用户登陆后直至用户退出软件,发送的都是聊天信息。基于这两类信息的不同,定义了YhCliconLogin()方法和 YhClicon()方法,分别应用于首次连接(即登陆连接)和其它连接(非登陆连接),它们的参数都是一个对象类型。
YhCliconLogin(object o)方法设计思路:
1、 定义一个 Socket 对象 sc,定义服务器 IP 地址和监听端口,监听端口必须与服务器端 com.YHhello.server.model 包中的 YhSerVerify 类中定义的监听端口一致。
2、 创建一个 objectOutputStream 对象,并使用 writeObject()将对象发出。
3、 使用 InputStream()方法接收信息,接收的信息是一个 object 对象,将该对象转换为YhMessage 对象。
4、 判断返回的信息类型,在 MessType 类中定义了 YH-Hello 最常见的信息包类型接口,与本段程序相关的有:如果信息类型=1,表示登陆成功确认包(mess_succ);信息类型=2,表示登陆失败确认包(mess_fail)。
5、 因为 YhCliconLogin 用于登陆连接,所以定义当信息类型等于 1 时,YhCliconLogin()返回 true,并创建一个该客户端与服务器通信的线程,步骤如下:
(1) 创建一个 YhCliConSerThr 对象(sc 是它的参数),然后启动该线程。
(2) 将该线程加入到线程管理类 YhManCliSerThr 中,该类中定义了 addCliConSerThr方法可以添加线程。
YhClicon(object o)方法相对来说比较简单,定义 socket 通信即可。
YhCliUser.java 位于 com.yhhello.client.model 包,它定义了一个 boolean 类型的方法checkCliUser(User ur),该方法的参数是一个 User 对象(在公共包中定义),用于验证用户是否合法,在该方法中调用 YhCliconLogin 方法。
YhCliConSerThr.java 文件位于 com.yhhello.client.thread 包中,它用于定义客户端连接服务器端线程。创建线程的关键是将 socket 对象传进来,因此在定义构造函数时,使之带有一个 Socket 类型的参数。只要客户端和服务器通信,就一定会使用YhCliConSerThr,在该类中定义了 run()方法用于不停的读取服务器端发来的信息。run()方法设计思路如下:
1、定义一个 YhMessage 对象 m 用于保存从 s.getInputStream()中读取的信息。s 是一个socket 对象,实际上我们获取的信息是一个对象流,要把它强制转换成 YhMessage对象。
2、 根据获取消息包的类型进行相应的处理。
(1) 如果消息类型是 mess_content,则把它显示在聊天界面上。
(2) 如果消息类型是 mess_get_onLinFri,则更新好友列表。
YhManCliConSerThr.java 文件位于 com.yhhello.client.thread 包中,它用于管理客户端线程。使用 HashMap 存储所有的线程,它的 K 值是用户帐号,V 值是 YhCliConSerThr类型的线程。对它提供 addCliConSerThr()方法和 getCliConserThr()方法用于将线程加入到 HashMap 和通过用户帐号取得该线程。
YhManChat.java 文件位于 com.yhhello.client.thread 包中,它用于管理聊天界面。设计思路与其它管理类基本一致,将所有的聊天界面存储到 HashMap 中,并提供加入addChat(String chatid, YhChat yhchat)和取出 getChat(String chatid)两个方法。
YhManFriList.java 文件位于 com.yhhello.client.thread 包中,它用于管理好友列表。
设计思路同上,将所有的好友信息存入 HashMap,提供加入 addFriList(String yhfrid,YhFriList yhfrilist)和取出 getFriList(String yhfrid)两个方法。
5.2.3、服务器端设计与实现
5.2.3.1、服务器端界面
服务器主界面 YhSerMainpage.java,它在 com.yhhello.server.view 包中。
界面分析:服务器主界面的功能是通过该界面可以启动和关闭服务器:
为了实现这一功能,在界面上定义两个 JButton 对象 Jb1 和 Jb2,分别对应“启动服务器”和“关闭服务器”按钮,这两个按钮放在一个 Jpanel 上。
在 Jb1 上做监听,一旦点击了 Jb1 按钮,即使用 getSource()获得的值等于 Jb1,则创建 YhSerVerify 对象,启动服务器;当 getSource()获得的值等于 Jb2,执行 System.exit(0)关闭服务器。
界面呈现如图 5.14 所示:
图 5.14 服务器界面
5.2.3.2、服务器端业务逻辑
在服务器的业务逻辑层包括 3 个主要类,分别是:
YhSererify:服务器后台程序,所谓的启动服务器就是调用该程序。它提供验证客户端的功能。
YhSerConCli:服务器连接客户端的线程,每个客户端连接服务器都会为它创建一个线程。
YhSerManCli:管理服务器连接客户端的线程。
业务逻辑层的所有操作都部署在 com.YHhello.server.model 包中。
服务器后台程序 YhSerVerify.java 用于监听客户端是否有连线请求并验证用户信息。
程序设计思路如下:
1. 创建 ServerSocket 对象 ss,定义监听端口;2. 发现是否有堵塞,如果有则表示服务器与客户端之间存在连接,如果没有则表示现在是等待连接阶段。使用 accept()方法判断是否存在堵塞;3. 接收客户端发送的信息,在本程序中,客户端和服务器端在网络上以对象流的方式传递信息。将 getInputStream()获得的信息转换为 User 类型,使用 readObject()读取User 对象,此时的 User 对象中包括的是用户名和密码信息。
4. com.yhhello.server.db 包中的 YhSerConDb 类定义了数据库的操作,调用该类中定义的方法验证用户名和密码是否正确。如果正确,则 setMessType("1")。反之则返回 2。
在 com.yhhello.com 包中的 YhMessage 类中定义,1 表示登陆成功;2 则表示登陆失败。将信息类型使用 writeObject()方法返回客户端。
5. 创建 YhSerConCli 对象 scc1,并通过 YhSerManCli 类中 addCliThread()为连接的客户端开辟 scc1 线程,使用 start()方法启动线程,使用 notifyOUser()通知其它在线用户。
scc1 线程可以保持服务器和该客户端之间的通信。
6. 循环执行 2-5 步,为每个连接的客户端开辟一个线程。
在 YhSerVerify 的程序流程中,我们可以看到 YhSerConCli 和 YhSerManCli 两个类起到了重要的作用。
YhSerConCli.java 文件中定义了服务器与某个特定的客户端的通信线程,它的构造函数中的参数是一个 Socket 对象,传递该参数的目的是获得服务器与该客户端的连接。
YhSerConCli.java 主要由 run()方法和 notifyOUser()方法组成。
run()方法用来接收和转发客户端发来的信息。程序设计思路如下:
1. 从 Socket 中读取 YhMessage,获得的 YhMessage 是由 object 类型转换而来的。
2. 通过 YhMessage 类中定义的 getSender()、getGetter()和 getCon()方法获取发送者、接收者和信息内容。
3. 根据 YhMessage 类对从客户端获取的消息进行类型判断:
(1) 如果该消息的类型为“Mess_content”,则表示这是一个聊天信息包。此时服务器要将这个 YhMessage 对象转发给接收者,步骤如下:
1) 先取得接收者的通信线程,它由 YhSerManCli 类中 getCliThr(m1.getGetter())方法获得,m1 是 YhMessage 对象。
2) 获得接收者的通信线程后,以对象流的方式转发 m1。
(2) 如果该消息的类型为“Mess_get_onLinFri”,则表示这是一个请求在线好友的信息包。此时服务器要将把该客户端的所有好友发送给该客户端,步骤如下:
1) 调用 YhSerManCLi 类中的 getAllUser()得到所有好友名;2) 创建一个 YhMessage 对象 m2,设置它的类型是 Mess_retu_onLinFri(该类型表示这是一个返回在线好友信息包);内容为好友名;接收者是m1.getSender(),即 m2.setGetter(m1.getSender()),即此时的接收者就是向服务端发出请求的客户端;3) 以对象流的方式转发 m2。
以上是 run()方法的主要功能和设计思路,另外一个重要的方法 notifyOUser()的功能是通知其它用户,有一个客户端连接了服务器。程序描述如下:
1. 首先得到所有在线的用户线程,我们使用 HashMap 保存服务器上开辟的所有线程。
Hashmap 使用迭代的方法遍历它的 key 值,从而获得所有的在线用户,即 Iteratorit1=hm.keySet().iterator();2. 当 it1.hasNext()为真时,表示这是一个在线用户的线程。我们定义一个 YhMessage对象,设置该 YhMessage 对象的类型是 Mess_retu_onLineFri,即返回在线好友包(关于 YhMessage 的各种定义在 YhMessage.java 中提到),并取出在线用户的名字,将其设置为该 YhMessage 的接收者。
YhSerManCli.java 文件中定义了专门管理客户端线程的类,它可以获得客户端所有的 Socket。程序设计思路:使用 HashMap 保存所有的客户端通信线程,要对其提供添加和取出方法。步骤如下:
1. 创建一个静态的 HasMap 对象 hm,它的 K 值是用户帐号,V 值是一个 YhSerConCli对象;2. 定义 addCliTrh()方法,其参数分别为 String 类型的用户帐号和 YhSerConCli 类型的用户 Socket,使用 hm.put(uName,scc)增加一个客户端通信线程;3. 定义 getCliThr()方法,其参数是 String 类型的用户帐号,使用 hm.get(uName)方法返回用户帐号。如果用户在线,则在 HasMap 中一定存在用户帐号。
4. 定义一个 getAllUser()方法,返回所有的在线好友,只要使用迭代器遍历 HashMap的 K 值即可。
YhSererify、YhSerConCli 和 YhSerManCli 构成了服务器端业务逻辑层的主要结构。
5.2.4、公共包
com.yhhello.common 是公共包,它在服务器端和客户端同时存在,且没有变化。公共包用于保持服务器和客户端的一致。
公共包由 YhMessage.java,MessType.java 和 User.java 三个文件组成,分别用来定义消息、消息类型和用户。
YhMessage 类中定义了信息类型 messType、发送人 sender、收信人 getter 以及信息内容 content,并分别定义了设置和获取它们的 set 和 get 方法。
MessType 类中定义了消息包的类型接口。包括登陆成功包(Mess_succ)、登陆失败包(Mess_fail)、聊天信息包(Mess_content)、请求在线好友包(Mess_get_onLinFri)和返回在线好友包(Mess_retu_onLinFri)。
User 类中定义类中定义了用户名和密码,并提供了它们的 set 和 get 方法。
5.3、本章小结
本章详细阐述了系统的实现过程。从程序结构上来看系统的开发可以分为两部分:
基于 B/S 的 web 软件系统开发和基于 C/S 的企业聊天软件开发。
基于企业实际需求,对于 Web 系统来说,仓储管理和企业公告发布在本系统研发前企业已经存在相关软件进行了信息化管理,它们分别是 VMI 供应商仓储管理系统和企业办公自动化系统的一个组成部分。但是由于各种原因,企业需要用更简单灵活的方法从复杂的信息中获取最重要的信息,从而提高仓储管理和企业公告发布系统的利用率,因此在这两个模块设计上,我们以紧靠企业需求为目标,简化了大型系统的功能,突出了关键数据重点显示,强调了一目了然的数据呈现风格。
基于 C/S 的企业聊天软件支持单聊、群聊等功能。尽管位于同一个局域网,系统仍然限制了客户端与客户端的直接通信,通过服务器转发,使得聊天数据可以保存在服务器上。另外数据只在企业内部网络传递,可以有效提高数据的安全和通信的安全。