package server;
import org.apache.log4j.Logger;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import exception.NoIpException;
import tools.Debug;
public class MinaServerHandle extends IoHandlerAdapter {
private Logger logger = Logger.getLogger(this.getClass());
private ServerModel serverModel;
private ClientRequest_Dispatcher clientRequest_Dispatcher;
public ServerModel getServerModel() {
return serverModel;
}
public void setServerModel(ServerModel serverModel) {
this.serverModel = serverModel;
}
public ClientRequest_Dispatcher getClientRequest_Dispatcher() {
return clientRequest_Dispatcher;
}
public void setClientRequest_Dispatcher(ClientRequest_Dispatcher clientRequest_Dispatcher) {
this.clientRequest_Dispatcher = clientRequest_Dispatcher;
}
/**
* 接收到新的数据
*
* @author Feng
*/
@Override
public void messageReceived(IoSession ioSession, Object message) {
logger.info("received");
// 接收客户端的数据
// IoBuffer ioBuffer = (IoBuffer) message;
// byte[] byteArray = new byte[ioBuffer.limit()];
// ioBuffer.get(byteArray, 0, ioBuffer.limit());
NetworkPacket packetFromClient = (NetworkPacket) message;
Debug.log("byteArray.length = " + packetFromClient.getMessageLength());
// System.out.println(DataTypeTranslater.bytesToInt(byteArray, 0));
// dealRequest(session, byteArray);
// for (byte b : packetFromClient.arrayBytes)
// System.out.println(b);
clientRequest_Dispatcher.dispatcher(packetFromClient);
}
@Override
public void sessionClosed(IoSession session) throws Exception {
Debug.log("sessionClosed");
}
/**
* 异常捕捉
*
* @author Feng
*/
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
if (cause.toString().equals("java.io.IOException: Connection reset by peer"))
return;
logger.error("throws exception");
logger.error("session.toString() : " + session.toString());
logger.error("cause.toString() : " + cause.toString());
if (cause.toString().equals("java.io.IOException: 远程主机强迫关闭了一个现有的连接。")) {
try {
session.close();
} catch (Exception e) {}
return;
}
String exceptionStack = "";
for (StackTraceElement element : cause.getStackTrace())
exceptionStack += element.toString() + "\n";
logger.error("stack : " + exceptionStack);
logger.error("Report Error Over!!");
}
/**
* 由底层决定是否创建一个session
*
* @author Feng
*/
@Override
public void sessionCreated(IoSession session) throws Exception {
super.sessionCreated(session);
Debug.log("sessionCreated");
}
/**
* 创建了session 后会回调sessionOpened
*
* @author Feng
*/
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
// count++;
// Debug.log("The " + count + " client connected! address : " + session.getRemoteAddress());
Debug.log("New client connected! address : " + session.getRemoteAddress());
addClientUserToTable(session);
}
/**
* session 空闲的时候调用
*
* @author Feng
*/
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
super.sessionIdle(session, status);
Debug.log("connect idle");
}
/**
* 发送成功后会回调的方法
*
* @author Feng
*/
@Override
public void messageSent(IoSession session, Object message) throws Exception {
super.messageSent(session, message);
try {
logger.info("Send Packet(" + NetworkPacket.getMessageType((byte[])message).name() + ") to Client!");
} catch (Exception e) {
}
// Debug.log("message send to client");
}
/**
* 将新的用户添加到“已连接用户信息表”中
*
* @param ioSession
* @author Feng
*/
public void addClientUserToTable(IoSession ioSession) {
// 已有就不加进来了
if (serverModel.getClientUserFromTable(ioSession.getRemoteAddress().toString()) != null) {
Debug.log(Debug.LogType.ERROR, "User exist when Save user into Table!");
logger.error("添加时用户已存在");
return;
}
Debug.log("ServerNetwork", "Find new User(" + ioSession.getRemoteAddress() + ") connected,save into table");
try {
serverModel.addClientUserToTable(ioSession, new ClientUser(ioSession));
} catch (NoIpException e) {
e.printStackTrace();
}
}
}