技術用到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; } }