太方便了真是太方便了。。。
其实MINA的文档已经很详细了,就让我再多嘴几句吧……。
主要接口:
IoSession:一个有效的网络连接会话,此会话将一直保持连接,除非网络断开或用户主动断开连接(session.close())
IoHandler:IoSession的监听器,也就是说当有网络事件发生时会通知IoHandler,用户不用去主动接受数据。用户只要实现此接口爱干吗干吗去吧。别忘了把它交给IoSession哦。
IoFilter:Io过滤器,对Io数据进行过虑,此接口实现可以在连接打开时添加。
具体说明:
import java.util.logging.Level;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.SessionConfig;
import org.apache.mina.io.IoHandlerAdapter;
import org.apache.mina.io.IoSession;
import org.apache.mina.io.socket.SocketSessionConfig;
import org.apache.mina.util.SessionLog;
public class AppProtocolHandler extends IoHandlerAdapter {
private boolean isLogin;
public AppProtocolHandler() {
}
public void dataRead(IoSession session, ByteBuffer buffer) throws Exception {
//当有数据读入时此方法被调用,数据封装在ByteBuffer中
if(!isLogin){
//如果用户没有登陆过则检查用户的合法性
// TODO 检查用户的合法性,如果不合法者放回错误代码给客户端或直接关闭连接\n
//如果合法则置isLogin=true
session.close();
}else{
// TODO 如果用户已经登陆成功则读取消息并返回应答给客户端
}
}
public void dataWritten(IoSession session, Object mark) throws Exception {
//当数据被写入通道时此方法被调用
SessionLog.log(Level.INFO,session,mark.toString());//必要时打印所写入的内容,mark的内容就是session.write(session,mark)中的第二个参数
}
public void exceptionCaught(IoSession session, Throwable arg1)
throws Exception {
//当出现网络异常时此方法被调用,这里要注意如果客户端要保持与服务器端的连接时不要在这里马上重新连接不然会抛出CancelKeyException运行期异常直接导致程序死掉(特别是与服务器端有超过两个连接时一定会发生并且此异常无法捕获),建议的方法是启动一个单独的线程来完成与服务器端的重新连接
session.close();
}
public void sessionClosed(IoSession session) throws Exception {
//当网络连接被关闭是此方法被调用
SessionLog.log(Level.INFO,session,"Close a Session");//必要时打印出信息
}
public void sessionCreated(IoSession session) throws Exception {
//当网络连接被创建时此方法被调用(这个肯定在sessionOpened(IoSession session)方法被调用),这里可以对Socket设置一些网络参数
SessionConfig cfg = session.getConfig();
if (cfg instanceof SocketSessionConfig) {
((SocketSessionConfig) cfg).setSessionReceiveBufferSize(2048);
((SocketSessionConfig) cfg).setKeepAlive(true);
((SocketSessionConfig) cfg).setSoLinger(true, 0);
((SocketSessionConfig) cfg).setTcpNoDelay(true);
((SocketSessionConfig) cfg).setWriteTimeout(1000 * 5);
}
}
public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception {
// 当网络通道空闲时此方法被调用,在这里可以判断是读空闲、写空闲还是两个都空闲,以便做出正确的处理
一半的网络通讯程序都要与服务器端保持长连接,所以这里可以发一下网络测试数据以保持与服务器端的连接
}
public void sessionOpened(IoSession session) throws Exception {
//当网络连接被打开时此方法被调用,这里可以对session设置一些参数或者添加一些IoFilter的实现,也可以对客户端做一些认证之类的工作
session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60);
}
}
今天就到这儿吧。