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