1.用戶端
1.1編寫用戶端
package com.boonya.protocol; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.log4j.Logger; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.service.IoConnector; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.LineDelimiter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketConnector; import com.boonya.protocol.handler.request.ClientMessageHandler; public class MyClient { private static Logger logger = Logger.getLogger(MyClient.class); private static String HOST = "127.0.0.1"; private static int PORT = 8900; public static void main(String[] args) { // 建立一個非組設的用戶端用戶端 IoConnector connector = new NioSocketConnector(); // 設定連結逾時時間 connector.setConnectTimeoutMillis(30000); // 添加過濾器 connector.getFilterChain().addLast( // 添加訊息過濾器 "codec", // Mina內建的根據文本分行符號編解碼的TextLineCodec過濾器 看到\r\n就認為一個完整的訊息結束了 new ProtocolCodecFilter(new TextLineCodecFactory(Charset .forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); // 添加商務邏輯處理器類 connector.setHandler(new ClientMessageHandler()); IoSession session = null; try { ConnectFuture future = connector.connect(new InetSocketAddress( HOST, PORT)); future.awaitUninterruptibly(); // 等待串連建立完成 session = future.getSession(); session.write("mina"); } catch (Exception e) { logger.info("用戶端連結異常..."); } session.getCloseFuture().awaitUninterruptibly(); logger.info("Mina要關閉了"); connector.dispose(); } }
1.2用戶端邏輯處理
package com.boonya.protocol.handler.request; import org.apache.log4j.Logger; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; public class ClientMessageHandler extends IoHandlerAdapter { private static Logger logger = Logger.getLogger(ClientMessageHandler.class); public void messageReceived(IoSession session, Object message) throws Exception { String msg = message.toString(); logger.info("用戶端接收到的資訊為:" + msg); } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { logger.info("用戶端發生異常..." + cause); } }
2.服務端
2.1 編寫服務端
package com.boonya.protocol; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.log4j.Logger; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.LineDelimiter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; import com.boonya.protocol.handler.response.ServerMessageHandler; public class Myserver { private static Logger logger = Logger.getLogger(Myserver.class); private static int PORT = 8900; public static void main(String[] args) { // 建立非阻塞的server端的socket IoAcceptor acceptor = null; try { acceptor = new NioSocketAcceptor(); // 設定日誌過濾器 acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast( // 添加訊息過濾器 "codec", // Mina內建的根據文本分行符號編解碼的TextLineCodec過濾器 看到\r\n就認為一個完整的訊息結束了 new ProtocolCodecFilter(new TextLineCodecFactory(Charset .forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); // 設定讀取資料的緩衝區的大小 acceptor.getSessionConfig().setReadBufferSize(2048); // 讀取通道10s內無操作進入空閑狀態 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 綁定邏輯處理器 acceptor.setHandler(new ServerMessageHandler()); // 綁定連接埠 acceptor.bind(new InetSocketAddress(PORT)); logger.info("伺服器啟動成功.. 連接埠號碼為:" + PORT); } catch (Exception e) { e.printStackTrace(); } }
2.2服務端業務處理
package com.boonya.protocol.handler.response; import java.util.Date; 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; public class ServerMessageHandler extends IoHandlerAdapter { public static Logger logger = Logger.getLogger(ServerMessageHandler.class); public void sessionCreated(IoSession session) throws Exception { logger.info("服務端與用戶端建立串連"); } public void sessionOpened(IoSession session) throws Exception { logger.info("伺服器與用戶端串連開啟..."); } public void messageReceived(IoSession session, java.lang.Object message) throws Exception { String msg = message.toString(); logger.info("服務端接收的資料為:" + msg); if ("bye".equals(msg)) {// 伺服器斷開的條件 session.close(true); } Date date = new Date(); session.write(date); } public void messageSent(IoSession session, Object message) throws Exception { logger.info("服務端發送訊息成功..."); } public void sessionIdle(IoSession session, IdleStatus status) throws java.lang.Exception { logger.info("服務端進入空閑狀態..."); } public void exceptionCaught(IoSession session, Throwable cause) throws Exception { logger.info("服務端發送異常..."+cause); } public void sessionClosed(IoSession session) throws Exception { logger.info("關閉串連..."); } }