最基本的那個例子,也就是官網上的那個demo,我就不說了...
1、demo地址:http://weavesky.com/2010/02/19/mina-article-2/
但是我們實際項目中,肯定比不是如此的傳輸一兩個資料的,我們需要傳對象...老樣子在此上傳demo的原始碼
此例子參考了himi的博文,博文地址:http://www.himigame.com/category/apache-mina
官網網站:http://mina.apache.org/mina-project/userguide/user-guide-toc.html
2、依賴的包:
mina-core-2.0.7.jar
slf4j-api-1.7.2.jar
slf4j-jdk14-1.7.2.jar
slf4j-log4j12-1.7.2.jar
3、用戶端和服務端目錄結構圖:
一、Server
1、MinaServer
package com.potter;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.transport.socket.SocketAcceptor;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class MinaServer {private static final int bindPort=8899;public static void main(String[] args){SocketAcceptor acceptor = new NioSocketAcceptor();DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();ProtocolCodecFilter filter= new ProtocolCodecFilter(new HCoderFactory(Charset.forName("UTF-8"))); //添加編碼過濾器 處理亂碼問題、編碼問題chain.addLast("objectFilter",filter);//設定核心訊息業務處理器acceptor.setHandler(new MinaServerHanlder());try {// 綁定連接埠acceptor.bind(new InetSocketAddress(bindPort));} catch (IOException e) { System.out.println("Mina Server start for error!"+bindPort);e.printStackTrace();}System.out.println("Mina Server run done! on port:"+bindPort);}}
2、MinaServerHanlder
package com.potter;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;public class MinaServerHanlder extends IoHandlerAdapter {private int count = 0;public void sessionCreated(IoSession session) {System.out.println("新用戶端串連");}@Overridepublic void sessionOpened(IoSession session) throws Exception {// TODO Auto-generated method stubcount++;System.out.println("第 " + count + " 個 client 登陸!address: : "+ session.getRemoteAddress());}@Overridepublic void sessionClosed(IoSession session) throws Exception {// TODO Auto-generated method stubsession.close();System.out.println("I'm Client && I closed!");}@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {// TODO Auto-generated method stubPlayerAccount_Entity ho = (PlayerAccount_Entity) message;System.out.println("Client message="+ho.getId()+ho.getName()+ho.getEmailAdress()+ho.getSex()); // session.write(ho);}}
3、HCoderFactory
package com.potter;import java.nio.charset.Charset;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFactory;import org.apache.mina.filter.codec.ProtocolDecoder;import org.apache.mina.filter.codec.ProtocolEncoder;public class HCoderFactory implements ProtocolCodecFactory { private final HEncoder encoder; private final HDecoder decoder; public HCoderFactory() {this(Charset.defaultCharset()); } public HCoderFactory(Charset charSet) { this.encoder = new HEncoder(charSet); this.decoder = new HDecoder(charSet); }@Overridepublic ProtocolDecoder getDecoder(IoSession arg0) throws Exception {// TODO Auto-generated method stubreturn decoder;}@Overridepublic ProtocolEncoder getEncoder(IoSession arg0) throws Exception {// TODO Auto-generated method stubreturn encoder;} }
4、HEncoder
package com.potter;import java.nio.charset.Charset;import java.nio.charset.CharsetEncoder;import org.apache.mina.core.buffer.IoBuffer;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolEncoder;import org.apache.mina.filter.codec.ProtocolEncoderOutput;public class HEncoder implements ProtocolEncoder{private final Charset charset;public HEncoder(Charset charset) {this.charset = charset;}@Overridepublic void encode(IoSession session, Object message,ProtocolEncoderOutput out) throws Exception {CharsetEncoder ce = charset.newEncoder();PlayerAccount_Entity paEntity = (PlayerAccount_Entity) message;IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true);buffer.putInt(paEntity.getId());buffer.putString(paEntity.getName(), ce);buffer.putString(paEntity.getEmailAdress(), ce);buffer.putInt(paEntity.getSex());buffer.flip();out.write(buffer);}@Overridepublic void dispose(IoSession session) throws Exception {// TODO Auto-generated method stub}}
5、HDecoder
package com.potter;import java.nio.charset.Charset;import java.nio.charset.CharsetDecoder;import org.apache.mina.core.buffer.IoBuffer;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.CumulativeProtocolDecoder;import org.apache.mina.filter.codec.ProtocolDecoderOutput;public class HDecoder extends CumulativeProtocolDecoder {private final Charset charset;public HDecoder(Charset charset) {this.charset = charset;}@Overrideprotected boolean doDecode(IoSession arg0, IoBuffer message,ProtocolDecoderOutput arg2) throws Exception {CharsetDecoder cd = charset.newDecoder();int id=0;if(message.remaining()>=4){id=message.getInt();}String name = message.getString(cd);String emailAdress=message.getString(cd);int sex=0;if(message.remaining()>=4){sex=message.getInt();}PlayerAccount_Entity paEntity = new PlayerAccount_Entity(id,name,emailAdress,sex);arg2.write(paEntity);return true;}}
6、PlayerAccount_Entity
package com.potter;public class PlayerAccount_Entity{private int id; private String name; private String emailAdress; private int sex;// 0=man 1=womanpublic PlayerAccount_Entity(int id,String name,String emailAdress,int sex){this.id=id;this.name=name;this.emailAdress=emailAdress;this.sex=sex;} public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmailAdress() {return emailAdress;}public void setEmailAdress(String emailAdress) {this.emailAdress = emailAdress;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}}
二、Client
1、MinaClient
package com.potter;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.transport.socket.nio.NioSocketConnector;public class MinaClient {private static final int bindPort=8899;public static void main(String[] args){// 建立一個socket串連 NioSocketConnector connector=new NioSocketConnector();// 擷取過濾器鏈 DefaultIoFilterChainBuilder chain=connector.getFilterChain();ProtocolCodecFilter filter= new ProtocolCodecFilter(new HCoderFactory(Charset.forName("UTF-8"))); // 添加編碼過濾器 處理亂碼、編碼問題 chain.addLast("objectFilter",filter);// 訊息核心處理器 connector.setHandler(new MinaClientHanlder());// 設定連結逾時時間 connector.setConnectTimeoutCheckInterval(30);// 串連伺服器,知道連接埠、地址 ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",bindPort));// 等待串連建立完成 cf.awaitUninterruptibly();cf.getSession().getCloseFuture().awaitUninterruptibly();connector.dispose();}}
2、MinaClientHanlder
package com.potter;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;public class MinaClientHanlder extends IoHandlerAdapter{public void sessionOpened(IoSession session) throws Exception { PlayerAccount_Entity ho = new PlayerAccount_Entity(10,"Potter","potter@qq.com",0); session.write(ho); }@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {PlayerAccount_Entity ho = (PlayerAccount_Entity) message; System.out.println("Server Say:name:" + ho.getName());}@Overridepublic void sessionClosed(IoSession session) throws Exception {// TODO Auto-generated method stubsession.close();}}
好了,共同的就不穿了....