版權聲明:原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://java999.blog.51cto.com/259217/148287
|
<>
Apache Mina入門MINA 基本類的描述
IoAccepter 相當於網絡應用程序中的服務器端
IoConnector 相當於客戶端
IoSession 當前客戶端到服務器端的一個連接實例
IoHandler 業務處理邏輯
IoFilter 過濾器用於懸接通訊層接口與業務層接口
服務器端:MinaServer.java
public class MinaServer { private static final int SERVER_PORT = 9990; public static void main(String[] args) throws Throwable{ //服務端入口 IoAcceptor acceptor = new SocketAcceptor(); SocketAcceptorConfig cfg = new SocketAcceptorConfig(); cfg.setReuseAddress(true); //設定這個過濾器將以對象爲單位讀取數據 cfg.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory())); //添加日誌過濾器 cfg.getFilterChain().addLast("logger", new LoggingFilter()); //接收訪問的連接和到IoHandler觸發事件 acceptor.bind(new InetSocketAddress(SERVER_PORT),new ServerHandler(), cfg); System.out.println("The server Listening on port " + SERVER_PORT); } } 服務器端業務處理類: public class ServerHandler extends IoHandlerAdapter { /** * 有新連接時觸發 */ public void sessionOpened(IoSession session) { System.out.println("sessionOpened"); } /** * 收到來自客戶端的消息 */ public void messageReceived(IoSession session, Object message) { System.out.println("server messageReceived!"); CityMessage cm = (CityMessage)message; System.out.println(cm.getCode()+":"+cm.getName()); //將消息發向客戶端 session.write(cm); } /** * 當有異常發生時觸發 */ public void exceptionCaught(IoSession session, Throwable cause) { session.close(); } /** * 連接被關閉時觸發 */ public void sessionClosed(IoSession ssn) throws Exception { System.out.println("session closed from " + ssn.getRemoteAddress()); } } 要發送的消息對象: public class CityMessage implements Serializable{ private int code; private String name; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 客戶端: public class MinaClient { private static final String HOSTNAME = "localhost"; private static final int PORT = 9990; public static void main( String[] args ) throws Throwable{ //Connector爲客戶端入口 SocketConnector connector = new SocketConnector(); SocketConnectorConfig cfg = new SocketConnectorConfig(); //設定這個過濾器將以對象爲單位讀取數據 cfg.getFilterChain().addLast("codec", new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); //添加日誌過濾器 cfg.getFilterChain().addLast( "logger", new LoggingFilter() ); //向遠程服務器發起連接,觸發事件到IoHandler connector.connect(new InetSocketAddress( HOSTNAME, PORT ), new ClientHandler(), cfg ); } } 客戶端業務處理類: public class ClientHandler extends IoHandlerAdapter { public ClientHandler() { super(); } /** * 有新連接時觸發 */ public void sessionOpened(IoSession session) { // 創建一個cityMessage發送 CityMessage cm = new CityMessage(); cm.setCode(547600); cm.setName("鳳山"); session.write(cm); } /** * 收到來自客戶端的消息 */ public void messageReceived(IoSession session, Object message) { System.out.println("client messageReceived!"); CityMessage cm = (CityMessage)message; System.out.println(cm.getCode()+":"+cm.getName()); } /** * 當有異常發生時觸發 */ public void exceptionCaught(IoSession session, Throwable cause) { session.close(); } /** * 連接被關閉時觸發 */ public void sessionClosed(IoSession ssn) throws Exception { System.out.println("session closed from " + ssn.getRemoteAddress()); } } 開發一個Mina應用,簡單的說,就是創建連結,設定過濾規則,編寫自己的消息處理器這三步!
過濾器:
ObjectSerializationCodecFactory:設定這個過濾器將以對象爲單位讀取數據。
TextLineCodecFactory:設定這個過濾器將一行一行(/r/n)的讀取數據
注意:(摘抄自網上) 由apache mina建立的socket不管是採用TCP或是UDP,在Filter不添加codec選項的情況下,由IoHandlerAdapter派生的處理handler 類中public void messageReceived(IoSession session, Object message){}函數裏的message對象是IoBuffer的實例,如下:
@Override
public void messageReceived(IoSession session, Object message) throws Exception { if (! (message instanceof IoBuffer)) { return; } IoBuffer rb = (IoBuffer) message; callback.messageReceived(java.nio.ByteBuffer.wrap(rb.array(), 0, rb.buf().limit())); } 如果你使用mina建立一個socket添加了如下: IoFilter CODEC_FILTER = new ProtocolCodecFilter( new TextLineCodecFactory()); connector(acceptor).getFilterChain().addLast("codec", CODEC_FILTER); 如果發送數據的socket不是同樣的設置或者不是利用mina建立的socket則發送數據的時候需要在數據末尾添加‘/n’,以表示字符串結束。 本文出自 “青山” 博客,請務必保留此出處http://java999.blog.51cto.com/259217/148287 |