Apache Mina Server 是一個網絡通信應用框架,對socket進行了封裝。
http://www.cnblogs.com/moonandstar08/p/5475766.html?
http://blog.csdn.net/u010739551/article/details/47361365?
http://www.cnblogs.com/yanghuiping/p/4108063.html ?(mina 自定義編解碼)
Client端:
public class MinaClient {public static void main(String[] args) throws Exception{
//1.NioSocketConnector connector = new NioSocketConnector();
//2.connector.setHandler(new MyClientHandler());
//3.所有收發的消息都會經過攔截器,經攔截器進行消息的處理connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
//4.ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", 9898));future.awaitUninterruptibly();IoSession session = future.getSession();BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));String inputContent;while (!(inputContent = inputReader.readLine()).equals("bye")) {session.write(inputContent);}}}
將網絡和消息處理的代碼分開
public class MyClientHandler extends IoHandlerAdapter {@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {System.out.println("exceptionCaught");}@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {String s = (String) message;System.out.println("messageReceived: " + s);}@Overridepublic void messageSent(IoSession session, Object message) throws Exception {System.out.println("messageSent");}@Overridepublic void sessionClosed(IoSession session) throws Exception {System.out.println("sessionClosed");}@Overridepublic void sessionCreated(IoSession session) throws Exception {System.out.println("sessionCreated");}@Overridepublic void sessionIdle(IoSession session, IdleStatus status)throws Exception {System.out.println("sessionIdle");}@Overridepublic void sessionOpened(IoSession session) throws Exception {System.out.println("sessionOpened");}}
Server端:
public class MinaServer {public static void main(String[] args) {try {//1.NioSocketAcceptor acceptor = new NioSocketAcceptor();//2.網絡管理和消息處理的分割開來; MyServerHandler()專門處理消息分發和會話管理acceptor.setHandler(new MyServerHandler());//3.攔截器,責任鏈設計模式。所有收發的消息全部要經過攔截器過濾之后,消息才可以收發;//網絡上傳輸是字節,攔截器做對象的轉換工作;//ProtocolCodecFilter 二進制數據和對象進行轉化;MyTextLineFactory()內置的,對傳輸數據進行加解碼acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MyTextLineFactory()));//每隔5秒,檢查客戶端是否處于空閑狂態,檢測客戶端是否掉線acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);//4.服務器端口啟動起來,監聽9898acceptor.bind(new InetSocketAddress(9898));} catch (IOException e) {e.printStackTrace();}}}
?
public class MyServerHandler extends IoHandlerAdapter {@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {System.out.println("exceptionCaught");}@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {String s = (String) message;System.out.println("messageReceived: " + s);session.write("server reply: " + s);}@Overridepublic void messageSent(IoSession session, Object message) throws Exception {System.out.println("messageSent");}@Overridepublic void sessionClosed(IoSession session) throws Exception {System.out.println("sessionClosed");}@Overridepublic void sessionCreated(IoSession session) throws Exception {System.out.println("sessionCreated");}
//客戶端進入空閑狀態,檢測 客戶端 是否掉線@Overridepublic void sessionIdle(IoSession session, IdleStatus status)throws Exception {System.out.println("sessionIdle");}@Overridepublic void sessionOpened(IoSession session) throws Exception {System.out.println("sessionOpened");}}
?
public class MyTextLineFactory implements ProtocolCodecFactory {private MyTextLineDecoder mDecoder;private MyTextLineCumulativeDecoder mCumulativeDecoder;private MyTextLineEncoder mEncoder;public MyTextLineFactory () {mDecoder = new MyTextLineDecoder();mEncoder = new MyTextLineEncoder();mCumulativeDecoder = new MyTextLineCumulativeDecoder();}@Overridepublic ProtocolDecoder getDecoder(IoSession arg0) throws Exception {return mCumulativeDecoder;}@Overridepublic ProtocolEncoder getEncoder(IoSession arg0) throws Exception {return mEncoder;}}
?
public class MyTextLineCumulativeDecoder extends CumulativeProtocolDecoder {@Overrideprotected boolean doDecode(IoSession session, IoBuffer in,ProtocolDecoderOutput out) throws Exception {int startPosition = in.position();while (in.hasRemaining()) {byte b = in.get();if (b == '\n') {int currentPositoin = in.position();int limit = in.limit();in.position(startPosition);in.limit(currentPositoin);IoBuffer buf = in.slice();byte [] dest = new byte[buf.limit()];buf.get(dest);String str = new String(dest);out.write(str);in.position(currentPositoin);in.limit(limit);return true;}}in.position(startPosition);return false;}}
?
public class MyTextLineEncoder implements ProtocolEncoder {@Overridepublic void dispose(IoSession arg0) throws Exception {}@Overridepublic void encode(IoSession session, Object message, ProtocolEncoderOutput out)throws Exception {String s =null;if (message instanceof String) {s = (String) message;}if (s != null) {CharsetEncoder charsetEndoer = (CharsetEncoder)session.getAttribute("encoder");if (charsetEndoer == null) {charsetEndoer = Charset.defaultCharset().newEncoder();session.setAttribute("encoder", charsetEndoer);}IoBuffer ioBuffer = IoBuffer.allocate(s.length());ioBuffer.setAutoExpand(true);ioBuffer.putString(s, charsetEndoer);ioBuffer.flip();out.write(ioBuffer);}}}
?
public class MyTextLineDecoder implements ProtocolDecoder {@Overridepublic void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)throws Exception {int startPosition = in.position();while (in.hasRemaining()) {byte b = in.get();if (b == '\n') {int currentPositoin = in.position();int limit = in.limit();in.position(startPosition);in.limit(currentPositoin);IoBuffer buf = in.slice();byte [] dest = new byte[buf.limit()];buf.get(dest);String str = new String(dest);out.write(str);in.position(currentPositoin);in.limit(limit);}}}@Overridepublic void dispose(IoSession arg0) throws Exception {}@Overridepublic void finishDecode(IoSession arg0, ProtocolDecoderOutput arg1)throws Exception {}}
?