Mina 第一個mina程序(一)
阿新 • • 發佈:2017-07-20
session flush 讀寫 @override value handle jar conn nco
引入兩個jar包 :
mina-core-2.0.3.jar
slf4j-api-1.6.0.jar
服務端編寫 : Server和handler
Server:
public class MyServer { public static void main(String[] args) throws IOException { // 初始化了服務端的TCP/IP 的基於NIO 的套接字 //IoAcceptor的抽象是IoServivce :服務端 IoAcceptor acceptor = new NioSocketAcceptor();// 調用IoSessionConfig設置讀取數據的緩沖區大小 acceptor.getSessionConfig().setReadBufferSize(2048); // 讀寫通道均在10 秒內無任何操作就進入空閑狀態 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 在bind前執行的準備工作 // TextLineCodecFactory 編解碼器工廠來對字符串進行編解碼處理。 acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); acceptor.setHandler(new MyIoHandler()); acceptor.bind(new InetSocketAddress(9123)); } }
handler :
public classMyIoHandler extends IoHandlerAdapter{ // 這裏我們使用的SLF4J作為日誌門面,至於為什麽在後面說明。 private final static Logger log = LoggerFactory.getLogger(MyIoHandler.class); @Override public void messageReceived(IoSession session, Object message) throws Exception { String str = message.toString(); //簡單打印客戶端傳過來的數據 System.out.println("The message received is [" + str + "]"); if (str.endsWith("quit")) { session.close(true); return; } } @Override public void sessionCreated(IoSession session) throws Exception { System.out.println("session create"); } @Override public void sessionClosed(IoSession session) throws Exception { System.out.println("session closed"); } }
客戶端編寫 :client 和handler
client:
public class MyClient { //編寫IoService並註冊過濾器 public static void main(String[] args) { //IoConnector的抽象是IoServivce:客戶端 IoConnector connector = new NioSocketConnector(); connector.setConnectTimeoutMillis(30000); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); //為IoService註冊Handler connector.setHandler(new ClientHandler("你好!\r\n 大家好!")); connector.connect(new InetSocketAddress("localhost", 9123)); } }
handler:
public class ClientHandler extends IoHandlerAdapter{ private final static Logger LOGGER = LoggerFactory.getLogger(ClientHandler.class); private final String values; public ClientHandler(String values) { this.values = values; } @Override public void sessionOpened(IoSession session) throws Exception { session.write(values); } }
mina重要對象介紹 :
IoService對象
//IoService的常用方法 //獲取傳輸方式的元數據描述信息,也就是底層到底基於什麽的實現,譬如:nio、apr 等。 TransportMetadata transportMetadata = connector.getTransportMetadata(); //增加刪除一個監聽器:監聽IoService 的創建、活動、失效、空閑、銷毀 //參考IoServiceListener 接口中的方法,這為你參與IoService 的生命周期提供了機會 connector.addListener(null); connector.removeListener(null); //獲取IoService上管理的所有IoSession,Map的key是IoSession的id Map<Long ,IoSession> maps = connector.getManagedSessions(); //獲取IoSession的配置對象:讀數據的緩存大小,多少秒進入空閑狀態 connector.getSessionConfig(); //1.IoAcceptor 服務端的IoService 增加bind端口方法 //2.IoConnector 客戶端的IoService 增加connect與server建立連接
IoSession對象
//IoSession : 這個接口用於表示Server 端與Client 端的連接 @Override public void sessionOpened(IoSession session) throws Exception { //這個方法用於寫數據,該操作是異步的。 session.write(values); //關閉IoSession,該操作也是異步的,參數指定true 表示立即關閉,否則就在所有的寫操作都flush 之後再關閉。 session.close(); //向會話中添加一些屬性,這樣可以在會話過程中都可以使用, //類似於HttpSession 的setAttrbute()方法。IoSession 內部使用同步的HashMap 存儲你添加的自定義屬性。 session.setAttribute("設置屬性"); //獲取遠端連接的套接字地址 session.getRemoteAddress(); //用於掛起寫操作,那麽有void resumeWrite()方法與之配對。對於read()方法同樣適用。 session.suspendWrite(); //用於讀取數據, 但默認是不能使用的, 你需要調用IoSessionConfig 的 //setUseReadOperation(true)才可以使用這個異步讀取的方法。一般我們不會用到這個方法, //因為這個方法的內部實現是將數據保存到一個BlockingQueue,假如是Server 端,因為大 //量的Client 端發送的數據在Server 端都這麽讀取,那麽可能會導致內存泄漏,但對於 //Client,可能有的時候會比較便利。 // session.read(); //返回與當前會話對象關聯的IoService 實例 session.getService(); }
Mina 第一個mina程序(一)