Mina用戶端Client和Server對象傳輸demo

來源:互聯網
上載者:User

最基本的那個例子,也就是官網上的那個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();}}

好了,共同的就不穿了....

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.