MINA(3)------用手机通讯APP与MINA服务器进行简单通讯代码

风格不统一 提交于 2020-01-08 15:22:50

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

服务器端主程序及IoHandler业务程序:

public class MinaServer {
    static int PORT=7080;
    //Mina三个主要的部分之一是IoService,其中服务器端实现IoService的是IoAcceptor,客户端实现IoService的是IoConnector
    //IoAcceptor和IoConnector都分别有实现TCP/IP,UDP/IP及虚拟机管道通讯的子接口
    static IoAcceptor accept = null;
//    AbstractIoService 是IoService接口的适配层,是一个abstact class
//    AbstractIoAcceptor 也是一个适配器,是一个 abstactr class ,只不过是继承自AbstarctIoService
//    IoHandler是mina的三个主要部分之一,这主要定义了session相关的接口(create,open,status,idle),异常(exceptionCaught)及数据发送和接收接口(messageReceive,messageSend)
//    IoHandlerAdapter是一个适配器,也是一个abstract class ,实现了IoHandler的接口
   public static void main(String[] args)
   {
       try
       {
            accept = new NioSocketAcceptor();
            //设置过滤器
            accept.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())));
            //设置缓冲区
           accept.getSessionConfig().setReadBufferSize(1024);
           accept.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10); //10s
           accept.setHandler(new MyHandler());//业务
           accept.bind(new InetSocketAddress(PORT));
           System.out.println("server->"+PORT);
           //Mina主要在个部分分别是:
           //1:IoService:执行实际的IO操作,管理IO会话
           //2:IoFilter Chain 将数据进行过滤或者转化为期望的数据结构,反之变然
           //3:IoHandler 实际的业务操作
       }
       catch(Exception e)
       {
            e.printStackTrace();
       }
   }
}

 

 

public class MyHandler extends IoHandlerAdapter {
    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
        System.out.println("exceptionCaught:" + "连接出现异常");
    }

    @Override
    public void messageReceived(IoSession session, Object message)
            throws Exception {
        String msg = (String)message;
        System.out.println("服务端接收到数据:" + msg);
        Date date = new Date();
        session.write(date); // 用于写入数据并发送
    }

    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        System.out.println("messageSent:" + "发送数据");
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("sessionClosed:" + "session关闭");
    }

    @Override
    public void sessionCreated(IoSession session) throws Exception {
        System.out.println("sessionCreated:" + "创建Session");
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status)
            throws Exception {
        System.out.println("sessionIdle:" + "处于多长时间是空闲状态");
    }

    @Override
    public void sessionOpened(IoSession session) throws Exception {
        System.out.println("sessionOpened:" + "打开Session用于读写数据");
    }
}

然后idea中编译程序,发现提示如下错误信息:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/joe/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/joe/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.1/log4j-slf4j-impl-2.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

可以先不管它,直接进行实验,具体解决多slf冲突的办法参考:http://www.slf4j.org/codes.html#multiple_bindings

用手机给服务器电脑发现消息,手机上能够收到服务器返回的数据,并且服务器上出现如下界面:

server->7080
sessionCreated:创建Session
sessionOpened:打开Session用于读写数据
sessionIdle:处于多长时间是空闲状态
15:16:20.436 [NioProcessor-2] DEBUG org.apache.mina.filter.codec.ProtocolCodecFilter - Processing a MESSAGE_RECEIVED for session 1
sessionIdle:处于多长时间是空闲状态
15:16:37.633 [NioProcessor-2] DEBUG org.apache.mina.filter.codec.ProtocolCodecFilter - Processing a MESSAGE_RECEIVED for session 1
 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!