首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Apache Mina 入門指南:服務端/客戶端創建、編解碼器、心跳機制與粘包處理

     編輯:Java 綜合教學

Apache Mina 快速入門實戰

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));

三、Handler 核心方法 (繼承 IoHandlerAdapter)

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);

五、粘包/分包三大策略

  1. 固定長度消息:雙方約定每條消息固定字節數。
  2. 長度前綴:消息頭固定長度標識消息體長度。
  3. 分隔符:文本協議常用換行符(\n 或 \r\n)作為邊界。

Mina 提供 TextLineCodecFactory(分隔符)、PrefixedStringCodecFactory(長度前綴)等開箱即用編解碼器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved