此次是在第一步通信上面加以补充 离线消息用的redis 作消息队列,假设 Apache mina作推送 http端请求发送信息 所有是json格式统一
java
查询用户 public NewsObject findByName(NewsObject o) throws Exception{ // TODO Auto-generated method stub Json json = new Json(); logger.info("com.xinhua.ServiceImpl.UserServiceImpl.findByName into"); if (((UserForm) o).getUsername() == null || ((UserForm) o).getUsername().equals("")) { json.setReturnNo(USER_NULL); logger.warn("login error code:"+USER_NULL); return json; } else if (((UserForm) o).getPassword() == null || ((UserForm) o).getPassword().trim().equals("")) { json.setReturnNo(PASSWORD_NULL); logger.warn("login error code:"+PASSWORD_NULL); return json; } ((UserForm) o).setUsername(((UserForm) o).getUsername().trim()); Users user = (Users) usersMapper.findByName(o); if (user == null || !user.getUsername().equals(((UserForm) o).getUsername().trim()) || !user.getPassword().equals(((UserForm) o).getPassword())) { json.setReturnNo(USER_PASSWROD_ERROR); logger.warn("login error code:"+USER_PASSWROD_ERROR); return json; } json.setReturnNo(SESSION_CODE); logger.info("User Login Success"); json.setRow(user); logger.info("com.xinhua.ServiceImpl.UserServiceImpl.findByName into"); return json; } 返回app 接口代码 public NewsObject loginApp(UserForm form) throws Exception { // TODO Auto-generated method stub Json json = (Json) findByName(form); final String userid = ((Users)json.getRow()).getId(); //String url = ""; if((SESSION_CODE)==json.getReturnNo()){//若是等于session code 那么表示登陆成功 form.setLoginKey(Resource.getInstall().randNumber()); json.setMsg(form.getLoginKey()); updateLoginKey(form); //读取全部离线消息 List<Object> list = redisTemplate.opsForList().range(REDIS_MESSAGE+((Users)json.getRow()).getId(),0,redisTemplate.opsForList().size(REDIS_MESSAGE+((Users)json.getRow()).getId())); for (Object object : list) { System.out.println("list -------"+object); } ((Users)json.getRow()).setMsgList(list); //读取redis 消息队列的消息 进行返回用户界面 //request.getRequestDispatcher("/user/web/index.do"); //url = "redirect:/user/web/index.do";//进行跳转操做 } return json; } 短连接发送消息代码 进行发送消息 public void sendMsg(NewsObject object) { MessageForm form = (MessageForm)object; UserForm user = new UserForm(); user.setId((form.getReviceId())); Users users = ((Users)userService.findByIdGetUser(user)); if(users.getLoginStatus()==1){//若是在线表示Apache mina 在线 进行在线消息推送 Message message = new Message(); message.setType(5);//web版本短请求发送消息 user.setId(String.valueOf(form.getSendId())); message.setUsername(((Users)userService.findByIdGetUser(user)).getUsername()); message.setMsg(form.getMsg()); message.setId(form.getId()); MyIoHandleWeb.getSession().write(JSON.toJSONString(message)); } messageMapper.insertMessage(form); redisTemplate.opsForList().rightPush(REDIS_MESSAGE+form.getReviceId(), JSON.toJSONString(form)); } 服务端核心代码 当接受消息是5表示推送消息 那么进行查询操做 进行消息推送 if(msg.getType()==5){ if(mina.map.get("user"+msg.getId()) != null){ mina.map.get("user"+msg.getId()).write(JSON.toJSONString(msg));//写到客户端 } }
今天的代码更新到此 后续会作 一些新的功能
web