第4章 系统实现
4.1聊天子系统的实现
(1)聊天子系统主要实现要点:
1)用户首先登录验证,通过new 一个socket,先跟服务器端建立连接,服务器连接成功后把这个socket交给线程池,然后把用户信息在此次通信socket里,进行分离,看操作命令,如果是检测用户命令,则拿到数据库中用户表去查询,如果验证不成功把原因反馈给用户,并关闭此次连接,如果存在,服务器则更新在线人数,并把在线人数和自己的用户名发给所有的用户;把用户名和输出流放到一个map集合中;同时把此次的socket和用户名保存到另一个map集合中;利用输出流返回客户端。
2)用户上线时,用户验证通过后,先返回一个消息,通知客户端,让他打开好友管理界面,把服务器在线的名字全部接收过来,对于本客户端,则把服务器给我的名单加载我的列表中,其他客户端上线或下线时,则自动更新自己的好友列表。
3)用Jtree来描述好友列表,自动增删Jtree节点不太容易,并且添加节点不注意会添加重复的,因此选择把用一个Set集合来存放名字,作为一个中间变量,对于名字的增删在Set集合中操作,每一次操作完之后,把Jtree清空,重新添加。
4)对于聊天窗体对象的问题,为了实现只要在线就能接受好友的信息,采用List集合来存储聊天对象,有多少好友包括群,就创建多少聊天窗口对象,只要更新好友,就创建。只是不让它显示,这样就能保证只要在线就能收到消息
5)关于socket关闭的问题,当客服端在登陆时,如果用户验证不通过,则先关闭服务器端的socket通信连接,然后再关闭当前对象的socket通信;当客服端已经与服务器建立了连接,即登陆成功时,需要关闭时,先要通知服务器,让服务器把当前跟自己通信的socket关闭连接这样才能才能让服务器,结束当前与之当前交互的线程,把时间片留给其它线程,还能够统计客服端下线的等功能。 (2)Chat客户端实现部分代码如下:
/**
* 发送消息给服务器 * @param name 本机客户端 * @param objectName 目标客户端
* @param message 消息内容 注:这时不需要考虑message中是否包含分隔符 */
public void sendMessageToServer(String name, String objectName,
String messageType,String message) {
25
因为服务器按顺序取
}
if (message.equals(\ }
message = \保证服务器,发空白
pw.println(messageType + SEPSTR + name + SEPSTR + objectName + SEPSTR
+ message);
/**
* 关闭通信 */
public static void closeSocket() { }
if (pw != null) { } try { }
if (socket != null) { }
pw.println(CLOSESOCKET);// 通知服务器关闭
socket.close();
} catch (IOException e) {
(3)Chat服务器端实现部分代码如下:
/**
* 初始化服务器相关内容 */
public Server() {
try {
serverSocket = new ServerSocket(8182);
ip = InetAddress.getLocalHost().getHostAddress(); port = serverSocket.getLocalPort();
allPw = new HashMap
26
} catch (IOException e) {
}
}
/**
* 服务器开始工作 */
public void serverStart() { } /**
* 关闭服务器 */
public void serverClose() {
//先通知每个客户端,服务器要停止了
String message=\由于系统升级维护中,你也被迫掉线,请稍候重新登录\f = true;
doEve = new Thread() { };
doEve.start();
@Override
public void run() { }
while (f) { }
try { }
socket = serverSocket.accept();
threadPool.execute(new SendClientMessage(socket)); try { }
} catch (Exception e) {
serverSocket.close(); e1.printStackTrace();
} catch (IOException e1) {
sendClientMessageToOtherClient(\GROUPSEND,SERVERSTOPMESSAGE,mess
//方式一:遍历集合中的key,再用遍历器 // 先关闭服务器
27
age);
}
Set
//由于sockets集合在不断的更新,所以遍历会出现异常//解决:将keys先转化为数组
String []keyArr=keys.toArray(new String[]{}); for(int i=0;i f = false;// 停止链接 try { } String key=keyArr[i]; try { } sockets.get(key).close(); e.printStackTrace(); } catch (IOException e) { ConcurrentModificationException sockets.clear();//清空所有的socket serverSocket.close(); e.printStackTrace(); } catch (IOException e) { 4.2 Web前端子系统的实现 4.2.1商品展示模块的实现 (1)主要实现要点: 商品展示模块主要实现的功能有在首页默认分页浏览所有商品,查看商品排行榜,还可以通过商品名称检索或分类查询所得的结果集进行分页展示,这里最重要的一点就是三种方式中分页功能要分别实现;然后就是展示商品详情的时候,需要把查询几个跟该种类相同的商品作为猜你还喜欢的部分,来增加页面显示的内容,给用户的快捷的选择。这里最总要的实现有两点,一是自己发布的商品不允许购买,而是加入购物车只能一次。 (2)其中实现进入首页的部分java代码如下: public List } return commodities; public void setCommodities(List 28 } this.commodities = commodities; public String execute(){ } ICommodityDao commodityDao=DaoFactoryUtil.getCommodityDao(); totalPage=commodityDao.totalPage(myPage); if(page!=0){ } try { } return \ commodities=commodityDao.findByPage(myPage); e.printStackTrace(); return \} catch (Exception e) { myPage.setPage(page); 4.2.2订单处理模块的实现 (1)主要实现要 1)订单处理和购物车管理都有一个实现的共性,那就是采用商品容器对象,商品容器就是用来描述你所选择的商品,它有三个属性,分别是所选商品集合、所选商品总金额、所选商品总件数,所选商品集合又是由所选择的每件商品及对应的数量、金额属性所组成。这样实现的目的有两个,一是为了好管理和统计商品容器中的信息;二是为了使商品容器的功能能够得到共享,比如可以构造成一个购物车,或者直接用在确认订单信息和查看订单详情时。 2)订单处理另外一个重要的地方就是商品在成功购买时,数据库中的库存量要相应的进行变化。 (2)其中实现确认订单信息的部分java 代码如下: //判断session中是否包含haveDifferOper,有,则移除 if(mySession.containsKey(\ } //获取用户默认的收货地址 User user =(User) mySession.get(\defaultAddress=user.getAddress()+\ \ mySession.remove(\ (\收) \ 29