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