Apache Mina Server 是一個網絡通訊應用框架,也就是說,它主要是對基於TCP/IP、UDP/IP協議棧的通訊框架(然,也能夠提供JAVA 對象的序列化服務、虛擬機管道通訊服務等),Mina 能夠幫助咱們快速開發高性能、高擴展性的網絡通訊應用,Mina 提供了事件驅動、異步(Mina 的異步IO 默認使用的是JAVA NIO 做爲底層支持)操做的編程模型。Mina 主要有1.x 和2.x 兩個分支,這裏咱們講解最新版本2.0,若是你使用的是Mina 1.x,那麼可能會有一些功能並不適用。
Mina 同時提供了網絡通訊的Server 端、Client 端的封裝。 java
eclipse下的代碼結構以下: apache
import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public User() { } public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; /** * 對象客戶端接受處理類 * * @author Royal * */ public class ObjectMinaClientHandler extends IoHandlerAdapter { // 當一個服務端連結進入時 @Override public void sessionOpened(IoSession session) throws Exception { System.out.println("connect server : " + session.getRemoteAddress()); session.write(new User("mina", 18)); } // 當一個服務端關閉時 @Override public void sessionClosed(IoSession session) { System.out.println(session.getRemoteAddress() + " server Disconnect !"); } // 當服務器發送的消息到達時: @Override public void messageReceived(IoSession session, Object message) throws Exception { User u = (User) message; System.out.println("這裏是客戶端(" + session.getLocalAddress() + ")\t服務器(" + session.getRemoteAddress() + ")發來的消息: " + u.getName() + "\t" + u.getAge()); // 發送到服務端 session.write(u); } }
import java.net.InetSocketAddress; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.service.IoConnector; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketConnector; /** * mina測試客戶端 * @author Royal * */ public class MinaClient { public static void main(String[] args) { // Create TCP/IP connector. IoConnector connector = new NioSocketConnector(); // 建立接收數據的過濾器 DefaultIoFilterChainBuilder chain = connector.getFilterChain(); // 設定這個過濾器將以對象爲單位讀取數 ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory()); chain.addLast("objectFilter", filter); // 設定客戶端的消息處理器:一個ObjectMinaClientHandler對象, connector.setHandler(new ObjectMinaClientHandler()); // 連結到服務器: ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9988)); // 等待鏈接建立完成 cf.awaitUninterruptibly(); // 等待鏈接斷開 cf.getSession().getCloseFuture().awaitUninterruptibly(); // 客戶端斷開連接,釋放資源 connector.dispose(); } }
import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; /** * 對象服務接受處理類 * * @author Royal * */ public class ObjectMinaServerHandler extends IoHandlerAdapter { // 記錄接受數據的次數 private int count = 0; /** * 當客戶端 發送 的消息到達時 */ @Override public void messageReceived(IoSession session, Object message) throws Exception { // 咱們己設定了服務器解析消息的規則一個User對象爲單位傳輸: User u = (User) message; System.out.println("這裏是服務器(" + session.getLocalAddress() + ")\t收到客戶機(" + session.getRemoteAddress() + ")發來的用戶對象:" + u.toString() + "---------" + count); count++; if (count == 1000) { count = 0; // 服務器主動斷開與客戶端的鏈接 session.close(true); } // 發送到客戶端 session.write(u); } /** * 當一個客戶端鏈接進入時 */ @Override public void sessionOpened(IoSession session) throws Exception { System.out.println("incomming client: " + session.getRemoteAddress()); } /** * 當一個客戶端關閉時 */ @Override public void sessionClosed(IoSession session) throws Exception { System.out.println(session.getRemoteAddress() + " client Disconnect!"); } /** * 當捕獲到異常的時候 */ @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { System.err.println("error!!!!!!!!!!!!!"); super.exceptionCaught(session, cause); } }
import java.io.IOException; import java.net.InetSocketAddress; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; /** * mina服務端 * @author Royal * */ public class MinaServer { public static void main(String[] args) throws IOException { // 建立一個非阻塞的Server端 Socket,用NIO IoAcceptor acceptor = new NioSocketAcceptor(); // 建立接收數據的過濾器 DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); // 設定這個過濾器將以對象爲單位讀取數 ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory()); chain.addLast("objectFilter", filter); // 設定服務器端的消息處理器:一個ObjectMinaServerHandler對象, acceptor.setHandler(new ObjectMinaServerHandler()); // 服務器端綁定的端口 int bindPort = 9988; // 綁定端口,啓動服務器 acceptor.bind(new InetSocketAddress(bindPort)); System.out.println("Mina Server is Listing on:= " + bindPort); } }