關於apache mina 通信第一章(原創)

技術用到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;
  }
}
相關文章
相關標籤/搜索