用的是MINA2.0 M1版本,我现在是想把客户端的IoSessio.setAttribute("name","value")这个属性传递到服务端去,也就是要在服务端用IoSession.getAttribute("name");取到value值。现在的情况是获取不到,为null。请问各位知道的兄弟姐妹们。

解决方案 »

  1.   

    //服务端代码
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.charset.Charset;import org.apache.mina.common.IdleStatus;
    import org.apache.mina.common.IoAcceptor;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.LineDelimiter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
    import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class MyServer { public static void main(String args[]){
    //IoService
    IoAcceptor acceptor = new NioSocketAcceptor(10);
    //IoSessionConfig
    acceptor.getSessionConfig().setReadBufferSize(2048);
    acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);

    //过滤器IoFilter
    acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(
    new TextLineCodecFactory(Charset.forName("UTF-8"),
    LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue()))
    );
    //acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));     
    acceptor.setHandler(new MyIoHandler());//业务逻辑
    try {
    acceptor.bind(new InetSocketAddress(9123));//非阻塞nio
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }//服务端处理类代码
    import org.apache.mina.common.IoHandlerAdapter;
    import org.apache.mina.common.IoSession;public class MyIoHandler extends IoHandlerAdapter{

    public void sessionCreated(IoSession session){
     System.out.println("服务端::::::sessionCreated:::::::"+session.getService().getManagedSessionCount());
    }

    /**
     * 这个方法在连接被打开时调用,它总是在sessionCreated()方法之后被调用。对于TCP 来
     * 说,它是在连接被建立之后调用,你可以在这里执行一些认证操作、发送数据等。
     */
    public void sessionOpened(IoSession session) {
    System.out.println("服务端:::::sessionOpened:::::::");

    }

    public void messageReceived(IoSession session,Object message){
    //IoService ioservice = session.getService();
    System.out.println("count:::::"+session.getAttribute("name"));
    String str = message.toString();
    System.out.println("The Message receiced is ["+str+"]"+"    sessionName::"+session.getAttribute("name"));
    if(str.endsWith("quit")){
    session.close();
    return;
    }
    }

    }
    //客户端代码
    import java.net.InetSocketAddress;
    import java.nio.charset.Charset;import org.apache.mina.common.ConnectFuture;
    import org.apache.mina.common.IoConnector;
    import org.apache.mina.common.IoSession;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.LineDelimiter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
    import org.apache.mina.filter.logging.LogLevel;
    import org.apache.mina.filter.logging.LoggingFilter;
    import org.apache.mina.transport.socket.nio.NioSocketConnector;public class MyClient { public static void main(String [] args){

    IoConnector connector = new NioSocketConnector();
    connector.setConnectTimeout(30);
    LoggingFilter lf = new LoggingFilter();
    lf.setMessageSentLogLevel(LogLevel.INFO);
    connector.getFilterChain().addLast("logger", lf);
    connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(
    new TextLineCodecFactory(Charset.forName("UTF-8"),
    LineDelimiter.WINDOWS.getValue(),
    LineDelimiter.WINDOWS.getValue()))
    );
    connector.setHandler(new ClientIoHandler("你好!\r\n 大家好!"));
    ConnectFuture cf = connector.connect(new InetSocketAddress("192.168.1.107",9123));
    cf.awaitUninterruptibly(); // Wait until the connection attempt is finished.
    IoSession session = cf.getSession();
    session.setAttribute("name", "value");
    for(int i=0;i<1000;i++){
    if(session.isClosing()){
    cf.cancel();
    connector.dispose();
    session = null;
    break;
    }else{
    session.write("   "+System.currentTimeMillis());
    try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
    }//客户端处理类代码
    package sample;import org.apache.mina.common.IdleStatus;
    import org.apache.mina.common.IoHandlerAdapter;
    import org.apache.mina.common.IoSession;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;public class ClientIoHandler extends IoHandlerAdapter{
    private final static Logger LOGGER = LoggerFactory.getLogger(ClientIoHandler.class);
    private final String values;
    public ClientIoHandler(String values) {
    this.values = values;
    }

    /**
     * 这个方法当一个Session 对象被创建的时候被调用。对于TCP 连接来说,连接被接受的时候
     * 调用,但要注意此时TCP 连接并未建立,此方法仅代表字面含义,也就是连接的对象
     * IoSession 被创建完毕的时候,回调这个方法。
     * 对于UDP 来说,当有数据包收到的时候回调这个方法,因为UDP 是无连接的。
     */
    public void sessionCreated(IoSession session){
     System.out.println("客户端::::sessionCreated:::::::"+session.getService().getManagedSessionCount());
    // session.setAttribute("name", "client"+session.getId());
    }

    /**
     * 这个方法在连接被打开时调用,它总是在sessionCreated()方法之后被调用。对于TCP 来
     * 说,它是在连接被建立之后调用,你可以在这里执行一些认证操作、发送数据等。
     */
    public void sessionOpened(IoSession session) {
    System.out.println("客户端::::sessionOpened:::::::");

    } /**
     * 这个方法在IoSession 的通道进入空闲状态时调用,对于UDP 协议来说,这个方法始终不会
     * 被调用。
     */
    public void sessionIdle(IoSession session, IdleStatus status){
    System.out.println("sessionIdle:::::::::::::");
    }

    /**
     * 这个方法在你的程序、Mina 自身出现异常时回调,一般这里是关闭IoSession。
     */
    public void exceptionCaught(IoSession session, Throwable cause){

    }

    /**
     * 接收到消息时调用的方法,也就是用于接收消息的方法,一般情况下,message 是一个
     * IoBuffer 类,如果你使用了协议编解码器,那么可以强制转换为你需要的类型。
     */
    public void messageReceived(IoSession session ,Object message){
    System.out.println(message);
    }

    /**
     * 当发送消息成功时调用这个方法,注意这里的措辞,发送成功之后,
     * 也就是说发送消息是不能用这个方法的。
     */
    public void messageSent(IoSession session, Object message){
    System.out.println("sent:::::::::::::"+System.currentTimeMillis());

    }

    /**
     * 对于TCP 来说,连接被关闭时,调用这个方法。
     * 对于UDP 来说,IoSession 的close()方法被调用时才会毁掉这个方法。
     */
    public void sessionClosed(IoSession session){
    System.out.println("Closed:::::::::::::;");

    }

    }