Mina 是基於 NIO 的高性能網絡框架,本文整理學習資源、服務端客戶端搭建步驟、核心 Handler 生命周期及粘包解決方案。
// 1. 創建監聽器
IoAcceptor acceptor = new NioSocketAcceptor();
// 2. 添加過濾器鏈:日誌、編解碼
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"))));
// 3. 設置業務 Handler
acceptor.setHandler(new TimeServerHandler());
// 4. 會話參數:緩衝區、空閒超時
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
// 5. 綁定端口啟動
acceptor.bind(new InetSocketAddress(PORT));
public class TimeServerHandler extends IoHandlerAdapter {
@Override public void exceptionCaught(IoSession session, Throwable cause) {
cause.printStackTrace(); session.close();
}
@Override public void messageReceived(IoSession session, Object message) {
String str = message.toString();
if ("quit".equalsIgnoreCase(str.trim())) { session.close(); return; }
session.write(new Date().toString());
System.out.println("Message written...");
}
@Override public void sessionIdle(IoSession session, IdleStatus status) {
System.out.println("IDLE " + session.getIdleCount(status));
}
// 可選重寫:sessionCreated, sessionOpened, sessionClosed, messageSent
}
IoConnector connector = new NioSocketConnector();
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"))));
connector.setHandler(new TimeClientHandler());
ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", PORT));
future.awaitUninterruptibly();
IoSession session = future.getSession();
// 控制台交互發送
Scanner sc = new Scanner(System.in);
while (true) {
String str = sc.next();
if ("quit".equalsIgnoreCase(str)) break;
session.write(str);
}
session.getCloseFuture().awaitUninterruptibly();
connector.dispose(true);
Mina 提供 TextLineCodecFactory(分隔符)、PrefixedStringCodecFactory(長度前綴)等開箱即用編解碼器。