java mina的使用

这是mina需要的jar包

    // 创建一个非阻塞的Server端socket,用NIO
    IoAcceptor acceptor = new NioSocketAcceptor();
    // 创建接受数据的过滤器, 处理最简单的字符串传输,Mina 已经为我们提供了TextLineCodecFactory
    // 编解码器工厂来对字符串进行编解码处理。
    acceptor.getFilterChain().addLast("logger", new LoggingFilter());
    // 设定这个过滤器将一行一行的读取数据
        acceptor.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));
            // 然后我们把这个IoHandler 注册到IoService:
            acceptor.setHandler(new TimeServerHandler());
            // 设置读取数据的缓冲区大小
            acceptor.getSessionConfig().setReadBufferSize(2048);
            // 设置10没有消息就进入限制状态
            acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
            // 绑定端口号
            acceptor.bind(new InetSocketAddress(PORT));

我们可以使用自己的解码工厂

public class SocketCodecFactory implements ProtocolCodecFactory {

    private final SocketDecode decoder;

    private final SocketEncode encoder;

    public SocketCodecFactory() {
        decoder = new SocketDecode();
        encoder = new SocketEncode();
    }

    @Override
    public ProtocolDecoder getDecoder(IoSession session) throws Exception {
        return decoder;
    }

    @Override
    public ProtocolEncoder getEncoder(IoSession session) throws Exception {
        return encoder;
    }

}
public class SocketDecode implements ProtocolDecoder {

    @Override
    public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
        Room room = new Room();
        // protobuf序列化
        // FirstProtobuf.testBuf.Builder builder =
        // FirstProtobuf.testBuf.newBuilder();
        // builder.setID(777);
        // builder.setUrl("shiqi");
        // FirstProtobuf.testBuf info = builder.build();
        // 转为数组可以传递
        // byte[] result = info.toByteArray();
        // 这里讲result传给客户端
        // protobuf反序列化得到数据
        UtilsProtobuf.roomBuf buf = UtilsProtobuf.roomBuf.parseFrom(in.array());
        PlayerProtobuf.roomBuf playerBuf = PlayerProtobuf.roomBuf.parseFrom(in.array());
        String bufid = buf.getID() + "";
        // 创建房间
        if (bufid.equals("1")) {
            room.oncreate();
            session.write(in.array());
        }
        // 玩家进入房间
        if (bufid.equals("2")) {
            room.enter(new Player(playerBuf.getID(), playerBuf.getName(), playerBuf.getHeadUrl(), playerBuf.getGender(),
                    playerBuf.getScore(), playerBuf.getReadly()));
            session.write(in.array());
        }
        // 玩家准备或取消准备
        if (bufid.equals("3")) {
            room.getPlayerState(new Player(playerBuf.getID(), playerBuf.getName(), playerBuf.getHeadUrl(),
                    playerBuf.getGender(), playerBuf.getScore(), playerBuf.getReadly()));
            session.write(in.array());
        }
        if (bufid.equals("4")) {
            room.begin();
            session.write(in.array());
        }

    }

    @Override
    public void dispose(IoSession session) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception {
        // TODO Auto-generated method stub

    }

}

decode中得到客户端传来的消息然后进行处理 ,此处使用了protobuf传递数据
然后是回复消息了

public class SocketEncode implements ProtocolEncoder {

    @Override
    public void dispose(IoSession arg0) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void encode(IoSession arg0, Object arg1, ProtocolEncoderOutput out) throws Exception {


        out.write(arg1);


    }

}
out.write(arg1); 是服务端向客户端返回数据

通讯的操作都通过IoSession来进行操作,mina封装了方法

public class TimeServerHandler implements IoHandler {

    @Override
    public void exceptionCaught(IoSession arg0, Throwable arg1) throws Exception {
        arg1.printStackTrace();

    }

    @SuppressWarnings("deprecation")
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {

        String str = message.toString();
        if (str.trim().equalsIgnoreCase("quit")) {
            session.close(true);
            return;
        }
        Date date = new Date();
        session.write(date.toString());
        System.out.println("Message written...");
    }

    @Override
    public void messageSent(IoSession arg0, Object arg1) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("发送信息:" + arg1.toString());
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("IP:" + session.getRemoteAddress().toString() + "断开连接");
    }

    // 当一个新的客户端链接之后触发此方法
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("IP:" + session.getRemoteAddress().toString());
    }

    // 当连接空闲时触发此方法.
    @Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("IDLE " + session.getIdleCount(status));

    }

    @Override
    public void sessionOpened(IoSession arg0) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void inputClosed(IoSession arg0) throws Exception {
        // TODO Auto-generated method stub

    }

}
这样就简单的完成了mina服务端的使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值