About the first chapter of apache mina communication (original)

技术用到mongodb    入门篇  主要为了实现功能写的 代码不简洁 求吐槽 这章功能是为了实现 A点登录 然后B点登录 把A点登录挤出去
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javassist.expr.NewArray;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;


public class mina {
 public static HashMap<String, IoSession> map = new HashMap<String, IoSession>();
 /**
  * @param args
  * @throws  IOException 
  */
 public static void main(String[] args) throws IOException {
 // TODO Auto-generated method stub
 /**
  * 建立监听
  */
 IoAcceptor acceptor=new NioSocketAcceptor();
 acceptor.getSessionConfig().setReadBufferSize(2048);
 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);

 acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );  
 acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
 acceptor.setHandler(new MyIoHandle());//绑定监听事件
 
 acceptor.bind(new InetSocketAddress(9123));
 
 System.out.println("OK server");
 }

}


核心代码  这段代码是处理登录连接代码


import java.util.Date;

import org.apache.mina.core.future.CloseFuture;
import org.apache.mina.core.service.IoHandlerAdapter; 
import org.apache.mina.core.session.IoSession;

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

import dbUnit.MongoService;
import dbUnit.MongoServiceImpl;

import form.Message;



public class MyIoHandle extends IoHandlerAdapter{
 @Override
 public void messageReceived(IoSession session, Object message)
 throws Exception {
 Message msg = (Message)message;
 System.out.println(msg.getMsg());//打印接受消息
 MongoService userDAO = new MongoServiceImpl("chatdb", "users");//mongodb 查询用户
 if(msg.getType() == 1){//1 表示登录操作
         DBObject objGet = new BasicDBObject();  
         msg.setLastLoginTime(new Date().toString());//把最新的登录时间
         objGet.put("username", msg.getUsername());//查询用户是否存在  
        
         objGet = userDAO.getByObj(objGet);  ///获取用户
         session.setAttribute("user",objGet.get("_id"));//设置用户对象
         if(Integer.parseInt(objGet.get("status").toString() )== 1){//如果状态为1 表示登录状态做以下处理
          Message rMsg = new Message();//实例化返回消息对象
          rMsg.setType(1);//type表示登录异常
          rMsg.setPhoneType(msg.getPhoneType());//设置当前登录用户设备
          rMsg.setLastLoginTime(msg.getLastLoginTime());//把当前用户登录时间告知用户
          mina.map.get(objGet.get("_id").toString()).write(rMsg);//写到客户端
          
          mina.map.put(objGet.get("_id").toString(), session);//把当前用户放进去 把之前的去掉
         }else{
          msg = new Message();//如果没有登录
          msg.setMsg("300");//登录成功
        
          DBObject objGet1 = new BasicDBObject();  
          objGet1.put("status", 1);//更新状态
          //mongodb更新操作
          session.setId(objGet.get("_id").toString());
          userDAO.updateCell(objGet, new BasicDBObject("$set",objGet1));//
          mina.map.put(objGet.get("_id").toString(),session);
          
          
         }
 //System.out.println("用户+"+);
 }
 
 // TODO Auto-generated method stub
 System.out.println(message.toString());
 
 //super.messageReceived(session, message);
 }
 @Override
 public void sessionCreated(IoSession session) throws Exception {
 // TODO Auto-generated method stub
 super.sessionCreated(session);
 
 }
 @Override
 public void sessionClosed(IoSession session) throws Exception {
 // TODO Auto-generated method stub
 super.sessionClosed(session);
 /*
  * 比对 当前用户 和被挤下线的用户 如果相等表示是最新用户推出 如果是不等表示挤下线的用户 不做任何操作
  */
 if(session == mina.map.get(session.getAttribute("user").toString())){//当前用户退出那么更改状态
 MongoService userDAO = new MongoServiceImpl("chatdb", "users");
 DBObject objGet = new BasicDBObject();  
 objGet.put("_id", session.getAttribute("user"));  
 DBObject objGet1 = new BasicDBObject();  
         objGet1.put("status", 0);
         userDAO.updateCell(objGet, new BasicDBObject("$set",objGet1));
 }else{
 
 
 }
 
 }
}


//消息的载体
package form;

import java.io.Serializable;

public class Message implements Serializable{
 private int type;
 private String msg;
 private String username;
 private String password;
 private String accessPwd;
 private int phoneType;//登录类型
 private String lastLoginTime;//登录时间
 
 
 public String getLastLoginTime() {
 return lastLoginTime;
 }
 public void setLastLoginTime(String lastLoginTime) {
 this.lastLoginTime = lastLoginTime;
 }
 public int getPhoneType() {
 return phoneType;
 }
 public void setPhoneType(int phoneType) {
 this.phoneType = phoneType;
 }
 public int getType() {
 return type;
 }
 public void setType(int type) {
 this.type = type;
 }
 public String getMsg() {
 return msg;
 }
 public void setMsg(String msg) {
 this.msg = msg;
 }
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
 this.username = username;
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password;
 }
 public String getAccessPwd() {
 return accessPwd;
 }
 public void setAccessPwd(String accessPwd) {
 this.accessPwd = accessPwd;
 }
 
}

客户端处理异常消息


import java.util.Scanner;

import org.apache.mina.core.future.CloseFuture;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.IoFuture;
import org.apache.mina.core.future.IoFutureListener;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.session.IoSessionInitializer;

import form.Message;

public class ClientHandler  extends IoHandlerAdapter{
 @Override
 public void messageReceived(IoSession session, Object message)
 throws Exception {
 // TODO Auto-generated method stub
 Message msg = (Message)message;
 if(msg.getType() == 1){
 System.out.println("您已经"+msg.getLastLoginTime()+"在"+msg.getPhoneType()+"设备已经登录");
 Scanner scanner = new Scanner(System.in);
 if(scanner.next().equals("yes")){//如果返回
 System.out.println(" returun login main");
 chatClient.con.dispose();//返回主页面
 
 }else{
 
 session.write(chatClient.LoginForm("123456789","test"));//如果重新连接的话  再次写数据到服务器
 }
 }
 //super.messageReceived(session, message);
 }
 private final String values;

 public ClientHandler(String values) {
 this.values = values;
 }

 @Override
 public void messageSent(IoSession session, Object message) throws Exception {
 // TODO Auto-generated method stub
 super.messageSent(session, message);
 System.out.println(message+"success");
 
 }
 @Override
 public void sessionOpened(IoSession session) throws Exception {
 // TODO Auto-generated method stub
 
 //super.sessionOpened(session);
 }
 @Override
 public void sessionCreated(IoSession session) throws Exception {
 // TODO Auto-generated method stub
 System.out.println("session client create");
 
 
 super.sessionCreated(session);
 }
 @Override
 public void sessionClosed(IoSession session) throws Exception {
 // TODO Auto-generated method stub
 
 
 
 }
 
 
 public static boolean activeCloseSession(IoSession session)
  {
 
   CloseFuture cf = session.getCloseFuture();
   IoFutureListener<IoFuture> closeListener = new IoFutureListener<IoFuture>() {
           public void operationComplete(IoFuture future) {
             
           }};
   cf.addListener(closeListener);
   cf.getSession().close(false);
   cf.awaitUninterruptibly();
   
   return true;
  }
}
{{o.name}}
{{m.name}}

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=324114315&siteId=291194637